我认为提问者在问
'为什么我不能做一个像'这样的索引:
create index index_name
on table_name
(
*
)
这方面的问题已得到解决。
但鉴于听起来他们正在使用 MS sql 服务器。了解您可以在索引中包含非键列是很有用的,因此这些列的值可用于从索引中检索,但不能用作选择标准:
create index index_name
on table_name
(
foreign_key
)
include (a,b,c,d) -- every column except foreign key
我创建了两个具有一百万行相同的表
我像这样索引表A
create nonclustered index index_name_A
on A
(
foreign_key -- this is a guid
)
和这样的表B
create nonclustered index index_name_B
on B
(
foreign_key -- this is a guid
)
include (id,a,b,c,d) -- ( every key except foreign key)
毫不奇怪,表 A 的插入速度稍快一些。
但是当我运行这些查询时
select * from A where foreign_key = @guid
select * from B where foreign_key = @guid
在表 A 上,sql server 甚至没有使用索引,它进行了表扫描,并抱怨缺少索引,包括 id,a,b,c,d
在表 B 上,查询速度提高了 50 倍以上,而 io 少得多
强制 A 上的查询使用索引并没有使其更快
select * from A where foreign_key = @guid
select * from A with (index(index_name_A)) where foreign_key = @guid