需要与筛选索引帮助

我创建一个Notification表,有如下规格:

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

然而,当我以前和创建这个索引后查询的执行计划,这似乎不会得到使用。 为什么? 需要与筛选索引帮助


更新

由于文章中的接受的答案相连,这里的指数的修正版本:

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

--------------解决方案-------------

SELECT *表示索引通常不会被使用。

你的指标只能满足WHERE子句中,而不是SELECT子句,因此SQL Server决定的指标是没有使用此查询。 换句话说,它不覆盖

这将最有可能使用索引

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

如果您更改索引这一点,那么它涵盖了所有列。 SELECT *现在可以用它

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

如果你有“有效”的记录很多(?多数),那么很可能查询估计不会使用该索引 - 因为查询需要返回各个领域,访问和扫描聚集键(表本身)是无论如何需要。 尝试只选择字段,包含在指数 - 它什么改变?

当你有几个“活跃”的记录(可能低于10-30%左右,取决于行数等诸多因素),那么这将是更有效地使用索引来查找的RID,并寻求他们聚集索引(表)。

另一件事与我会尝试 - 宣布对字段(TriggerKey,的ObjectId)的筛选索引只(如果筛选索引可以创建这样)。 在指数开始把IsActive杀死选择性恕我直言。

请注意,上述所有的猜测只是 - 我已经与筛选索引没有经验。

分类:数据库 时间:2012-03-03 人气:0
本文关键词: 数据库,SQL Server 2008中
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.351 (s). 9 q(s)