Почему этот SQL-скрипт так медленно работает в SQL Server Management Studio? - PullRequest
1 голос
/ 06 ноября 2010

У меня есть SQL-скрипт, который вставляет около 8000 строк в переменную TABLE.

После вставки в эту переменную я использую цикл WHILE, чтобы зациклить эту таблицу и выполнить другие операции. Этот цикл, возможно, содержит 60 строк кода.

Если я запускаю переменную TABLE и вставляю часть скрипта без цикла while, это занимает около 5 секунд. Это здорово.

Однако, если я запускаю весь скрипт, это займет около 15 минут.

Вот что интересно, а что я не могу понять:

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

Затем, когда он выясняет, что делать (предположительно), он запускает вставки в таблицу var, выполняет цикл, и все это происходит довольно быстро.

Затем, к концу цикла или даже после него, он сидит и висит еще много минут. Наконец, он пропускает последние несколько строк сценария, которые идут после цикла.

Я могу учесть все время, затраченное на вставку, а затем все время, затраченное на цикл. Но я не могу понять, почему он так долго зависает до и в конце сценария.

для ударов, я добавил оператор GO после вставки в временную таблицу, и все до этого момента работало так, как вы ожидаете; однако я не могу этого сделать, потому что мне нужна эта переменная, и оператор GO, очевидно, убивает эту переменную.

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

Есть какие-нибудь мысли о том, что SQL Server в течение этого времени?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 06 ноября 2010

Вы всегда можете проверить, что делает скрипт, из Activity Monitor или из представления sys.dm_exec_requests.Сценарий будет заблокирован чем-то , и вы сможете увидеть, что именно блокирует в столбцах wait_type и wait_resource.например, ожидание блокировок строк или таблиц, но из описания проблемы я подозреваю, что это событие роста базы данных или журнала.Они имеют тенденцию быть очень дорогими, если база данных достаточно велика, а увеличение по умолчанию на 10% означает рост ГБ.В этом случае попробуйте предварительно изменить размер базы данных до необходимого размера и убедитесь, что Мгновенная инициализация файла включена для файлов данных.

1 голос
/ 06 ноября 2010

ПЕЧАТИ буферизируются, поэтому по ним нельзя судить о производительности.
Используйте RAISERROR ('Message', 0, 1) WITH NOWAIT, чтобы сразу увидеть результат.

Чтобы понять, что делает процесс, я бы начал с вызова sp_who2 несколько раз и просмотра значений интересующего процесса: не блокируется ли он, каковы типы ожидания, если таковые имеются, и скоро. Кроме того, может помочь только проверка нагрузки на аппаратное обеспечение сервера (загрузка процессора, активность диска) (если нет других активных процессов).

И, пожалуйста, отправьте код. Я полагаю, что определения таблицы var и цикла будет достаточно для INSERT.

0 голосов
/ 06 ноября 2010

Судя по формулировке вашего вопроса, вы используете курсор для циклического перемещения по таблице.В этом случае поможет команда «SET NOCOUNT ON» перед началом цикла.

Переменная таблицы упоминалась в предыдущем ответе, но, как правило, вы должны действительно использовать временную таблицу, если у вас более нескольких строк.

0 голосов
/ 06 ноября 2010

Если вы используете переменную таблицы, можете ли вы заменить ее временной таблицей и посмотреть, есть ли какие-либо изменения в производительности?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...