SQL Db2 中的左连接而不是不存在
Left Join instead of Not Exists in SQL Db2
由于性能不佳,我目前正在修改我的 SQL 查询。
因此查询会检查 table A 和 B,并报告 table B 是否缺少某些内容。
目前我正在使用“不存在的地方”的解决方案,这导致必须完全选择两个 table。这导致性能不佳
SELECT A.DBNAME,
A.TSNAME,
VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A WHERE NOT EXISTS
(SELECT B.DBNAME
,B.TSNAME
,B.LOGICAL_PART
,B.ICDATE
,B.ICTYPE
FROM DUMMY.TABLETWO B
WHERE B.DBNAME = A.DBNAME AND B.TSNAME = A.TSNAME
AND A.PARTITION = B.LOGICAL_PART
AND B.ICTYPE = 'F'
AND B.ICDATE > CURRENT DATE - 7 DAYS);
这个查询给了我正确的结果集,但是性能很差。
我试着重新写成左加入:
SELECT A.DBNAME,
A.TSNAME,
VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A
LEFT JOIN
DUMMY.TABLETWO B
ON A.DBNAME = B.DBNAME AND
A.TSNAME = B.TSNAME AND
A.PARTITION = B.LOGICAL_PART
WHERE B.DBNAME IS NULL
OR (A.DBNAME = B.DBNAME AND
A.TSNAME = B.TSNAME AND
A.PARTITION = B.LOGICAL_PART AND
B.ICDATE > CURRENT DATE - 7 DAYS);
但是由于 table B 上的条目没有被删除,我得到的结果太多了。
我只想检索 table A 上的条目,而在 table B 上最近 7 天内没有相应的条目。
必须保留旧条目,否则我将实施内务管理解决方案。
提前感谢您的帮助
您可以考虑将 TABLETWO
table 索引如下:
CREATE INDEX tt_idx ON DUMMY.TABLETWO (DBNAME, TSNAME, LOGICAL_PART, ICTYPE, ICDATE);
对于 TABLEONE
table 中的每条记录,这应该可以让现有逻辑执行得更快。此外,您可以简化现有语法,如下所示:
SELECT A.DBNAME, A.TSNAME, VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A
WHERE NOT EXISTS (
SELECT 1
FROM DUMMY.TABLETWO B
WHERE B.DBNAME = A.DBNAME AND
B.TSNAME = A.TSNAME AND
A.PARTITION = B.LOGICAL_PART AND
B.ICTYPE = 'F' AND
B.ICDATE > CURRENT DATE - 7 DAYS
);
由于性能不佳,我目前正在修改我的 SQL 查询。
因此查询会检查 table A 和 B,并报告 table B 是否缺少某些内容。 目前我正在使用“不存在的地方”的解决方案,这导致必须完全选择两个 table。这导致性能不佳
SELECT A.DBNAME,
A.TSNAME,
VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A WHERE NOT EXISTS
(SELECT B.DBNAME
,B.TSNAME
,B.LOGICAL_PART
,B.ICDATE
,B.ICTYPE
FROM DUMMY.TABLETWO B
WHERE B.DBNAME = A.DBNAME AND B.TSNAME = A.TSNAME
AND A.PARTITION = B.LOGICAL_PART
AND B.ICTYPE = 'F'
AND B.ICDATE > CURRENT DATE - 7 DAYS);
这个查询给了我正确的结果集,但是性能很差。
我试着重新写成左加入:
SELECT A.DBNAME,
A.TSNAME,
VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A
LEFT JOIN
DUMMY.TABLETWO B
ON A.DBNAME = B.DBNAME AND
A.TSNAME = B.TSNAME AND
A.PARTITION = B.LOGICAL_PART
WHERE B.DBNAME IS NULL
OR (A.DBNAME = B.DBNAME AND
A.TSNAME = B.TSNAME AND
A.PARTITION = B.LOGICAL_PART AND
B.ICDATE > CURRENT DATE - 7 DAYS);
但是由于 table B 上的条目没有被删除,我得到的结果太多了。 我只想检索 table A 上的条目,而在 table B 上最近 7 天内没有相应的条目。 必须保留旧条目,否则我将实施内务管理解决方案。
提前感谢您的帮助
您可以考虑将 TABLETWO
table 索引如下:
CREATE INDEX tt_idx ON DUMMY.TABLETWO (DBNAME, TSNAME, LOGICAL_PART, ICTYPE, ICDATE);
对于 TABLEONE
table 中的每条记录,这应该可以让现有逻辑执行得更快。此外,您可以简化现有语法,如下所示:
SELECT A.DBNAME, A.TSNAME, VARCHAR(A.PARTITION)
FROM DUMMY.TABLEONE A
WHERE NOT EXISTS (
SELECT 1
FROM DUMMY.TABLETWO B
WHERE B.DBNAME = A.DBNAME AND
B.TSNAME = A.TSNAME AND
A.PARTITION = B.LOGICAL_PART AND
B.ICTYPE = 'F' AND
B.ICDATE > CURRENT DATE - 7 DAYS
);