Postgresql 使用3个INs在表中为查询索引什么?

Postgresql 使用3个INs在表中为查询索引什么?,postgresql,indexing,Postgresql,Indexing,我在中使用了3,在中使用了1而不是在中使用了这个Postgres查询。你能建议这里应该索引哪些列吗 DELETE FROM myschema.sla WHERE pxinsname NOT IN ( SELECT pxinsname FROM myschema.sla WHERE ( pxinsname IN

我在中使用了3
,在
中使用了1
而不是在
中使用了这个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) )  )

我认为你应该首先简化你的问题。特别是可以省略子选择

在不知道模式和数据量的情况下,很难说出任何关于适当索引的信息。我会尝试在
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
的情况下使用此查询来测试我的简化查询是否删除了您要删除的元素。

您好,您给出的查询返回的结果与原始查询的结果不一样。但是,您也可以尝试索引和
EXPLAIN ANALYZE
。您还应该尝试删除外部子查询,以检索更好的perormance。
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)
);