在现有的非聚集索引中包含列或添加新的非聚簇索引

时间:2017-09-08 14:36:17

标签: sql sql-server tsql indexing sql-server-2008-r2

表格Props已经列有non-clustered index列' CreatedOn'但是,为了显着提高频繁运行的查询的查询性能,此索引不会include某些其他列。

要解决这个问题,最好是;

    1。使用包含的列或
创建其他非聚集索引
    2。更改现有索引以将其他列添加为包含的列?

另外:

    - 我的决定将如何影响当前使用非聚集索引的其他查询的性能?
    - 如果最好更改现有索引,是否应该删除并重新创建或更改现有索引以添加包含的列?

下表的简化版本以及相关索引:

CREATE TABLE dbo.Props(
    PropID int NOT NULL,
    Reference nchar(10) NULL,
    CustomerID int NULL,
    SecondCustomerID int NULL,
    PropStatus smallint NOT NULL,
    StatusLastChanged datetime NULL,
    PropType smallint NULL,
    CreatedOn datetime NULL,
    CreatedBy int NULL
CONSTRAINT PK_Props PRIMARY KEY CLUSTERED 
(
    PropID ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO

当前指数:

CREATE NONCLUSTERED INDEX idx_CreatedOn ON dbo.Props
(
    CreatedOn ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO

新索引或变更索引中所需的所有5列都是; foreign key列,smallint和int的混合,可空和不可空。

在示例中,include的列是:CustomerID,SecondCustomerID,PropStatus,PropType和CreatedBy。

1 个答案:

答案 0 :(得分:2)

一如既往......这取决于......

作为具有冗余索引的一般规则是不可取的。因此,在没有其他信息的情况下,您最好添加包含的列,使其成为覆盖索引。

也就是说,原始索引可能是针对另一个"高频率"查询...所以现在您必须确定天气是否增加的索引页数会对在其当前状态中使用索引的现有查询产生负面影响。

您还希望查看与查询其余部分相关的密钥查找费用。如果密钥查找仅占总成本的一小部分,则性能增益不太可能抵消维持较大索引的费用。