如果我弄错了请纠正我,但据我了解,当计划执行查询时,引擎会考虑可用的空闲线程数并相应地调整查询计划。
例如,如果一台机器负载很高,以至于只有一个线程空闲,那么通常在卸载机器上使用多个线程运行的查询可以作为单线程执行。
有没有一种方法可以动态查询可用的空闲线程数,以便可以延迟(while/waitfor)执行特定的关键查询(当 MaxDop < X 时运行不可接受),直到可用的最小空闲线程数为止?
更新:基于 Kin 的回答的起点:
这似乎遵循了一个简单的负载测试,但由于某种原因永远不会返回所有空闲状态。我对这张桌子一无所知。
select count(*) as Cpus,
sum(IsIdle) + 1 as IdleCpus -- +1 since current query should be excluded
from
(
select Cpu_id,
min(convert(int, is_idle)) IsIdle
from sys.dm_os_schedulers
group by Cpu_id
) q
;
没有最小并行度这样的概念。
SQL Server 具有最大并行度(max DOP)和并行度的成本阈值。这两个设置由 sql server 的基于成本的优化器用于运行查询的线程数。
如果一台机器负载很重或者一个失控的查询独占了服务器,那么你就会遇到线程饥饿,在那里你会耗尽可用的工作线程。您应该将最大 dop 设置调整为合理的值并进行测试。
下面的查询将帮助您提供有关产生额外线程的系统任务的信息
或者,您可以检查
sys.dm_os_waiting_tasks
任何THREADPOOL
相关的等待。此外,sys.dm_os_scheduler
将告诉您current_workers_count
每个调度程序。您可以内置一些复杂的逻辑来检查当前的工作人员数量,然后只需要一个
waitfor delay x
,其中 x 是您想要的延迟。在我看来,将事情不必要地复杂化将是一种矫枉过正。最好的方法是调整 maxdop、并行度的成本阈值,同时确保统计数据是最新的,并为您的实例收集等待统计数据。简而言之,为您的服务器建立基线,看看您是否发现任何异常,然后开始您的调优练习。
您将使用Resource Governor Resource Pool。它不直接指定特定查询的并行度,而是可以为连接设置最小和最大 CPU 资源可用性。
所以
通过将运行并行查询的会话分配给设置了 MIN_CPU_PERCENT 的资源池,您可以确保调度程序可用于运行计划。