Реферат: MSSQL 2005 (Yukon) – работа с очередями и асинхронная обработка данных

Теперь рассмотрим, как можно использовать коммуникативные возможности Service Broker на сервере. Например, можно использовать его для реализации асинхронных триггеров, причем не только для DML- и DDL-операций, но и для событий, отслеживаемых профайлером (trace events), и если DML-триггеры придется реализовывать отчасти с применением обычных, то для DDL-триггеров и событий профайлера предусмотрен специальный механизм.

Асинхронные DML-триггеры

Начнем с DML, идея которых, в общем-то, должна быть очевидна. Допустим, у нас есть очень большая таблица (Very_Big_Table), для отчетов по которой надо периодически считать некие агрегатные значения. Поскольку таблица очень большая, то агрегаты считаются очень долго. Отчет не всегда должен быть актуальным, но всегда – согласованным, и строиться должен максимально быстро. Это значит, что в идеале агрегаты должны быть посчитаны заранее. Делать пересчет данных в обычном триггере накладно для операций обновления, так как расчет агрегатов происходит долго, как уже было упомянуто. И тут на помощь приходит Service Broker. В обычном триггере на изменение Very_Big_Table создается диалог (строго говоря, мало что мешает создать диалог заранее, разве что проблемы с запоминанием метки при развертывании) и отправляется сообщение, о том что таблица изменилась. Это занимает минимум времени, а изменяющий процесс идет дальше заниматься своими делами. Получатель же начинает не торопясь пересчитывать эти занудные агрегаты, чтобы к моменту, когда понадобится отчет, все уже было готово.

Вот как это может выглядеть. Сначала создадим необходимые тестовые таблички:

CREATE TABLE Very_Big_Table(ID int IDENTITY, Data bigint, [Time] DateTime)

GO

-- заполнимтаблицуданными

--

INSERT INTO Very_Big_Table(Data, [Time])

SELECT object_id, create_date FROM sys.objects

GO

-- табличка для вычисленного агрегата

--

CREATE TABLE Big_Aggregate(Agg bigint, [Time] DateTime)

GO

-- Ну и проинициализируем ее

--

INSERT INTO Big_Aggregate(Agg, [Time])

SELECT Sum(Data), GetDate() FROM Very_Big_Table

Теперь триггер на изменение очень большой таблички. Здесь мы сильно мудрствовать не будем, воспользуемся уже готовыми метаданными из предыдущего примера:

CREATE TRIGGER AsyncAggregate ON Very_Big_Table

FOR INSERT, UPDATE, DELETE

AS

DECLARE @convHandler uniqueidentifier

BEGIN DIALOG @convHandler

FROM SERVICE [SourceService]

TO SERVICE 'TargetService'

ON CONTRACT [TestContract];

SEND ON CONVERSATION @convHandler

К-во Просмотров: 207
Бесплатно скачать Реферат: MSSQL 2005 (Yukon) – работа с очередями и асинхронная обработка данных