LEFT JOIN 正在扼杀我的查询 - 如何加快速度?
Posted
技术标签:
【中文标题】LEFT JOIN 正在扼杀我的查询 - 如何加快速度?【英文标题】:LEFT JOIN is killing my query - how to speed up? 【发布时间】:2021-02-26 14:27:15 【问题描述】:我有两张桌子:
当某事被记录为“完成”时在我们的系统中创建的文件列表(报价和发票)。
BELEG_ART | BELEG_NR | DATUM | BELEG_TYPE |
---|---|---|---|
160 | 337691 | 11.01.2021 | Invoice |
10 | 195475 | 04.01.2021 | Offer |
20 | 195444 | 04.01.2021 | Confirmation |
包含文章信息和文档信息的交易(销售等)列表
ANUMMER | KDNR | NAME1 | REC_LIST |
---|---|---|---|
181557 | 59301205 | Fred | 332240 |
195973 | 59306391 | John | 338225 |
189661 | 59304599 | Steve | 335495 |
189718 | 49302475 | Ed | |
196483 | 59303491 | Mark | 338204 |
190021 | 49302595 | Jones |
您可以看到要约和确认...它们以“1”开头。带有“3”的发票。
我需要用 ANUMMER 和“1”链接和标识所有内容。稍后我会根据这个数字拉其他表,这对我来说是关键点。
问题是 - 在文档表中,当您看到发票时,您看不到 ANUMMER。你只看到“3”。
所以,我创建了一个如下的连接来将所有内容组合在一起。
SELECT
DAB700.BELEG_ART,DAB700.BELEG_NR,DAB700.DATUM,DAB700.BUCH_DATUM,
case // rename the documents to something more meaningful
when DAB700.BELEG_ART = 10 then 'Angebote'
when DAB700.BELEG_ART = 20 then 'Auftrag'
when DAB700.BELEG_ART = 60 then 'Lieferschein'
when DAB700.BELEG_ART = 160 then 'Rechnung'
else 'not defined'
end as "BELEG_TYPE",
DAB050.ANUMMER,
case // if the document is an offer, then copy it to order_number. If it's a invoice, copy that number to order_number.
when DAB700.BELEG_ART = 10 then DAB700.BELEG_NR
when DAB700.BELEG_ART = 160 then DAB050.ANUMMER
else 'NA'
end as "order_number"
FROM "DAB700.ADT" DAB700
// if the document is an invoice, then join to the table DAB050 and reference the same key field REC_LIST.
left join "DAB050.ADT" DAB050 on
Case
When DAB700.BELEG_ART = 160 then DAB700.BELEG_NR = DAB050.REC_LIST
End
WHERE (DAB700.DATUM=d '2021-01-12')
所以 - 对于我的问题和疑问:运行此连接查询时,它比我想要的要慢得多(即使是小数据集)。有没有办法重组它,所以它更快?
长话短说 - 简化:
我想在表 1 中添加一些列 当表 1-BELEG_NR 以“1”开头时,很好 - 只需将数字移到新列中 当表 1-BELEG_NR 以“3”开头时,我必须链接到表 3,并拉入 ANUMMER感谢您的帮助
【问题讨论】:
如果将连接条件修复为... on Case When DAB700.BELEG_ART = 160 then DAB700.BELEG_NR End = DAB050.REC_LIST
,有什么改善吗?
不是真的......但感谢您的尝试!
【参考方案1】:
问题在于连接条件不可优化,因为 1. 它是一个复杂的表达式,以及 2. 它涉及 memo/clob 列(REC_LIST 可能是基于您的其他问题的备忘录)。这意味着必须为 DAB700 和 DAB050 中的每个行组合评估联合条件。
在我看来,连接条件可以简化为:
DAB700.BELEG_ART = 160 和 DAB700.BELEG_NR = DAB050.REC_LIST
不需要 Case,因为默认 case 为 null 或 false。这将减少 DAB700 中参与连接的行数。但是,如果 REC_LIST 是 MEMO 或 CLOB 数据类型,则连接的第二部分仍然不是最佳的。
无论如何,我还建议检查一下 REC_LIST 是否应该是一个固定长度的字符串列(CHAR、NCHAR、VARCHAR 或 NVARCHAR),而不是 MEMO,因为 MEMO 不能被索引,因此对优化没有用处。
【讨论】:
感谢亚历克斯。我在这里做了唯一理智的事情,并删除了对 REC_LIST 的整个查找。我们将以另一种方式获取数据,避免此处出现额外的减速。以上是关于LEFT JOIN 正在扼杀我的查询 - 如何加快速度?的主要内容,如果未能解决你的问题,请参考以下文章