2009-02-25 3 views
1

Мы испытываем некоторые трудности с производительностью SQL Server и нуждаемся в некоторой помощи.SQL Server 2005 64-битная блокировка запросов

Наша среда: -

Windows 2003 Enterprise x64 Edition R2 Intel E5450 Quad Core 3ghz Процессор 16GB RAM Server 2005 Enterprise Edition 64bit (9.00.3282.00) совместимость баз данных SQL является 8 (но протестированы на 9) Гиперпоточность отключена

У нас есть одна база данных с 1,2 миллионами таблиц строк, которые запрашиваются (неэффективно), но в результате все 4 процессора насыщаются до такой степени, что все остальные запросы блокируются до тех пор, пока запрос завершен. Это включает в себя запросы для разделения баз данных и абсолютно несвязанных таблиц.

Если запрос выполняется с параметром MAXDOP 1, то все 4 ядра работают с 25%, а запрос занимает в 4 раза больше, в этом случае блокировки не выполняются. В дополнение к этому мы запустили тот же запрос на SQL 2000, и время отклика одно и то же, но не насыщение ЦП.

У нас есть подозрение, что проблема может быть связана с конфликтом над tempdb. В этом конкретном случае у нас есть хранимая процедура, использующая временную таблицу, а также параллельный запрос, запрашивающий temp db, который я предполагаю.

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

Кто-нибудь знает какие-либо исправления, изменения конфигурации или известные проблемы, которые могут быть причиной этого? Кто-нибудь видел это раньше? Это 64-битный нюанс?

С уважением

Ли

+1

Можете ли вы загрузить копию плана выполнения? В SSMS щелкните параметр Включить фактический запрос, запустите запрос и перейдите на вкладку плана запроса в результатах. Щелкните правой кнопкой мыши и сохраните его как XML. –

+0

«В этом конкретном случае у нас есть хранимая процедура, использующая временную таблицу», если вы делаете SELECT Col1, Col2 INTO #TempTable FROM MyTable, а затем изменяете это, чтобы предварительно создать таблицу. Если нет, то pls игнорируют это! (Также возможно блокирование этих причин было исправлено в SQL2005) – Kristen

ответ

0

Похоже, блокировка на данных TempDb, который эффективно останавливает все остальное, что может использовать TempDB от запуска до тех пор, пока не закончится. В частности, может быть, что таблица sysobjects заблокирована.

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

Вы можете попробовать создать второй экземпляр SQL для запуска этой базы данных. Таким образом, любая временная блокировка влияет только на себя, а не на другие базы данных на сервере.

Чтобы устранить проблему для других запросов, запущенных на одной базе данных, вы можете просмотреть несколько файлов для базы данных temp.

Однако, как только вы пойдете так далеко за решение, вам действительно нужно вернуться к проблемному запросу и попытаться уменьшить его площадь. Как прокомментировала Кристен, просто изменение способа создания временной таблицы может существенно повлиять на то, как вещи заблокированы.

1

Похоже, что таблица неправильно проиндексирована. Таблица с 1,2 миллионами строк не должна заставлять ничего запрашивать. У меня есть таблицы с более чем 60 миллионами строк, и я запрашиваю эту таблицу в миллисекундах.

Как выглядит запрос и как выглядит таблица?