SQL Server и обновление (или вставка) параллелизма
-
05-07-2019 - |
Вопрос
Я получил большую работу по преобразованию 299 ГБ изображений JPEG, уже находящихся в базе данных, в эквиваленты миниатюр для целей отчетности и обеспечения пропускной способности.
Я написал потокобезопасную функцию SQLCLR для повторной выборки изображений, прекрасная работа.
Проблема в том, что когда я выполняю его в UPDATE
(от поля PhotoData до поля ThumbData), он выполняется линейно, чтобы предотвратить условия гонки, используя только один процессор для повторной выборки изображений.
Итак, как мне лучше всего использовать 12 ядер и настройку Phat RAID, которые есть на этой машине базы данных?Стоит ли использовать подзапрос в FROM
пункт заявления об обновлении?Это все, что требуется для обеспечения параллелизма в операциях такого типа?
В любом случае операция разбита на пакеты, около 4000 изображений в каждом пакете (в оконном запросе около 391 тыс. изображений), у этой машины достаточно ресурсов для записи.
Решение
Я тоже рекомендую " циклический перебор " методология, отстаиваемая kragen2uk и onupdatecascade (я голосую за них). Я знаю, что читал что-то раздражающее о подпрограммах CLR и паралеллизме SQL, но я забываю, что это было сейчас ... но я думаю, что они не очень хорошо играют вместе.
Часть того, что я делал в прошлом для аналогичных задач, - это создание таблицы, в которой перечислены все выполняемые партии. Для каждого запускаемого соединения он идет к этой таблице, показывает следующий пакет, помечает его как обрабатываемый, обрабатывает, обновляет как Готово и повторяет. Это позволяет вам измерять производительность, управлять масштабированием, разрешать остановки и перезапуски без необходимости перезапуска, и дает вам кое-что, чтобы показать, насколько завершена задача (не говоря уже о том, что она действительно что-то делает).
Другие советы
Проверьте настройку конфигурации максимальной степени параллелизма (MAXDOP) на вашем SQL-сервере.Вы также можете установить значение MAXDOP.
Эта ссылка может быть вам полезна http://www.mssqltips.com/tip.asp?tip=1047
ваше здоровье
Не могли бы вы разбить запрос на пакеты и выполнить каждый пакет отдельно для отдельного соединения? Сервер SQL использует параллелизм в запросе только тогда, когда ему это нравится, и хотя вы можете его остановить или даже немного (поощрить), изменив пороговое значение стоимости для параметра параллелизма на O, но я думаю, что это довольно удачно. р>
Одна вещь, на которую стоит обратить внимание, это то, что она решает, использовать ли параллелизм только во время компиляции запроса. Кроме того, если запрос компилируется в то время, когда загрузка ЦП выше, сервер SQL с меньшей вероятностью будет учитывать параллелизм.
Найдите некоторые критерии, чтобы разбить набор на отдельные подмножества строк (1-100, 101-200 и т. д.), а затем вызвать оператор обновления из нескольких соединений одновременно, где каждое соединение обрабатывает один поднабор строк в таблице. Все соединения должны работать параллельно.