2011-09-08 99 views
2

我在SQL Server中创建一个简单的表:试图了解SQL执行计划

MemberId INT PRIMARY KEY Identity 
Name NVARCHAR(100) NULL 
Description NVARCHAR(250) NULL 

已添加了一个聚集索引,当我创建成员Id作为主键的唯一指标。我没有为名称或说明添加索引。

我增加大约30,000行测试数据表中,并做了以下查询:

SELECT * FROM Members WHERE Name = 'Foo' 

执行计划表示如下:

Clustered Index Scan - cost 100% 

这是如何聚集索引扫描?我不预测聚集索引。我认为这将是更多的表扫描。谁可以给我解释一下这个?如果不这样做会导致表扫描到底是什么?

+0

通常的要求是,你应该尝试在该列上创建一个具有非聚集索引的相同表格,用相同的30,000行填充它,然后对每个表格运行查询,并比较这些计划。你应该看到一个非聚集索引seek,它应该更有效率(对于这个查询,至少)。 –

回答

5

如果表具有聚簇索引,则clustered index scan与全表扫描相同。聚簇索引本身包含所有数据。

+0

因此,如果您的表有很多行,那么聚簇索引扫描的性能不好?如果我有五千万行并运行这个查询,它可能表现很差?我将如何修改这个表/查询,以便我能够看到表中的好奇心? – Travis

+0

当然,如果你没有'name'列上的索引,它会扫描所有的行。 – a1ex07

+0

我相信你需要删除pk约束,然后pk,然后创建pk为非群集。所以你会有堆表,'聚簇索引扫描'将变成'表扫描'。 – a1ex07

1

,如果你有这个

MemberId INT PRIMARY KEY NONCLUSTERED IDENTITY

改变你的主键声明中,你会发现表扫描直到没有聚集索引。创建聚集索引后,您的表结构将会发生变化,并由您的聚簇索引键在物理上进行排序。我认为表扫描并不意味着之后,并用聚簇索引扫描代替。只要没有有用的索引被发现覆盖在另一个词表扫描查询

唯一有意义时表数据不聚集。如果按名称搜索将是一个存储为heap structure

What's the difference between a Table Scan and a Clustered Index Scan?

+0

从什么时候开始堆砌最佳实践?聚簇索引扫描是一次表扫描。 – gbn

+1

这不是最好的做法。他试图理解sql执行计划,并且正在寻找缺少的表扫描。我认为这对他能够找到表扫描很有帮助, –