相同查询使用不同的索引?

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)

任何人都可以给我一个解释吗?

Jer*_*yth 9

有关索引的详细信息将作为统计信息存储在SQL Server中的直方图类型数据集中.

每个索引都会分为多个范围,每个范围都包含该范围内键值的摘要,例如:

  • 范围高价值
  • 范围内的值的数量
  • 范围内的不同值的数量(基数)
  • 值的数量等于高值

...等等.

您可以使用以下命令查看给定索引的统计信息:

DBCC SHOW_STATISTICS(<tablename>, <indexname>)
Run Code Online (Sandbox Code Playgroud)

每个索引都有一些特性,如密度和最终选择性,它们告诉查询优化器索引中每个值的唯一性,以及该索引在快速定位记录方面的效率.

由于您的查询在where子句中有三列,因此这些列中的任何一列都可能具有可能对优化器有用的索引.如果其他索引的选择性不够高,也可能会考虑主键索引.

最终,它归结为优化器快速判断调用读取每个非聚集索引+书签查找需要多少页面读取,与其他值进行比较,而不是进行表扫描.

这些判断所依据的统计数据也可能有很大差异; 默认情况下,SQL Server仅对任何有效表的行中的一小部分进行采样,因此该索引的选择性可能无法代表整体.如果索引中具有高度非唯一键,则这尤其成问题.

在这个特定的情况下,我猜你的typeenvoi索引是非常独特的.既然如此,收集的统计数据可能向优化者指出其中一个值比另一个值更少,并且选择该指数的可能性增加.