Параллельная обработка запросов в определенной хранимой процедуре - PullRequest
1 голос
/ 26 февраля 2012

Я читал о параллелизме в книге, посвященной оракулу, где они упоминают, что вы можете сделать что-то вроде ALTER TABLE Order PARALLEL 3; Мой вопрос:

Если у меня есть запрос, который извлекает данные на основе поиска, и яхотите добавить к нему параллелизм, как бы я поступил в Microsoft SQL Server?Например:

ALTER PROC MY_SP
@SOMEPARAMETER NVARCHAR(2000)
AS

  SELECT DESCRIPTION 
    FROM ORDERS 
   WHERE DESCRIPTION LIKE '%' + @SOMEPARAMETERHERE +'%'

Как я могу реализовать параллелизм для этого запроса?

ПРИМЕЧАНИЕ: Извините, если синтаксическая ошибка, это всего лишь пример того, чего я хотел бы достичь.

1 Ответ

2 голосов
/ 26 февраля 2012

Параллелизм SQL Server определяется двумя значениями: максимальная степень параллелизма (MAXDOP) и порог стоимости для параллелизма. MAXDOP может быть установлен на уровне сервера как значение по умолчанию, и вы можете использовать подсказку запроса. Установка MAXDOP в 0 означает, что оптимизатор SQL Server рассмотрит возможность использования как можно большего числа параллельных процессов, если запрос пройдет порог стоимости для параллелизма. Если вы установите MAXDOP на 1, он более или менее удалит параллелизм из опций. Любое другое число действует как ограничение, поэтому, если у вас есть, например, 4 процессора, но вы установили MAXDOP на 2, то для любого данного запроса будут использоваться только два (не обязательно два одинаковых, просто два).

Настоящим кикером является порог стоимости параллелизма. По умолчанию установлено значение 5, что, откровенно говоря, слишком мало. Параллельное выполнение запросов является очень дорогой операцией, разделяя потоки, обрабатывая все, собирая потоки вместе, поэтому вы хотите, чтобы он выполнялся только на дорогих запросах. Для системы OLTP я бы предложил увеличить это значение до 40 и протестировать оттуда. Для системы отчетности я бы также предложил увеличить значение до 25 и провести тестирование с этого момента.

Ваш запрос без JOIN и простого, хотя и нецелевого предложения WHERE, вероятно, будет иметь очень низкую оценочную стоимость. Маловероятно, что оно превысит 1, но если вы просто хотите поэкспериментировать с параллелизмом, взгляните на план выполнения запроса, чтобы определить, превышает ли его стоимость значение 1. Если это так, уменьшите пороговое значение стоимости до 1 и предоставить подсказку MAXDOP для запроса. Затем вы должны увидеть параллельное выполнение. Но посмотрите, как быстро он работает и сколько ресурсов он использует, и сравните его с непараллельным выполнением. Вы хотите быть уверены, что это сработает для вас позитивно.

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