0

我有一个只有 400-500 行的表,但是这个表经常被访问所以我想知道是否应该在它的一个列上添加一个非聚集索引以查看任何改进?

该表始终保持相同的数据,很少更新。

这是表的结构

CREATE TABLE [dbo].[tbl_TimeZones](
    [country] [char](2) NOT NULL,
    [region] [char](2) NULL,
    [timezone] [varchar](50) NOT NULL
) ON [PRIMARY]

使用此集群索引:

CREATE CLUSTERED INDEX [IX_tbl_TimeZones] ON [dbo].[tbl_TimeZones] 
(
    [country] ASC,
    [region] ASC,
    [timezone] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

该表没有主键,因为区域列可能为,这就是为什么我还没有使用键的原因。

所以我想在列时区上添加一个非聚集索引以提高它的性能。

4

1 回答 1

1

简短的回答:索引可能会为您提高性能。

更长的答案。即使只有这么多的记录,您也可以通过精心挑选的索引看到查询改进。假设此表用于连接,您可以看到通过该表连接的查询计划中的更改(改进),这可能会给您带来比您预期的更大的好处。

您似乎给人的印象是您希望索引“一个”列。仅索引一列可能不是最佳解决方案。“覆盖”索引通常会是更好的解决方案(谷歌为“覆盖索引”)。

现在,说了这么多,我怀疑最好的性能可能来自聚集索引的定义方式。您没有说明此表上聚集索引的性质或数据的用途。但是,如果查询几乎总是以相同的方式访问表(例如,WHERE 和 JOIN 子句总是引用相同的列),那么您可能会发现更改聚集索引会带来最大的改进。

此外,选择索引的部分技巧涉及平衡查询性能与插入/更新性能。如果数据没有变化,你就没有这个挑战。在阅读一般索引调整建议时请记住这一点。

底线:我怀疑在 WHERE 和 JOIN 子句中使用的列上的聚集索引是答案。考虑列顺序问题。选择性很重要。

于 2011-12-17T03:05:41.427 回答