对于一个有786602行的表,我有两个索引:
CREATE NONCLUSTERED INDEX [IX1]
ON [dbo].[O] ([A] ASC, [B] ASC)
INCLUDE ([c1], [c2], [c3])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX2]
ON [dbo].[O]([A] ASC, [B] ASC)
INCLUDE ([c1], [c2], [c3], [c4], [c5], [c6], [c7], [c8], [c9], [c10])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]以下查询都使用IX2:
select [c1], [c2], [c3]
from [O]
where A = 9 AND B = 10
select [c1], [c2], [c3], [c4], [c5], [c6], [c7], [c8], [c9], [c10]
from [O]
where A = 9 AND B = 10禁用IX2显示查询1使用具有相同性能的IX1。
为什么第一个查询不使用IX1,因为它似乎完全符合需求?
SQL Server真的那么聪明吗?:-)
直接丢弃X1是省钱吗?(这是我的初衷,所以我开始测试X1的使用情况,只是想知道为什么从来不使用)
发布于 2015-10-26 02:04:48
虽然我不能用任何正式文件来证实这一点,但理由必须根据所列栏目的总规模和费用。
通过我进行的测试,10列和3列的索引具有完全相同的成本和逻辑/物理读取,我认为这与原始海报的环境相同。我逐渐增加了第四栏的大小,在一定程度上,操作系统开始为第一条语句选择第一种索引。使用的桌子大约有55k行。
这只显示了关于优化器某些行为的轶事证据和理论。如果这个理论不正确的话,我希望真正知道它的意义的人会解释为什么。
https://dba.stackexchange.com/questions/118879
复制相似问题