代码之家  ›  专栏  ›  技术社区  ›  DForck42

基于可选数据的筛选

  •  1
  • DForck42  · 技术社区  · 5 年前

    我有一个消息传递系统,有三个表:事件类型、消息和事件订阅。所有消息都有一个事件类型,每个事件类型可以有0个或更多订阅。事件订阅表中有一组列,可用于进一步筛选传入的消息。因此,如果我在Event_Subscription中将Src设置为非空值,我的意思是我只需要来自特定源的具有该事件类型的消息。

    目前,我们的查询是writer,对于每一列,我们检查它是否为null,如果不是null,则按该列过滤消息。我相当肯定这不会有好的表现,特别是因为我们实际的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])
    
    0 回复  |  直到 5 年前