问题描述
我有两张桌子:
-
当某件事被记录为“完成”时,我们系统中创建的文档列表(报价和发票)。
BELEG_ART BELEG_NR 基准 BELEG_TYPE 160 337691 11.01.2021 发票 10 195475 04.01.2021 优惠 20 195444 04.01.2021 确认 -
包含文章信息和文档信息的交易(销售等)列表
ANUMMER KDNR NAME1 REC_LIST 181557 59301205 弗雷德 332240 195973 59306391 约翰 338225 189661 59304599 史蒂夫 335495 189718 49302475 编辑 196483 59303491 标记 338204 190021 49302595 琼斯
您可以看到要约和确认...它们以“1”开头。带有“3”的发票。
我需要通过带有“1”的 ANUMMER 链接和标识所有内容。稍后我会根据这个数字拉其他表,因此这对我来说是关键点。
问题是 - 在文档表中,当您看到发票时,您看不到 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. 它是一个复杂的表达式,并且 2. 它涉及备忘录/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,因为它不能被索引,因此对优化没有用。