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,c

Read 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?的主要内容,如果未能解决你的问题,请参考以下文章

现有的 DAO 代码是不是适用于 SQL Server?

这个 mySQL “空间”查询是不是也适用于 SQL Server 2008?

Connection.setAutoCommit(true) 是不是适用于 SQL 存储过程和函数?

静态方法是不是适用于 Linq To SQL DAL?

分区是不是适用于 SQL Server 2005 标准版 SP2

CSRF 攻击是不是适用于 API?