对于使用3个IN的查询,如何在表中建立索引?

时间:2018-08-29 23:53:33

标签: postgresql indexing

我有使用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) )  )

1 个答案:

答案 0 :(得分:0)

我认为您应该首先简化查询。尤其是可能会省略子选择。

在不了解架构和数据量的情况下,很难说出适当的索引。我会尝试在pxrefqueuekey上为表t1t3的索引,例如:

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的查询来测试简化查询是否删除了要删除的元素。