none
Почему процедура компилируется с параллельным планом. RRS feed

  • Общие обсуждения

  •  

    Сервер - 2000 SP4, build 2187, 32bit

    На сервере настроено MAXDOP=1

     

    Переписали одну из процедур, выяснилось, что она стала перекомпилиться, всегда под одним из пользователей.

    Исследование syscacheobjects показало, что когда процедура выполняется "нормально", то она компилируется с setopts = 0 (у нас принято @@OPTIONS=0) и перекомпиляция "для других" не происходит.

    При компиляции же для этого специфического пользователя (это некий робот со своим отдельным приложением, оно давно не менялось, пока не попадает под подозрения), setopts=2

    Поиски в инете и документации показали, что это означает, что был скомпилирован план с параллельным выполнением.

    Процедура эта "внутренняя", напрямую ее никто не запускает, она используется только в одной из других процедур, также "внутренних".

    Робот и другие пользователи запускают разные процедуры "верхнего уровня".

     

    Но вопрос - как можно сделать, чтобы план для процедуры вцелом компилировался с такой установкой?

    Возможность переконфигурирования сервера "роботом" практически исключена - ни в трассе, ни внутри процедур "следов" sp_configure и RECONFIGURE не найдено.

     

    17 декабря 2007 г. 17:18
    Отвечающий

Все ответы

  • Скорее всего у Вас индекс создан с опцией MAXDOP, типа:

     

    CREATE INDEX IX_ProductVendor_VendorID
    ON Purchasing.ProductVendor (VendorID)
    WITH (MAXDOP=8);
    GO

    Почитайте про это: http://msdn2.microsoft.com/ru-ru/library/ms189329.aspx

     

    Или в запросе используется подсказка оптимизатору, типа: http://msdn2.microsoft.com/ru-ru/library/ms181714.aspx

    17 декабря 2007 г. 20:00
  •  

    Сервер 2000, соответственно, WITH(MAXDOP N) нам при создании индексов недоступен.

    К тому же, хотелось бы понять, почему это распространяется только на одного пользователя/приложение.

     

    Подсказок оптимизатору MAXDOP в данной процедуре нет, хотя есть в одной из процедур более высокого уровня - попробуем ее убрать, посмотреть эффект. Не исключаю, что оптимизатор может поглюкивать, распространяя эту опцию на остальные запросы данного соединения. Заодно надо посмотреть, какие еще процедуры компилятся с этой опцией.

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

     

    PS Еще раз поздравляю! Wink

    17 декабря 2007 г. 21:24
    Отвечающий
  • Спасибо за поздравление

     

    Глобальную установку можно перебить только хинтом, т.ч. поищите внимательно, где исползование индекса может происходить с подсказкой MAXDOP... Из того, что написано в BOL, можно сделать вывод что действие подсказок не должно выходить за рамки запроса... может она спрятана в представлениях, триггерах или функциях... К тому же, если индекс используется в запросе повторно, наверняка установка MAXDOP не буде сбрасываться... 

    18 декабря 2007 г. 6:55