我创建了一个表来测试正在读取的逻辑块的数量,以及查询优化器选择的执行计划,比较这个表有索引时和没有索引时的查询。
测试表是
create table scan
(
id int identity(1, 1),
a varchar(10),
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10)
)当我运行这些查询时:
select * from scan
select id from scan我有88和58个逻辑读取,还有一个表格扫描算法。
然后,我修改了表,将pk约束和他的集群id放在一起
alter table scan
add constraint fk_id primary key (id)然后运行相同的查询:
select * from scan
select id from scan我得到了90和60扫描读取和索引扫描算法。
问题是:如果查询优化器选择运行查询的最佳方式,那么如果表扫描可以读取较少的块,为什么要选择索引扫描?
发布于 2014-11-27 06:59:55
当您创建主键约束时,默认情况下它是群集的。这意味着您以前的堆是由这个键排序的(在您的例子中是id)。
表中的数据可以通过两种方式之一存储:堆或群集索引。当后者被创造时,前者就消失了。因此,Server不可能对索引执行表扫描--它只能是索引扫描(聚集索引扫描,顺便说一句,这很重要)。
我知道这听起来可能很混乱,但试着阅读一些关于聚集索引的基本知识--这可能会有所帮助。
https://stackoverflow.com/questions/27159975
复制相似问题