EFCore默认的索引类型和PostgreSQL GIN索引优化示例
基础数据准备
考虑我们有一张物料表和库存表。
CREATE TABLE IF NOT EXISTS public.mm_material
(
"Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
"Code" character varying(64) COLLATE pg_catalog."default" NOT NULL,
"ShortName" character varying(256) COLLATE pg_catalog."default" NOT NULL,
"Specification" character varying(50) COLLATE pg_catalog."default" NOT NULL,
"Status" integer NOT NULL,
"MeasureUnitId" integer NOT NULL,
CONSTRAINT "PK_mm_material" PRIMARY KEY ("Id"),
CONSTRAINT "AK_mm_material_Code" UNIQUE ("Code"),
CONSTRAINT "FK_mm_material_mm_material_measureunit_MeasureUnitId" FOREIGN KEY ("MeasureUnitId")
REFERENCES public.mm_material_measureunit ("Id") MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
)
-- 索引略
;
CREATE TABLE IF NOT EXISTS public.mm_inventory
(
"Id" uuid NOT NULL,
"IsLocked" boolean NOT NULL,
"Locker" text COLLATE pg_catalog."default" NOT NULL,
"WarehouseId" integer NOT NULL,
"Slot" text COLLATE pg_catalog."default" NOT NULL,
"Scope" text COLLATE pg_catalog."default" NOT NULL,
"MaterialCode" text COLLATE pg_catalog."default" NOT NULL,
"MaterialId" integer NOT NULL,
"Batch" text COLLATE pg_catalog."default" NOT NULL,
"ExternalCode" text COLLATE pg_catalog."default" NOT NULL,
"Amount" numeric NOT NULL,
"StockKind" integer NOT NULL,
"Note" text COLLATE pg_catalog."default",
"ProducedAt" timestamp with time zone,
"ExpiredAt" timestamp with time zone NOT NULL,
"CreatedAt" timestamp with time zone NOT NULL,
CONSTRAINT "PK_mm_inventory" PRIMARY KEY ("Id"),
CONSTRAINT "FK_mm_inventory_mm_material_MaterialId" FOREIGN KEY ("MaterialId")
REFERENCES public.mm_material ("Id") MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE,
CONSTRAINT "FK_mm_inventory_mm_warehouse_WarehouseId" FOREIGN KEY ("WarehouseId")
REFERENCES public.mm_warehouse ("Id") MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
)
-- 索引略
;
为了测试,我们向这张物料单表中插入大概10万条测试数据: