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

需要有关筛选索引的帮助

  •  1
  • StriplingWarrior  · 技术社区  · 14 年前

    我正在创建一个带有以下规范的 notification table:。

    create table[notification](
    [notificationID][int]非空标识(1,1),
    [isactive][bit]不为空,
    [触发器键][nvarchar](50)不为空,
    [objectid][int]不为空,
    [收件人类型][tinyint]不为空,
    约束pk_通知主键已群集
    (
    [通知ID]ASC
    )
    )
    < /代码> 
    
    

    每次通知更改时,我都要创建一个新的“活动”通知并停用前一个通知,而不是更新其值。但当notificationID指定时,上一个通知仍需要可访问。因此,我预计最终会有比活动通知更多的非活动通知。

    添加或更改通知的情况比较少见。更常见的是:

    1. 基于notificationID对与此表联接的外部表的查询,以及
    2. 查询具有给定triggerkey和objectid的“活动”通知

    对于第一种情况,我认为主键索引就足够了。 对于第二种情况,我正在考虑创建以下筛选索引:

    创建非聚集索引idx_notification_activetriggerbject
    在[通知]上(isactive、triggerkey、objectid)
    其中isactive=1
    < /代码> 
    
    

    但是,当我在创建这个索引之前和之后检查执行计划时,它似乎没有被使用。为什么?

    < H1>更新< /H1 >

    感谢

    创建非聚集索引idx_notification_activetriggerbject
    在[通知]上(triggerkey,objectid)
    包括(IsActive、NotificationID、RecipientType)
    其中isactive=1
    < /代码> <以下规格:

    CREATE TABLE [Notification] (
        [NotificationId] [int] NOT NULL IDENTITY (1, 1),
        [IsActive] [bit] NOT NULL,
        [TriggerKey] [nvarchar](50) NOT NULL,
        [ObjectId] [int] NOT NULL,
        [RecipientType] [tinyint] NOT NULL,
        CONSTRAINT PK_Notification PRIMARY KEY CLUSTERED 
        (
            [NotificationId] ASC
        )
    )
    

    每次通知更改时,我都要创建一个新的“活动”通知并停用前一个通知,而不是更新其值。但当notificationID指定时,上一个通知仍需要可访问。所以我希望最终有比活动通知更多的非活动通知。

    添加或更改通知的情况比较少见。更常见的是:

    1. 基于notificationID对与此表联接的外部表的查询,以及
    2. 查询具有给定triggerkey和objectid的“活动”通知

    对于第一种情况,我认为主键索引就足够了。 对于第二种情况,我正在考虑创建以下筛选索引:

    CREATE NONCLUSTERED INDEX IDX_Notification_ActiveTriggerObject 
    ON [Notification] (IsActive, TriggerKey, ObjectId)
    WHERE IsActive = 1
    

    但是,当我在创建这个索引之前和之后检查执行计划时,它似乎没有被使用。为什么? alt text

    更新

    多亏了the article链接到接受的答案中,这里是索引的更正版本:

    CREATE NONCLUSTERED INDEX IDX_Notification_ActiveTriggerObject 
    ON [Notification] (TriggerKey, ObjectId)
    INCLUDE (IsActive, NotificationId, RecipientType)
    WHERE IsActive = 1
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   gbn    14 年前

    SELECT *

    covering

    SELECT IsActive, TriggerKey, ObjectId
    FROM [Notification]
    WHERE IsActive = 1 AND ObjectId = 2 AND TriggerKey = 'test'
    

    CREATE NONCLUSTERED INDEX IDX_Notification_ActiveTriggerObject 
    ON [Notification] (IsActive, TriggerKey, ObjectId)
    INCLUDE (RecipientType, NotificationId)
    WHERE IsActive = 1
    
        2
  •  1
  •   Arvo    14 年前