如何更有效地获得 SQL 结果

How to get SQL result more efficiently

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

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

第一次尝试:

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

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

我认为这可能会更好。首先,将查询更改为使用 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 应该紧随其后。