sim*_*imo 6 postgresql performance array
我们有一张桌子
id|school_id|parent_ids
Run Code Online (Sandbox Code Playgroud)
其中parent_ids是 id 数组。
如果我们没有school_idand onlyparent_id来搜索,那么查询将搜索数组中的所有表行parent_ids,可能有数千行,并且parent_id实际上可能只在其中的几行中。
在这种情况下,在查询数组列时使用 IN 是否会成为性能障碍?
编辑
这是表结构的转储:
-- ----------------------------
-- Table structure for schools_messages
-- ----------------------------
DROP TABLE IF EXISTS "public"."schools_messages";
CREATE TABLE "public"."schools_messages" (
"id" int4 NOT NULL DEFAULT nextval('schools_messages_id_seq'::regclass),
"message" jsonb NOT NULL DEFAULT '[]'::jsonb,
"details" jsonb NOT NULL DEFAULT '[]'::jsonb,
"school_id" int4 NOT NULL,
"created_at" timestamp(0),
"updated_at" timestamp(0),
"parents_ids" int4[] DEFAULT ARRAY[]::integer[]
)
;
ALTER TABLE "public"."schools_messages" OWNER TO "prod_schools";
-- ----------------------------
-- Primary Key structure for table schools_messages
-- ----------------------------
ALTER TABLE "public"."schools_messages" ADD CONSTRAINT "schools_messages_pkey" PRIMARY KEY ("id");
-- ----------------------------
-- Foreign Keys structure for table schools_messages
-- ----------------------------
ALTER TABLE "public"."schools_messages" ADD CONSTRAINT "schools_messages_school_id_foreign" FOREIGN KEY ("school_id") REFERENCES "public"."trk_schools" ("id") ON DELETE CASCADE ON UPDATE NO ACTION;
Run Code Online (Sandbox Code Playgroud)
我同意杰克的观点,你的模式需要帮助。但你仍然可以这样做。在这里,我们使用两个核心扩展通过一个索引查找来完成此intarray操作btree_gist
CREATE EXTENSION intarray;
CREATE EXTENSION btree_gist;
CREATE INDEX ON public.schools_messages
USING gist(school_id, parents_ids gist__int_ops);
VACUUM ANALYZE public.schools_messages;
SELECT *
FROM public.schools_messages
WHERE school_id = 42
OR parent_id @> ARRAY[42];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7756 次 |
| 最近记录: |