【问题标题】:Different query plan to the same query ! [duplicate]不同的查询计划对同一个查询! [复制]
【发布时间】:2011-01-13 11:53:21
【问题描述】:

可能重复:
how that happen SP sql server

你好,我得到了一些奇怪的东西。我运行了这个 sql:

SELECT   Id , GameTypeId , PlayerId , BetAmount , Profit ,          
         DateAndTime 
FROM     Results 
WHERE    DateAndTime >= DATEADD (DAY , -1 , SYSDATETIME ())        
         AND          
         DateAndTime < SYSDATETIME () 
ORDER BY DateAndTime ASC;

我在日期列上有非集群索引 并且返回的实际行数是 表中 1600016 行中的 672 行。 (估计为 1 行)

之后我运行了这个 sql:

declare @d DATETIME2(7)  
set @d = DATEADD (DAY , -1 , SYSDATETIME ()) 
declare  @d2 DATETIME2(7) 
set @d2  = SYSDATETIME ()  

SELECT   Id , GameTypeId , PlayerId , BetAmount , Profit ,         
         DateAndTime FROM     Results 
WHERE    DateAndTime >= @d          
         AND          
         DateAndTime < @d2 
ORDER BY DateAndTime ASC; 

实际的执行计划是 TABLE SCANE !!!并且返回的实际行数是 表中 1600016 行中的 672 行。 (估计行是 144000 r0ws)

有些人知道这里发生了什么?!?!?

【问题讨论】:

标签: sql-server database tsql sql-execution-plan


【解决方案1】:

你确定你没有混淆执行计划吗?如果快速浏览一下 sql,我会假设第一个查询需要进行表扫描。我将此归因于您的 where 子句中有一个计算 (DATEADD) 需要对每一行进行评估的事实。这是在尝试编写高性能查询时要注意的事情。

【讨论】:

  • DATEADD 计算不会对每一行进行评估,也不会导致表扫描。该公式不包含对列的任何引用。要查看这种类型的公式是否会被评估一次,您可以尝试create table #t (i int); INSERT INTO #t select CHECKSUM(NEWID())%2 from sys.all_columns select i, COUNT(*) from #t group by i; select COUNT(*) from #t WHERE i=CHECKSUM(rand())%2 drop table #t
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多