如何更有效地获取SQL结果

时间:2019-01-30 13:51:46

标签: sql select count db2 where

我在DB2数据库中的SQL查询有问题。我必须根据第二张表中通过某些字段连接的记录数来从一张表中获取记录。我的查询工作非常非常非常慢。我一直在尝试找到一种更有效的方法,甚至使用内部联接,但仍然是相同的。

SELECT * FROM table1

WHERE

    table1.field1 = '9' AND
    table1.field2 <= CURRENT DATE - 1 YEAR AND
    (
    SELECT COUNT(*) FROM table2
    WHERE 
        table2.field1 = '0' AND
        table1.field3 = table2.field2 AND
        table1.field4 = table2.field3 AND
                table1.field5 = table2.field4 AND
        table1.field6 = table2.field5 AND
        table1.field7 = table2.field6 
    ) = 0
WITH UR

2 个答案:

答案 0 :(得分:1)

我会尝试的第一次尝试:

SELECT * FROM table1
WHERE
  table1.field1 = '9' AND
  table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS
(
   SELECT 1 FROM table2
   WHERE 
    table2.field1 = '0' AND
    table1.field3 = table2.field2 AND
    table1.field4 = table2.field3 AND
            table1.field5 = table2.field4 AND
    table1.field6 = table2.field5 AND
    table1.field7 = table2.field6 
)
WITH UR

尽管没有模式,数据和执行计划也无法进行预测

答案 1 :(得分:1)

我认为这可能更好。首先,将查询更改为使用NOT EXISTS

SELECT *
FROM table1
WHERE table1.field1 = '9' AND  -- do not use single quotes if field1 is a number!
      table1.field2 <= CURRENT DATE - 1 YEAR AND
      NOT EXISTS (SELECT 1
                  FROM table2
                  WHERE table2.field1 = '0' AND
                        table1.field3 = table2.field2 AND
                        table1.field4 = table2.field3 AND
                        table1.field5 = table2.field4 AND 
                        table1.field6 = table2.field5 AND
                        table1.field7 = table2.field6 
                  ) ;

第二,确保比较使用正确的类型'9'9'0'还是0

第三,添加索引:

  • table1(field1, field2)
  • table2(field2, field3, field4, field5, field6, field1)

table2索引的前五个字段的顺序是任意的;但是,field1应该紧随其后。