У меня есть система обмена сообщениями с тремя таблицами: Event_Types, Messages и Event_Subscription.Все сообщения имеют тип события, и каждый тип события может иметь 0 или более подписок.В таблице подписки на события есть набор столбцов, которые можно использовать для дальнейшей фильтрации входящих сообщений. Поэтому, если я установил для Src ненулевое значение в Event_Subscription, я говорю, что я хочу только сообщения с этими типами событий из этогоконкретный источник.
В настоящее время наш запрос является записывающим, так что для каждого столбца мы проверяем, является ли он пустым, а если нет, то фильтруем сообщение по этому столбцу.Я вполне уверен, что это не будет работать хорошо, тем более что в нашей действующей версии prod будет 11 различных столбцов для фильтрации.
Мой вопрос: есть ли более эффективный способ фильтрации таблицы сообщений?по таблице подписки на событие?
пример
IF OBJECT_ID('tempdb..#event_types') IS NOT NULL
DROP TABLE #event_types
IF OBJECT_ID('tempdb..#messages') IS NOT NULL
DROP TABLE #messages
IF OBJECT_ID('tempdb..#event_subscription') IS NOT NULL
DROP TABLE #event_subscription
CREATE TABLE #event_types
(
PK_EventTypeID INT IDENTITY(1, 1) PRIMARY KEY,
EventTypeName VARCHAR(50)
)
CREATE TABLE #messages
(
PK_MessageID INT IDENTITY(1, 1) PRIMARY KEY,
FK_EventTypeID INT NOT NULL,
Src VARCHAR(50),
[Version] VARCHAR(50)
)
CREATE TABLE #event_subscription
(
PK_EventSubscriptionID INT IDENTITY(1, 1) PRIMARY KEY,
FK_EventTypeID INT NOT NULL,
SubScriberID INT NOT null,
Src VARCHAR(50) null,
[Version] VARCHAR(50) null
)
INSERT INTO #event_types ( EventTypeName )
VALUES ('Insert'), ('Update'), ('Delete')
INSERT INTO #event_subscription
(
FK_EventTypeID,
SubScriberID,
Src,
[Version]
)
VALUES
( 1, 1000, null, null ), /* all inserts */
( 2, 1001, 'System A', '1.0.0' ) /*All updates from System A with version 1.0.0*/
INSERT INTO #messages ( FK_EventTypeID, Src, Version )
VALUES
( 1, 'System A', '1.0.0' ),
( 1, 'System B', '2.0.0' ),
( 2, 'System A', '1.0.0' ),
( 2, 'System B', '2.0.0' )
SELECT *
FROM #messages m
INNER JOIN #event_types et
ON m.FK_EventTypeID = et.PK_EventTypeID
INNER JOIN #event_subscription es
ON m.FK_EventTypeID = es.FK_EventTypeID
WHERE (es.Src IS NULL OR m.Src = es.Src)
AND (es.[Version] IS NULL OR m.[Version] = es.[Version])