Sql server 查询与跟踪结果非常不同的实际执行计划

Sql server 查询与跟踪结果非常不同的实际执行计划,sql-server,performance,Sql Server,Performance,我重建了索引并更新了统计数据 查询很简单,WHERE子句中有一个子查询 SELECT TOP 1 * from MeetingPost_reg WHERE userid = 1234 AND meetingpost_regid <> 9999 AND DateStart < (SELECT DateStart FROM MeetingPost_reg WHERE meetingpost_regid = 9999) ORDER BY DateStart desc datast

我重建了索引并更新了统计数据

查询很简单,WHERE子句中有一个子查询

SELECT TOP 1 * from MeetingPost_reg
WHERE userid = 1234 AND meetingpost_regid <> 9999 
AND DateStart < (SELECT DateStart FROM MeetingPost_reg WHERE meetingpost_regid = 9999)
ORDER BY DateStart desc
datastart上有一个索引userid。 meetingpost_regid是PK,带有聚集索引

SHOWPLAN_文本:

执行计划:

执行计划图显示了一个包含0行的索引查找和一个包含1行的聚集索引查找,总成本约为0.0006,总CPU成本约为0.002

跟踪显示持续时间为250,CPU 172,读取11。跟踪事件类是SQL:StmtCompleted


为什么此查询使用如此多的CPU?

探查器事件显示172ms的工作时间和250ms的运行时间,11页读取。这是为了这次活动还是为了这次活动?如果稍后,此查询是批处理中唯一的语句吗

对于执行计划,您最好发布实际计划,将整个计划减少为2个运算符和4个数字0、1、.0006和.002,这样会从计划信息中损失很多


捕获的计划和语句执行是否引用完全相同的执行?如果是,您是否考虑过返回计划的成本已包含在跟踪事件中?

是的,它是完全相同的执行,在探查器中运行。我不认为这是计划的成本,因为在活体内的查询同样繁重
StmtText                                                                                                                                                                                                                                                         
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  |--Compute Scalar(DEFINE:([MeetingPost_reg].[message]=[MeetingPost_reg].[message], [MeetingPost_reg].[ProcessedComment]=[MeetingPost_reg].[ProcessedComment], [MeetingPost_reg].[ProcessedMsg]=[MeetingPost_reg].[ProcessedMsg], [MeetingPost_reg].[pos_discou
       |--Top(1)
            |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([dbo].[MeetingPost_reg]))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([MeetingPost_reg].[datestart]))
                      |--Clustered Index Seek(OBJECT:([dbo].[MeetingPost_reg].[PK_MeetingPost_reg]), SEEK:([MeetingPost_reg].[meetingpost_regid]=9999) ORDERED FORWARD)
                      |--Index Seek(OBJECT:([dbo].[MeetingPost_reg].[MeetingPost_reg12]), SEEK:([MeetingPost_reg].[datestart] < [MeetingPost_reg].[datestart]),  WHERE:([MeetingPost_reg].[meetingpost_regid]<>9999 AND Convert([MeetingPost_reg

(6 row(s) affected)