Сервисный Брокер SQL-сервера: Как структурировать Переговоры для простого сценария очереди?

В Вашем определенном примере они - то же, потому что оптимизатор выяснил то, что Вы пытаетесь сделать, то же в обоих примерах. Но возможно, что в нетривиальных примерах оптимизатор не может сделать этого, и в этом случае существуют причины предпочесть ту другому при случае.

NOT IN должен быть предпочтен, если Вы тестируете несколько строк в своем внешнем выборе. Подзапрос в NOT IN оператор может быть оценен в начале выполнения, и временная таблица может быть проверена по каждому значению во внешнем выборе, вместо того, чтобы повторно выполнить подвыбор каждый раз, как требовался бы с NOT EXISTS оператор.

, Если подзапрос должен коррелироваться с внешним выбором, то NOT EXISTS может быть предпочтительным, так как оптимизатор может обнаружить упрощение, которое предотвращает создание любых временных таблиц для выполнения той же функции.

16
задан Chris 12 August 2009 в 00:34
поделиться

2 ответа

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

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

Если у вас есть высокие требования к производительности (более 200 запросов в секунду), вам придется начать более явно управлять диалогами. У меня есть запись в блоге о повторном использовании разговоров по соображениям производительности . Что касается принимающей стороны, я рекомендую прочитать Написание процедур брокера служб .

У меня также есть запись в блоге, которая в значительной степени делает то, что вам нужно, хотя и не планирует рабочие элементы, а вместо этого запускает настраиваемую процедуру: Выполнение асинхронной процедуры .

Если вы решите использовать рабочие элементы из активированного контекста, тем самым используя прекрасные возможности самобалансировки активации, тогда вам необходимо понять контекст EXECUTE AS, в котором выполняется активация происходит .

У меня есть запись в блоге о повторном использовании разговоров по соображениям производительности . Что касается принимающей стороны, я рекомендую прочитать Написание процедур брокера служб .

У меня также есть запись в блоге, которая в значительной степени делает то, что вам нужно, хотя и не планирует рабочие элементы, а вместо этого запускает настраиваемую процедуру: Выполнение асинхронной процедуры .

Если вы решите использовать рабочие элементы из активированного контекста, тем самым используя прекрасные возможности самобалансировки активации, тогда вам необходимо понять контекст EXECUTE AS, в котором выполняется активация происходит .

У меня есть запись в блоге о повторном использовании разговоров по соображениям производительности . Что касается принимающей стороны, я рекомендую прочитать Написание процедур брокера служб .

У меня также есть запись в блоге, которая в значительной степени делает то, что вам нужно, хотя и не планирует рабочие элементы, а вместо этого запускает настраиваемую процедуру: Выполнение асинхронной процедуры .

Если вы решите использовать рабочие элементы из активированного контекста, тем самым используя прекрасные возможности самобалансировки активации, тогда вам необходимо понять контекст EXECUTE AS, в котором выполняется активация происходит .

26
ответ дан 30 November 2019 в 16:58
поделиться

Мне очень нравится ответ Ремуса, хотя он не особо касается , почему вы можете предпочесть начинать отдельный разговор по каждому рабочему элементу, а не помещать все рабочие элементы в один разговор. Два примечания, относящиеся к этому:

Во-первых, объединение всех рабочих элементов в один диалог, вероятно, вызовет проблемы параллелизма, если у вас есть несколько потоков / процессов, обрабатывающих рабочие элементы. Рабочие процессы сервис-брокера обычно выглядят следующим образом (в псевдокоде):

begin transaction
receive top n work items from queue
process work items
commit transaction

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

Проблема параллелизма может возникнуть из-за того, что брокер служб запрограммирован таким образом, что каждая команда RECEIVE получает исключительную блокировку чтения для всех сообщений в очереди, которые совместно используют тот же диалог (или группу диалогов), что и те, которые были ПОЛУЧЕННЫ. Эта блокировка сохраняется до тех пор, пока транзакция не будет зафиксирована. (См. Блокировки группы беседы .) Таким образом, если все рабочие элементы в очереди находятся в одном диалоге, то, пока один рабочий процесс находится на этапе «рабочие элементы процесса», никакие другие рабочие процессы не могут выполнять какие-либо действия.

Вторая проблема, связанная с объединением большого количества элементов в один диалог, заключается в том, что это увеличивает количество рабочих элементов, которые вы можете потерять или которые придется повторно обрабатывать в определенных условиях ошибки. Чтобы описать это правильно, я полагаюсь на Ремуса; см. его Переработка бесед , особенно та часть, которая гласит: «Повторное использование одного диалога для отправки всех ваших сообщений [...] похоже на складывание всех ваших яиц в одну корзину». Возможно, вы сможете исправить некоторые из этих ошибочных ситуаций, но это, вероятно, усложнит ваш код.

Вероятно, есть еще несколько аргументов против использования одного диалога для всех рабочих элементов, но я m не так хорошо с ними знаком.

Это не значит, что правильное решение - всегда начинать отдельный разговор для каждого рабочего элемента. Однако после прочтения сообщений Ремуса его совет кажется разумным; начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

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

Вероятно, есть еще несколько аргументов против использования единого диалога для всех рабочих элементов, но я m не так хорошо с ними знаком.

Это не значит, что правильное решение - всегда начинать отдельный разговор для каждого рабочего элемента. Однако после прочтения сообщений Ремуса его совет кажется разумным; начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

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

Вероятно, есть еще несколько аргументов против использования единого диалога для всех рабочих элементов, но я m не так хорошо с ними знаком.

Это не значит, что правильное решение - всегда начинать отдельный разговор для каждого рабочего элемента. Однако после прочтения сообщений Ремуса его совет кажется разумным; начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

Вероятно, есть еще несколько аргументов против использования единого диалога для всех рабочих элементов, но я не так хорошо знаком с ними.

Это не значит, что правильное решение - всегда начинать отдельный разговор для каждого рабочего элемента. Однако после прочтения сообщений Ремуса его совет кажется разумным; начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

Вероятно, есть еще несколько аргументов против использования единого диалога для всех рабочих элементов, но я не так хорошо знаком с ними.

Это не значит, что правильное решение - всегда начинать отдельный разговор для каждого рабочего элемента. Однако после прочтения сообщений Ремуса его совет кажется разумным; начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном диалоге.)

начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

начните с одного рабочего элемента на беседу, а затем при необходимости добавьте сложность. (Но, вероятно, ни в коем случае не следует доходить до крайности, объединяя все сообщения в одном разговоре.)

9
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: