今天高老大出了好文章。在这里 自己本来对这一块比较混乱,正好借这个机会学习一下。
就用高老大的脚本。需要的直接去他那里找吧,这里就省了。
加查询优化标记前后对比
可以看到GrantedMemory是504928KB,大约是213096/1024=208.101562MB(这里的那个值好像每次都有差别,但是差距不太大。不影响效果)
加上跟踪标记后
4560/1024大概只有4MB吧。
差别很大吧~
其实这里这些值还可能通过查询计划的XML里看,里面有更详细的信息。
如
<QueryPlan DegreeOfParallelism="1" MemoryGrant="216568" CachedPlanSize="24" CompileTime="2" CompileCPU="2" CompileMemory="168">
<MemoryGrantInfo SerialRequiredMemory="512" SerialDesiredMemory="504928" RequiredMemory="512" DesiredMemory="504928" RequestedMemory="216568" GrantWaitTime="0" GrantedMemory="216568" MaxUsedMemory="40" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="196572" EstimatedPagesCached="7482" EstimatedAvailableDegreeOfParallelism="2" />
MemoryGrant这是评估值,以Serial*开头的字段,好像是如果这个query串行化时的评估值(Serial required/desired memory attributes are estimated during query compile itme for serial execution)。
强烈推荐文章:
Understanding SQL server memory grant
Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues
Memory Grant Execution Plan Statistics
说实话,里面有几个参数还是不太明白确切的意思。在实际工作中如何使用,希望有人能给些指导。