Вопрос

Я получил большую работу по преобразованию 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 и т. д.), а затем вызвать оператор обновления из нескольких соединений одновременно, где каждое соединение обрабатывает один поднабор строк в таблице. Все соединения должны работать параллельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top