Sql server 2005 当我使用局部变量而不是直接指定日期时,SQL Server将永远无法处理?

Sql server 2005 当我使用局部变量而不是直接指定日期时,SQL Server将永远无法处理?,sql-server-2005,Sql Server 2005,我为我的新手行为提前道歉!使用SQL Server 2005(9.00.4053.00) 运行此查询需要2:22: DECLARE @Start_date CHAR(10); SET @Start_date = '2010-07-01'; SELECT DATEPART(wk, rp.dtScanDate) AS 'Week Number', COUNT(rp.qwImageID) AS 'Documents', SUM(CAST(rp.iCompressedSize

我为我的新手行为提前道歉!使用SQL Server 2005(9.00.4053.00)

运行此查询需要2:22:

DECLARE @Start_date CHAR(10);
SET @Start_date = '2010-07-01';

SELECT 
    DATEPART(wk, rp.dtScanDate) AS 'Week Number',
    COUNT(rp.qwImageID) AS 'Documents',
    SUM(CAST(rp.iCompressedSize AS BIGINT))/1024/1024 AS 'Compressed',
    SUM(CAST(rp.iUncompressedSize AS BIGINT))/1024/1024 AS 'Uncompressed'
INTO [#TempRVOSPolicy]
FROM
    Policy rp
WHERE
    dtScanDate >= @Start_date
GROUP BY 
    DATEPART(wk, rp.dtScanDate)
ORDER BY
    DATEPART(wk, rp.dtScanDate);
但是运行这个需要0:00:

DECLARE @Start_date CHAR(10);
SELECT 
    DATEPART(wk, rp.dtScanDate) AS 'Week Number',
    COUNT(rp.qwImageID) AS 'Documents',
    SUM(CAST(rp.iCompressedSize AS BIGINT))/1024/1024 AS 'Compressed',
    SUM(CAST(rp.iUncompressedSize AS BIGINT))/1024/1024 AS 'Uncompressed'
INTO [#TempRVOSPolicy]
FROM
    Policy rp
WHERE
    dtScanDate >= '2010-07-01'
GROUP BY 
    DATEPART(wk, rp.dtScanDate)
ORDER BY
    DATEPART(wk, rp.dtScanDate);

这是为什么?

看看SQL Server生成的查询计划


我的猜测是,查询优化器在第二个查询中优化了从char(10)到datetime的转换(是一次转换),而在第一个查询中,它需要为每一行转换一次值。

执行此操作时会发生什么

DECLARE @Start_date datetime;
SET @Start_date = '20100701';

如果您总是一个接一个地运行查询,它可能会返回您兑现的结果(对于第二次查询).

完成查询所用的时间大致相同。不到3分钟。dtScanDate是什么数据类型?执行计划显示什么?dtScanDate是一个日期时间值。执行计划显示聚集索引扫描是最昂贵的操作(99%)。[Policy].[dbo].[44469590-70B7-48BC-A262-8D131EC8E396}.[dtScanDate]>=[@Start_date]后一个查询似乎还使用键查找和索引查找。第二个没有。