【发布时间】:2018-08-31 18:53:47
【问题描述】:
我遇到了一种奇怪的情况,在我的选择列表中包含一个值决定了我的索引是否用于查找。
我在 cTable(cf1,cf2,cf3) 上创建了一个索引。
在第一种情况下,对 cTable 执行表扫描:
select
a.bkey
,c.mappedvalue
from
aTable a
LEFT JOIN bTable b
ON b.bkey = a.bkey
LEFT JOIN cTable c ON (
c.[cf1] = b.[cf1] and
c.[cf2] = b.[cf2] and
c.[cf3] = a.[cf3]
)
;
但是,当我从选择列表中删除 mappedvalue 列时,会使用索引:
select
a.bkey
--,c.mappedvalue
from
aTable a
LEFT JOIN bTable b
ON b.bkey = a.bkey
LEFT JOIN cTable c ON (
c.[cf1] = b.[cf1] and
c.[cf2] = b.[cf2] and
c.[cf3] = a.[cf3]
)
;
有人遇到过这个吗?优化器只是决定避免索引吗?
【问题讨论】:
-
对于你的最后一个问题,是的,它选择忽略它。 a 和 b 表的索引是什么?
-
截至目前,
a和b在对应的c字段上没有索引。我对此感到疑惑,但a是一个巨大的表,所以在请求索引之前我需要确定。 -
投了赞成票,不是因为这个问题,而是因为开始并参与了一次好的学习对话。
-
提示:对于数据库性能问题,包含实际执行计划会很有帮助。一个方便的工具是Paste The Plan。
标签: sql-server tsql indexing