我正在重写我的 sql 以减少执行成本,并想知道是否有一种有效的方法来编写 WHERE 条件中使用的以下 CASE WHEN 语句:
SELECT l.*,tg.*
FROM RefTable tg,
InputTbl l
WHERE tg.areascheme = l.areascheme
AND tg.countrycode = l.strareabriefnamel1
AND ( CASE WHEN l.strareabriefnamel2 IS NULL THEN '' ELSE tg.areacode END ) = COALESCE( l.strareabriefnamel2,'' )
AND ( CASE WHEN l.strareabriefnamel3 IS NULL THEN '' ELSE tg.subareaname END ) = COALESCE( l.strareabriefnamel3,'' )
AND ( CASE WHEN l.strareabriefnamel4 IS NULL THEN '' ELSE tg.postalname END ) = COALESCE( l.strareabriefnamel4,'' )
option( MAXDOP 0 );
Execution Plan :-
![enter image description here](https://i.stack.imgur.com/6MkH8.jpg)
更多细节 :-
InputTable(466K记录)共有四个参与JOIN逻辑的字段,共有16种可能的(NULL,NOT NULL)组合。
L1, L2, L3, L4
NULL,NULL,NULL,NULL
NULL,NULL,NULL,NOT NULL
NULL,NULL,NOT NULL, NULL
NULL,NULL,NOT NULL,NOT NULL
NULL,NOT NULL,NULL,NULL
NULL,NOT NULL,NULL, NOT NULL
NULL,NOT NULL, NOT NULL,NULL
NULL,NOT NULL,NOT NULL,NOT NULL
NOT NULL,NULL,NULL,NULL
NOT NULL,NULL,NULL,NOT NULL
NOT NULL,NULL,NOT NULL,NULL
NOT NULL,NULL,NOT NULL,NOT NULL
NOT NULL,NOT NULL,NULL,NULL
NOT NULL,NOT NULL,NULL,NOT NULL
NOT NULL,NOT NULL,NOT NULL,NULL
NOT NULL,NOT NULL,NOT NULL,NOT NULL
RefTable(45k 条记录)将参与与 InputTable 的 JOIN 逻辑,根据上述标准生成结果集,生成约 3.51 亿行。
我的输入数据目前只满足两种情况。
输入表:-
NULL,NULL,NULL,NULL - 225776 rows
NOT NULL, NOT NULL, NULL, NULL - 240360 rows
任何意见将不胜感激。谢谢。