Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从代码中删除选项(重新编译)_Sql Server_Parameter Passing - Fatal编程技术网

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));