我正在重写我的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 );
更多详情: -
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亿行。
我的输入数据目前仅满足两种情况。
InputTable: -
NULL,NULL,NULL,NULL - 225776 rows
NOT NULL, NOT NULL, NULL, NULL - 240360 rows
任何输入都将受到赞赏。感谢。
答案 0 :(得分:5)
简单规则:从不在FROM
子句中使用逗号。 始终使用明确,正确的JOIN
语法。
这可能不会改变查询的性能,但它是一种更典型的编写方式。我非常确定目的是:
SELECT l.*, tg.*
FROM RefTable tg JOIN
InputTbl l
ON tg.areascheme = l.areascheme AND tg.countrycode = l.strareabriefnamel1
WHERE (l.strareabriefnamel2 IS NULL OR tg.areacode = l.strareabriefnamel2) AND
(l.strareabriefnamel3 IS NULL OR tg.subareaname = l.strareabriefnamel3) AND
(l.strareabriefnamel4 IS NULL OR tg.postalname = l.strareabriefnamel4)
option( MAXDOP 0 );
优化此查询的起点是索引。我建议:RefTable(areascheme, countrycode)
和InputTbl(areascheme, strareabriefnamel1)
。