Rox*_*ana 5 sql sql-server indexing sql-server-2005
如果更改where条件的值,select查询是否可以使用不同的索引?
以下两个查询使用不同的索引,唯一的区别是条件的值和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
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个解释吗?
有关索引的详细信息将作为统计信息存储在SQL Server中的直方图类型数据集中.
每个索引都会分为多个范围,每个范围都包含该范围内键值的摘要,例如:
...等等.
您可以使用以下命令查看给定索引的统计信息:
DBCC SHOW_STATISTICS(<tablename>, <indexname>)
Run Code Online (Sandbox Code Playgroud)
每个索引都有一些特性,如密度和最终选择性,它们告诉查询优化器索引中每个值的唯一性,以及该索引在快速定位记录方面的效率.
由于您的查询在where子句中有三列,因此这些列中的任何一列都可能具有可能对优化器有用的索引.如果其他索引的选择性不够高,也可能会考虑主键索引.
最终,它归结为优化器快速判断调用读取每个非聚集索引+书签查找需要多少页面读取,与其他值进行比较,而不是进行表扫描.
这些判断所依据的统计数据也可能有很大差异; 默认情况下,SQL Server仅对任何有效表的行中的一小部分进行采样,因此该索引的选择性可能无法代表整体.如果索引中具有高度非唯一键,则这尤其成问题.
在这个特定的情况下,我猜你的typeenvoi索引是非常独特的.既然如此,收集的统计数据可能向优化者指出其中一个值比另一个值更少,并且选择该指数的可能性增加.