如果更改 where 条件的值,选择查询可以使用不同的索引吗?
以下两个查询使用不同的索引,唯一的区别是索引的值 条件和 typeenvoi='EXPORT' 或和 typeenvoi='MAIL'
select numenvoi,adrdest,nomdest,etat,nbessais,numappel,description,typeperiode,datedebut,datefin,codeetat,codecontrat,typeenvoi,dateentree,dateemission,typedoc,numdiffusion,nature,commentaire,criselcomp,crisite,criservice,chrono,codelangueetat,piecejointe, sujetmail, textemail
from v_envoiautomate
where etat=0 and typeenvoi='EXPORT'
and nbessais<1
select numenvoi,adrdest,nomdest,etat,nbessais,numappel,description,typeperiode,datedebut,datefin,codeetat,codecontrat,typeenvoi,dateentree,dateemission,typedoc,numdiffusion,nature,commentaire,criselcomp,crisite,criservice,chrono,codelangueetat,piecejointe, sujetmail, textemail
from v_envoiautomate
where etat=0 and typeenvoi='MAIL'
and nbessais<1
谁能给我解释一下吗?
最佳答案
索引的详细信息作为统计存储在 SQL Server 的直方图类型数据集中。
每个索引都分为多个范围,每个范围都包含该范围内键值的摘要,例如:
- 范围高值
- 范围内的值数量
- 范围内不同值的数量(基数)
- 等于最高值的值的数量
...等等。
您可以通过以下方式查看给定索引的统计信息:
DBCC SHOW_STATISTICS(<tablename>, <indexname>)
每个索引都有一些特征,例如密度和最终的选择性,它们告诉查询优化器索引中的每个值可能有多唯一,以及如何唯一该索引的高效之处在于可以快速定位记录。
由于您的查询在 where 子句中包含三列,因此这些列中的任何一个都可能具有对优化器有用的索引。如果其他索引的选择性不够高,也可能会考虑主键索引。
最终,它归结为优化器快速判断需要多少页读取来读取每个非聚集索引+书签查找,并与其他值进行比较,而不是进行表扫描。
这些判断所依据的统计数据也可能有很大差异;默认情况下,SQL Server 仅对任何重要表行的一小部分进行采样,因此该索引的选择性可能无法代表整体。当索引中有高度不唯一的键时,这尤其成问题。
在这种特定情况下,我猜测您的 typeenvoi
索引非常不唯一。既然如此,收集的统计数据可能会向优化器表明其中一个值比另一个值更稀有,并且选择该索引的可能性会增加。
关于sql - 相同的查询使用不同的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1062459/