【问题标题】:Include columns in an existing non-clustered index or add a new non-clustered index在现有的非聚集索引中包含列或添加新的非聚集索引
【发布时间】:2018-02-17 12:36:42
【问题描述】:

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。

【问题讨论】:

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


    【解决方案1】:

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

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

    也就是说,原始索引可能是为另一个“高频”查询构建的...所以现在您必须确定天气是否增加的索引页数会对使用该索引的现有查询产生不利影响当前状态。

    您还想查看与查询的其余部分相关的键查找的开销。如果键查找仅占总成本的一小部分,则性能提升不太可能抵消维护较大索引的费用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多