我有使用3 IN
和1 NOT IN
的Postgres查询。您能建议在这里为哪些列建立索引吗?
DELETE
FROM myschema.sla
WHERE pxinsname NOT IN
(
SELECT pxinsname
FROM myschema.sla
WHERE (
pxinsname IN
(
SELECT pxrefqueuekey
FROM myschema.t1) )
OR (
pxinsname IN
(
SELECT pxrefqueuekey
FROM myschema.t2) )
OR (
pxinsname IN
(
SELECT pxrefqueuekey
FROM myschema.t3) ) )
答案 0 :(得分:0)
我认为您应该首先简化查询。尤其是可能会省略子选择。
在不了解架构和数据量的情况下,很难说出适当的索引。我会尝试在pxrefqueuekey
上为表t1
至t3
的索引,例如:
CREATE INDEX t1_pxrefqueuekey_idx ON myschema.t1(pxrefqueuekey);
CREATE INDEX t2_pxrefqueuekey_idx ON myschema.t2(pxrefqueuekey);
CREATE INDEX t3_pxrefqueuekey_idx ON myschema.t3(pxrefqueuekey);
使用
EXPLAIN ANALYZE SELECT * FROM myschema.sla WHERE pxinsname NOT IN
(
SELECT pxinsname
FROM myschema.sla
WHERE (
pxinsname IN (SELECT pxrefqueuekey FROM myschema.t1) OR
pxinsname IN (SELECT pxrefqueuekey FROM myschema.t2) OR
pxinsname IN (SELECT pxrefqueuekey FROM myschema.t3)
);
您可以查看索引是否正常工作。您也可以使用不带EXPLAIN ANALYZE
的查询来测试简化查询是否删除了要删除的元素。