Index的“最左前缀规则”是不是适用于SQL Server?
Posted
技术标签:
【中文标题】Index的“最左前缀规则”是不是适用于SQL Server?【英文标题】:Does the "leftmost prefix rule" of Index applies to SQL Server?Index的“最左前缀规则”是否适用于SQL Server? 【发布时间】:2020-08-24 01:10:50 【问题描述】:在mysql中,最左边的前缀适用于多列索引的情况,在
中提到 https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html假设索引由 (col1, col2, col3) 组成。 符合索引搜索条件的组合:
(col1) (col1, col2) (col1, col2, col3)不符合索引搜索条件的组合:
(col2) (col2, col3) (col3)SQL Server 是否也对索引查找机制使用相同的规则?有官方文档可以参考吗?我试过搜索它,但没有运气:(提前谢谢大家!
【问题讨论】:
【参考方案1】:该规则基本上就是扫描 b-tree 索引的规则。
也就是说,还有另一种扫描方法,Oracle 称之为“跳过扫描”。这允许在索引中不是最左侧的键上扫描索引。一些数据库在更大程度上实现了这一点。 Here 是对该主题的一个很好的介绍。我不相信 SQL Server 实现了跳过扫描。
虽然跳过扫描功能强大,但它们的实用性取决于索引中第一个键的基数。如果第一个键具有高基数,则它们不是很有效。
【讨论】:
恭喜1MM!!!!希望我亲眼目睹了这件大事。 @JohnCappelletti 。 . .谢谢。【参考方案2】:对于复合索引,SQL Server 也遵循类似的方法,其中仅考虑从左侧开始的列进行索引查找。以下是相同的官方文档:
(a,b,c) 上的索引对于以下搜索查询很有用
一个 a,b a,b,cRead more on Index Design practices on MSDN
如果索引包含多个,请考虑列的顺序 列。在等于的 WHERE 子句中使用的列 (=)、大于 (>)、小于 (
例如,如果索引定义为 LastName,则 FirstName 为索引 当搜索条件为 WHERE LastName = 'Smith' 时将很有用 或 WHERE LastName = Smith AND FirstName LIKE 'J%'。但是,查询 优化器不会将索引用于仅搜索的查询 FirstName (WHERE FirstName = 'Jane')
【讨论】:
以上是关于Index的“最左前缀规则”是不是适用于SQL Server?的主要内容,如果未能解决你的问题,请参考以下文章
这个 mySQL “空间”查询是不是也适用于 SQL Server 2008?
Connection.setAutoCommit(true) 是不是适用于 SQL 存储过程和函数?