SQL语句中,如果通过declare定义日期等变量,SQL语句的where条件中通过变量查询变得很慢,但是如果把定义的变量改成实际的值又会很快。
DECLARE @riqi1 DATETIME, @riqi2 DATETIME; SELECT @riqi1 = '2024-02-18', @riqi2 = '2024-02-19'; select * from t WHERE riqi >= @riqi AND riqi <= @riqi2
方法1:在语句的最后 附加一句 OPTION(RECOMPILE)
DECLARE @riqi1 DATETIME, @riqi2 DATETIME; SELECT @riqi1 = '2024-02-18', @riqi2 = '2024-02-19'; select * from t WHERE riqi >= @riqi AND riqi <= @riqi2 OPTION(RECOMPILE)
但是需要注意,OPTION(RECOMPILE)只能放到最后,否则SQL语句会报错。
方法二:在语句后增加and RAND()>-1
DECLARE @riqi1 DATETIME, @riqi2 DATETIME; SELECT @riqi1 = '2024-02-18', @riqi2 = '2024-02-19'; select * from t WHERE riqi >= @riqi AND riqi <= @riqi2 and RAND()>-1
加上and RAND()>-1也会重新编译。
3种查询执行计划:
1,传值
2,传参
3,使用OPTION(RECOMPILE),执行计划与传值一致。 实际执行时是重新编译了