根据可选数据进行过滤

时间:2019-01-30 19:29:03

标签: sql-server sql-server-2016 query-performance

我有一个包含三个表的消息传递系统:Event_Types,Messages和Event_Subscription。所有消息都有一个事件类型,每个事件类型可以有0个或更多订阅。在“事件订阅”表中有一组列,可用于进一步过滤传入的消息。因此,如果我在Event_Subscription中将Src设置为非空值,则表示我只希望从该事件类型中获取具有该事件类型的消息特定来源。

当前,我们的查询是writer,以便针对每一列检查是否为空,如果不是,则按该列过滤消息。我相当确定这不会很好地执行,特别是因为我们的实际产品版本将有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])

0 个答案:

没有答案