我在4个vCPU VM运行Microsoft SQL Server 2016 SP2-CU6(13.0.5292.0)与max degree of parallelism
设置为2
和cost threshold for parallelism
设置为50
。
早晨,当尝试显示SELECT TOP 100查询的估计执行计划时,我遇到了大量的等待,渲染估计计划的操作需要花费几分钟,通常是5到7分钟。同样,这不是查询的实际执行,这只是显示“ 估计的执行计划”的过程。
sp_WhoIsActive
将显示PAGEIOLATCH_SH
等待或LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
等待,当我在操作期间运行Paul Randal的WaitingTasks.sql脚本时,它将显示CXPACKET
等待,而工作线程显示PAGEIOLATCH_SH
等待:
*资源描述字段= exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
工作线程看起来是将整个stats
表都放入内存中(因为从Paul Randal的查询中显示的那些页号以及后续页号都指向该stats
表的集群键)。一旦计划恢复,即使在stats
剩余的各种记录(我认为由于类似查询的查找操作而将其拉出)的情况下,大部分缓存都从高速缓存中消失之后,一天中的剩余时间基本上都是瞬时的。
如果查询实际上是使用SCAN运算符的计划执行的,我会期望出现这种初始行为,但是为什么在评估执行计划时才这样做(如上面链接的计划所示),以达到SEEK运算符呢?我该怎么办(除了在办公时间之前运行此语句,以便适当地缓存我的数据),以帮助提高此处的性能?我假设一对覆盖索引将是有益的,但是它们真的可以保证行为的任何改变吗?我必须在这里在一些存储和维护窗口限制内工作,并且查询本身是从供应商解决方案生成的,因此,此时欢迎任何其他建议(除了更好的索引编制)。