使用查询或sproc延迟SQL Server 2000查询,直到处理器的利用率低于50%?

时间:2011-08-04 20:20:20

标签: sql-server sql-server-2005 tsql sql-server-2008 sql-server-2000

我有几个非常昂贵的查询,似乎占用资源似乎把系统放在首位。

是否有延迟功能我可以调用等待处理器资源在SQL Server 2000 - 2008中恢复使用?

我最终的目标是回过头来提高效率,使用sproc,但与此同时我需要尽快让这些工作,因为我正在重写遗留代码。

3 个答案:

答案 0 :(得分:3)

你可以尝试这样的事情:

DECLARE @Busy int
       ,@Ticks int
SELECT @Busy=@@CPU_BUSY
      ,@Ticks=7777  --<you have to determine this value based on your machine
WAITFOR DELAY '00:00:10' --10 seconds

WHILE @@CPU_BUSY-@Ticks>@BUSY
BEGIN
    --too busy, wait longer
    @BUSY=@@CPU_BUSY
    WAITFOR DELAY '00:00:10' --10 seconds
END

EXEC YourProcedureHere

确定@Ticks值,只需编写一个循环,每隔10秒打印出@@ CPU_BUSY值之间的差值。当系统处于低负载时,请将此值用作@Ticks。

答案 1 :(得分:1)

除了SQL Server 2008的更高版本之外,您无法控制或限制CPU。

您最好的选择似乎是设置选项,以便只允许一半(或更少)的CPU用于任何查询。这可以通过两种方式完成

另见:

编辑:

问题是:你想延迟执行(包括CommandTimneout,用户响应时间等所有问题)或改善所有查询的并发性

这个答案可以提高并发性:我通常会处理客户端应用程序而无法让业务用户等待。

当延迟执行时,您还必须延迟所有查询(比如禁止运行昂贵的查询),这会在调用备份时减少并发性。而且你必须要小心同时开始的两个昂贵的查询

答案 2 :(得分:1)

我唯一可以想到的是在安静的时间实际开始工作,就是使用预定的任务和osql来执行你的陈述。计划任务必须选择在空闲时运行。

我不确定50%的位数。

此策略也不应对SQL版本过于敏感。