Sql server 从代码中删除选项(重新编译)
我有这些疑问Sql server 从代码中删除选项(重新编译),sql-server,parameter-passing,Sql Server,Parameter Passing,我有这些疑问 declare @month as int = 9 Select c1,c2 From table Where datepart (m, InserDate) = @month 跑步需要55分钟 declare @month as int = 9 Select c1,c2 From table Where datepart (m, InserDate) = @month option (recompile) 需要9秒 declare @month as int = 9 Sele
declare @month as int = 9
Select c1,c2
From table
Where datepart (m, InserDate) = @month
跑步需要55分钟
declare @month as int = 9
Select c1,c2
From table
Where datepart (m, InserDate) = @month
option (recompile)
需要9秒
declare @month as int = 9
Select c1,c2
From table
Where datepart (m, InserDate) = 9
花7秒钟
Select c1,c2
From table
Where datepart (m, InserDate) = 9
需要5秒钟
我的问题是,如何在不使用“选项(重新编译)”的情况下使第一个代码在几秒钟内运行
广告信息:
实际代码为:
DECLARE @Mon int = DATEPART(m, DATEADD(m, -1, getdate()))
DECLARE @Yr int = DATEPART(yyyy, DATEADD(m, -1, getdate()))
InsertDate的值从:2008-07-16 02:29:48.203到2016-10-24 07:06:58.337
而且,正如你所看到的,我只是在检索“上个月”的数据。。。
选项(重新编译)真的有必要吗?为什么sql不够智能?假设您在
插入日期
字段上有一个合适的(覆盖)索引,您可以编写如下内容:
DECLARE @Mon int = DATEPART(m, DATEADD(m, -1, getdate()));
DECLARE @Yr int = DATEPART(yyyy, DATEADD(m, -1, getdate()));
SELECT
c1,
c2
FROM
your_table
WHERE
insert_date>=DATEFROMPARTS(@Yr,@Mon,1) AND
insert_date<DATEADD(MONTH,1,DATEFROMPARTS(@Yr,@Mon,1));
DECLARE@Mon int=DATEPART(m,DATEADD(m,-1,getdate());
声明@Yr int=DATEPART(yyyy,DATEADD(m,-1,getdate());
挑选
c1,
c2
从…起
你的桌子
哪里
插入日期>=DATEFROMPARTS(@Yr,@Mon,1)和
插入日期您最好解释为什么不想使用选项(重新编译)
。如果所有插入日期
值占用一年,则计算[开始日期、结束日期)
使用这些数据进行比较比从列中提取月份要好得多。但不知道这是否符合您的数据。您是否尝试过我对您的问题给出的新答案?@TT.非常有效
DECLARE @Mon int = DATEPART(m, DATEADD(m, -1, getdate()));
DECLARE @Yr int = DATEPART(yyyy, DATEADD(m, -1, getdate()));
SELECT
c1,
c2
FROM
your_table
WHERE
insert_date>=DATEFROMPARTS(@Yr,@Mon,1) AND
insert_date<DATEADD(MONTH,1,DATEFROMPARTS(@Yr,@Mon,1));