首页 > 解决方案 > 硬编码值时查询是即时的,否则不会完成

问题描述

当在 WHERE 子句中硬编码一个值时,我有一个即时查询,但是当使用连接表中的值时,查询永远不会完成。

我不知道为什么,因为查询没有完成,我什至无法查看执行计划。我的意思是,当它必须查看表的记录而不是硬编码的值时,它会花费更长的时间,但不会更长。

我有这个临时表设置:

#MY_TEMP_TABLE -- PRIMARY KEY (district_id asc, school_id asc, class_id asc)

school_id | class_id | end_dte (int) | district_id
--------------------------------------------------
1         | 5        | 20201223      | ABC


HISTORY TABLE -- PRIMARY KEY (end_dte asc, class_id asc, school_id asc)

school_id | class_id | end_dte (int)
------------------------------------

CLASS TABLE -- PRIMARY KEY (class_id asc, school_id asc)

school_id | class_id | district_id
----------------------------------

这是查询:

SELECT HT.school_id, HT.class_id, MAX(HT.end_dte)
FROM HISTORY_TABLE HT
INNER JOIN CLASS C ON HT.school_id = C.school_id AND HT.class_id = C.class_id
INNER JOIN #MY_TEMP_TABLE MTT ON C.school_id = MTT.school_id AND C.class_id = 
MTT.class_id AND C.district_id = MTT.district_id
WHERE C.district_id = 'ABC'
AND HT.end_dte <= MTT.end_dte
GROUP BY HT.school_id, HT.class_id

我现在在 #MY_TEMP_TABLE 中有 1 条记录,而 HISTORY_TABLE 有数百万不同的 school_id 和 class_id 值。

如果我在 WHERE 子句中硬编码一个特定值来代替 MTT.end_dte,则查询会立即完成。

标签: tsqlquery-optimization

解决方案


推荐阅读