【发布时间】:2010-12-30 13:45:37
【问题描述】:
我正在尝试提高运行速度非常慢的查询的性能。经过实际执行计划后;我发现 Clustered Index Seek 占用了 82%。我有什么方法可以提高 Index Seek 的性能吗?
索引:
/****** Object: Index [IX_Stu] Script Date: 12/28/2009 11:11:43 ******/
CREATE CLUSTERED INDEX [IX_Stu] ON [dbo].[stu]
(
[StuKey] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
表格(为简洁起见省略了一些列):
CREATE TABLE [dbo].[stu](
[StuCertKey] [int] IDENTITY(1,1) NOT NULL,
[StuKey] [int] NULL
CONSTRAINT [PK_Stu] PRIMARY KEY NONCLUSTERED
(
[StuCertKey] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
【问题讨论】:
-
将聚簇索引放在主键以外的东西上对我来说是个坏主意吗?该查询从不使用主键,所以我认为最好在连接最多的列上创建聚集索引(StuKey)
-
您可以发布查询吗?此外,表中有很多行,查询返回大约多少行?
-
聚集索引不需要在主键上;但是,这通常表明 PK 本身是多余的。如果您在 PK 上有从未使用过的二级索引,则会损害整体性能。
-
该表有大约 800 万行。该表中有大约 600 万个不同的 StuKey 值。该查询返回大约 50 行,比我在这里展示的要复杂得多。
-
如果它不是唯一的,你通常不应该把聚集索引放在它上面。使用常规索引并包含您需要它覆盖的任何列。
标签: sql sql-server query-performance sql-execution-plan