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

标签 sql sql-server sql-server-2005 indexing

如果更改 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/

相关文章:

sql-server - 将 GUID 连接到字符串 - Entity Framework 产生缓慢的查询

c# - 错误-使用SQLDataReader时即使存在数据,“在没有数据存在时也无效的读取尝试。”

sql-server - SQL Server : "MoSTLy-unique" index

sql - Postgres 每天的首次用户

SQL 计算相同数字 block 的长度,同时忽略变化数字的 block

php - 如何在MYSQL/SQL中查询本例的数据?

SQL 首先选择某个值

mysql - 错误 1054 : Unknown Column

sql - 如果表来自同一服务器不同的数据库,为什么会出现错误 'invalid object name'?

sql - 使用 Joined-Tables 排除某些记录