我正在使用SQL Server 2008 R2
运行sys.dm_os_waiting_tasks向我显示以下内容:
CXPACKET上有很多进程.谷歌搜索这个问题表明这与查询的并行执行有关,我必须搞乱MAXDOP设置,但所有进程的资源描述都没有意义:
exchangeEvent id=Pipe271035100 WaitType=e_waitPipeGetRow nodeId=5
Run Code Online (Sandbox Code Playgroud)
显示e_waitPipeGetRow的Waittype似乎表明它与死锁或大量查询被锁定有关,但我可能错了.
我的问题是,我该如何解决这个问题呢?我甚至不确定在哪里看.
编辑:
自从发布这个问题以来,下面的问题一下子就突然消失了.今天虽然发生了同样的问题,但这是我在sys.dm_exec_requests中找到的:
有几个PROCID显示了很多cxpacket.以下是其中一个示例:123 0 2015-02-10 16:12:21.617暂停SELECT 0x0300070048642C323B8DB30036A400000100000000000000 1304 11288 0x0500070048642C3240210C14030000000000000000000000 7 5 59676462-0CB3-4FB8-96FC-530B3892578D 0 RESOURCE_SEMAPHORE 248137 RESOURCE_SEMAPHORE 0 1 1583321 0x 0 0 0 248138 8 0x000000000460A748 0 0 0 -1한국어ymd 7 1 0 1 0 1 1 1 1 2 -1 0 0 0 4 0 0 1 0x941A9D1F032CAA8A 0x1CCA978D548EB09E
显示RESOURCE_SEMAPHORE的等待类型似乎表明线程在并行运行查询时争用资源,但我不确定.我该如何解决这个问题?
EDIT2:
啊,现在我终于开始理解核心问题了
运行sys.dm_exec_query_memory_grants向我展示了非常令人惊讶的信息:
几个进程被授予了大量的内存(上图中的3个Gigs).在不好的情况下,几个进程开始请求大量内存,从而导致资源争用.这就是导致所有RESOURCE_SEMAPHORE等待类型的原因.
深入挖掘,我发现当重复调用特定存储过程时会发生这种情况.我们最终将修复其中的基础SQL问题.我认为它与参数嗅探有关,但为了立即缓解资源争用问题,我尝试采取以下措施:
首先,我运行DBCC FREEPROCCACHE来清除计划缓存.这并没有减少请求的内存量.
然后我尝试用OPTION RECOMPILE改变程序.这也没有做任何事情.
所以我很想知道去哪里.如何使SP请求更少的内存?
小智 5
如果运行的是SQL Server企业版,则可以使用以下命令设置将分配给单个查询的最大内存,以占可用服务器内存的百分比表示:
ALTER WORKLOAD GROUP [DEFAULT] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 25)
GO
-- RECONFIGURE to make the setting take effect
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)
默认值为25%,减小该值可能会导致解决许多问题。如果您可以隔离执行问题查询的连接,则可以为这些连接配置单独的限制,请参阅:
资源调控器是一项仅适用于企业的功能,我了解所有版本均使用默认工作负载组进行标准资源分配。如果有人知道重新配置默认工作负载组是否适用于非企业实例,我将很感兴趣。
要寻求帮助可以解决问题的原因:
如果您将问题缩小为问题存储过程,则执行计划可以告诉您哪些操作员导致了大内存授予。在SSMS中,您需要打开操作员属性以查看所有内存授予信息。
执行计划中的根节点将具有有关查询的内存授予的信息。
分配了工作内存的运算符将具有“内存分数”属性,该属性指定该操作员可以使用的查询总内存中所占的比例。
您正在寻找内存分数接近1的运算符,哈希匹配和排序运算符是开始查找的好地方。
如果可以找到问题区域,请更改查询或索引以消除操作或减少估计的行数,从而减少请求的内存授予。
当查询执行并行计划并且某些线程先于其他线程完成时,就会遇到这种等待类型。正在等待其他线程完成的线程显示此等待类型。至于等待描述,我的看法是,它是描述该线程正在等待其结果被消耗这一事实的一种方式。所以,简而言之,这里没有什么可担心的。
但需要注意的一件事是:为什么线程的工作负载如此不均匀?查看执行计划中每个运算符消耗了多少行的简单方法是使用 SQL Sentry 的 Plan Explorer 工具。我的猜测是你会看到倾斜。根据我的经验,这通常是由于统计不准确造成的。
归档时间: |
|
查看次数: |
4512 次 |
最近记录: |