Внутренние уведомления о запросах - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать Уведомления о запросах в качестве облегченного (er) весового способа определения изменения данных в таблице. Я знаю, что они используют Service Broker, и (хотя мне трудно объяснить, почему именно) они выглядят так, как будто они предпочтительнее чего-то вроде CDC или Trigger.

Уведомления о запросах настраиваются путем предоставления базе данных запроса, который отправляет уведомление " ... когда результаты [предоставленного] запроса изменяются ".

Для меня это звучит так, как будто они говорят, что любой вопрос, который вы ему задали, будет повторяться снова и снова. Я думаю, что, возможно, неправильно истолковываю, что именно SQL делает под прикрытием с этим запросом для отслеживания указанных изменений, но я не смог найти в Интернете ничего о том, что происходит на самом деле. Я надеюсь, что это что-то вроде того, что он анализирует запрос и устанавливает супер-легковесные «триггеры» для любого объекта, на который есть ссылка в запросе, но, поскольку я не знаю, я не хочу использовать эту функцию.

Кто-нибудь достаточно знаком с компонентом Service Broker и функцией уведомления о запросах, чтобы объяснить, как ядро ​​базы данных отслеживает изменения в предоставленном запросе?

1 Ответ

0 голосов
/ 07 января 2019

Основан на той же технологии, что и материализованные (индексированные) представления. Когда вы устанавливаете QN для запроса «Выбрать ... из .... где», движок настраивает поддельное индексированное представление с тем же запросом. Всякий раз, когда вы запускаете какой-либо DML, план выполнения должен поддерживать «поддельные» индексированные данные представления и соответствующим образом генерировать план. Когда (и если) выполнение DML фактически пытается обновить строку в фиктивном индексированном представлении, это признак того, что исходный запрос, вероятно, изменил результаты, и уведомление было запущено. «Поддельное» индексированное представление затем удаляется. Скажем так: «поддельное» индексированное представление никогда не материализуется (фактических строк не существует).

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

Статья, на которую ссылается Мартин, объясняет то же самое, но оставляя это здесь как ответ для будущей ссылки.

...