Задерживать запрос SQL Server 2000 до тех пор, пока загрузка процессора не станет ниже 50% с использованием запроса или sproc? - PullRequest
2 голосов
/ 05 августа 2011

У меня есть несколько очень дорогих запросов, которые, кажется, забирают ресурсы, которые, кажется, ставят систему на первое место.

Есть ли функция задержки, которую я могу вызвать, чтобы дождаться восстановления ресурсов процессора в SQL Server 2000 - 2008?

Моя конечная цель - вернуться и сделать их более эффективными, использоватьsproc, но в то же время мне нужно заставить их работать как можно скорее, потому что я переписываю устаревший код.

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

вы можете попробовать что-то вроде этого:

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, просто напишите цикл для вывода разницы между значениями @@ CPU_BUSY каждые 10 секунд. Когда система находится на низкой нагрузке, используйте это значение как @ Ticks.

1 голос
/ 05 августа 2011

Единственное, что я могу придумать здесь, чтобы начать работу в спокойное время, - это использовать запланированные задачи и osql для выполнения ваших утверждений.Запланированные задачи должны запускаться в режиме ожидания.

Хотя я не уверен насчет 50% -ного бита.

Эта стратегия также не должна быть слишком чувствительной к версии SQL.

1 голос
/ 05 августа 2011

Вы не можете контролировать или регулировать ЦП, за исключением более поздних выпусков SQL Server 2008.

Лучше всего установить параметры, позволяющие использовать только половину (или меньше) процессоров для любого запроса. Это можно сделать двумя способами

Также см .:

Edit:

Вопрос будет заключаться в следующем: хотите ли вы отложить выполнение (со всеми проблемами, такими как CommandTimneout, время ответа пользователя и т. Д.) Или улучшить параллелизм для всех запросов

Этот ответ должен улучшить параллелизм: я обычно имею дело с клиентскими приложениями и не могу заставить бизнес-пользователя ждать.

При задержке выполнения вы также должны задерживать все запросы (скажем, чтобы запретить выполнение дорогостоящих запросов), что снижает параллелизм во время резервного копирования вызовов. И вам нужно быть осторожным с двумя дорогими запросами, начинающимися примерно в одно и то же время

...