如何更有效地获得 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
应该紧随其后。
我在 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
应该紧随其后。