Как использовать несколько ядер в больших запросах к SQL Server? - PullRequest
3 голосов
/ 26 мая 2010

У меня есть два сервера SQL, один для производства и один в качестве архива. Каждую ночь у нас есть задание SQL, которое запускает и копирует производственные данные за сутки в архив. Как мы выросли, этот процесс занимает все больше и больше и больше времени. Когда я наблюдаю за использованием на сервере архивации, на котором выполняется процесс архивации, я вижу, что он использует только одно ядро. А так как в этой коробке восемь ядер, это огромная трата ресурсов. Работа выполняется в 3 часа ночи, поэтому она может свободно использовать любые ресурсы, которые она может найти.

Итак, что мне нужно сделать, если выяснить, как структурировать задания SQL Server, чтобы они могли использовать преимущества нескольких ядер, но я не могу найти литературу по решению этой проблемы. Мы работаем с SQL Server 2005, но я, конечно, могу потребовать обновления, если 2008 год позаботится об этой проблеме.

Ответы [ 5 ]

5 голосов
/ 26 мая 2010

Есть ли у вас автоматический план обслуживания для обновления статистики, перестройки индексов и т. Д.? В противном случае SQL Server все еще может строить свои планы запросов на основе более старой статистики небольших таблиц.

SQL Server автоматически генерирует параллельные планы запросов, если выполняются определенные условия. Из статьи на MSDN :

1. SQL Server работает на компьютере с более чем одним микропроцессором или Процессор, такой как симметричный многопроцессорный компьютер (SMP)? Только компьютеры с более чем одним процессором могут использовать параллельные запросы.

2.Что такое количество одновременно работающих пользователей на SQL Server установка в этот момент? SQL Сервер контролирует использование процессора и корректирует степень параллелизма по запросу время запуска Более низкие степени параллелизм выбирается, если загрузка процессора высокий.

3. Достаточно ли памяти для параллельного выполнения запроса? каждый запрос требует определенного количества память для выполнения. Выполнение параллельный запрос требует больше памяти чем непараллельный запрос. Количество памяти, необходимой для выполнения параллельный запрос увеличивается с степень параллелизма. Если память Требование параллельного плана для данная степень параллелизма не может быть удовлетворен, SQL Server уменьшает степень параллелизма автоматически или полностью отказывается от параллельного плана для запроса в данной рабочей нагрузке контекст и выполняет серийный план.

4. Какой тип запроса выполняется? Запросы, интенсивно потребляющие циклы процессора являются лучшими кандидатами на параллель запрос. Например, объединения больших таблицы, существенные совокупности и хорошая сортировка больших наборов результатов кандидатов. Простые запросы, часто найдено в обработке транзакции приложения, найти дополнительные координация требуется для выполнения запрос параллельно перевешивает потенциальное повышение производительности. к различать запросы, которые извлечь выгоду из параллелизма и тех, что не приносит пользы, SQL Server сравнивает сметную стоимость выполнение запроса со стоимостью порог для значения параллелизма. Хотя это и не рекомендуется, пользователи могут изменить значение по умолчанию 5 с помощью sp_configure.

5.Есть ли достаточное количество строк, обработанных в данном потоке? Если Оптимизатор запросов определяет число слишком мало строк в потоке не вводит операторов обмена распространять поток. Следовательно, операторы в этом Поток выполняется поочередно. Выполнение операторов в сериале план избегает сценариев, когда запуск, распространение и стоимость координации превышает выгоды достигается параллельным оператором выполнение.

Другие факторы:

Настроен ли SQL Server на привязку к одному процессору?

Установлена ​​ли максимальная степень параллелизма на 1?

- РЕДАКТИРОВАТЬ -

Вы пробовали профилировать этот процесс? Было бы интересно увидеть план запроса, который генерирует SQL Server.

У вас есть пример кода, который вы можете опубликовать?

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

2 голосов
/ 26 мая 2010

Выполнение базовых операций ввода-вывода на диске требует очень и очень небольшого процессорного времени (по крайней мере, на любом устройстве, на котором я запускаю Perfmon). Если вы загружаете процессор на 100%, то процесс архивации, вероятно, требует интенсивной загрузки процессора. Вы выполняете какой-то сложный запрос, вызов встроенной функции или делаете что-то еще, что потребует больше, чем просто чтение / запись байтов жесткого диска? (Возможно, файлы вашей базы данных находятся на сжатых жестких дисках? Или мешает какой-то другой аналогичный «фоновый» процесс?)

Один из возможных способов (акцент на возможном, поскольку он полностью зависит от вашей среды) распределить нагрузку на ЦП - это одновременное выполнение нескольких задач. Это можно сделать, разбив нагрузку. Для общего архива и некоторых общих предположений это может выглядеть так:

  • Первый шаг, определить объем данных, которые будут заархивированы. Скажем, выбранные строки и связанные данные из основной таблицы, содержащей столбец идентификаторов, где архивируемые данные находятся в диапазоне от Id 10000 до 20000
  • Разбейте это на куски. Хотите использовать четыре процессора? Попробуйте четыре куска, 10000-12500, 12501-15000, 15001-17500, 17501-20000. Запишите их в таблицу «должно быть сделано».
  • Настройте четыре задания агента SQL на запуск, скажем, в 3:00 AM, 3:01, 3:02 и 3:03. Когда каждое задание запускается, оно получает следующий «готовый» набор данных и обрабатывает его.
  • Вы можете подготовить столько кусков данных, сколько захотите. Вы можете иметь столько работы, сколько захотите. Работа может продолжать обрабатывать куски, пока в списке больше не будет.

Обратите внимание, что если у вас есть два или более процессов, считывающих данные с одних и тех же дисков и записывающих их на одни и те же диски, вы в конечном итоге станете привязанными к диску. Но вы можете улучшить производительность, или, по крайней мере, я видел ее в некоторых системах ... если для перемещения задачи требуется более X раз, то для перемещения 2 МБ данных двум задачам может понадобиться менее 2 раз, и это даже больше шансов удержаться, если между чтением и записью нужно выполнить много работы с процессором. Но проверьте это на своей системе, чтобы убедиться.

Чтобы проверить дисковый ввод-вывод, используйте Perfmon (системный монитор, системный монитор, «Производительность» или как там их называют в наши дни) со счетчиками «средний размер дисковой очереди». Если они постоянно превышают 2 или 3, значит, вы привязаны к диску. (Конечно, это сложнее, но это даст вам сильное начало в этой проблеме.)

1 голос
/ 26 мая 2010

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

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

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

0 голосов
/ 26 мая 2010

Вы уверены, что задание не связано с вводом / выводом (и не связано с процессором)? Это объясняет, почему он работает только на одном процессоре. Вот статья и , другая статья о том, как ее устранить, чтобы вы могли определить, что замедляет работу, прежде чем предположить, что это проблема, связанная с процессором.

0 голосов
/ 26 мая 2010

Вы пробовали SQLBulkCopy или смотрели в Bulk Insert (http://msdn.microsoft.com/en-us/library/ms188365.aspx)?

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