我有一个表 [table],其中有两列需要过滤:[column1] 和 [column2]。
在我的程序中,我执行如下查询:
select * from [table] where [column1] = 'foo' and [column2] = 'bar';
哪个更快:
- 创建两个索引,每列一个。 ([第 1 列] 和 [第 2 列])
- 创建一个包含两列的索引。 ([列1]+[列2])
这个问题困扰了我一段时间,我不知道查询优化是如何工作的,也不知道SQL Server如何使用创建的索引来加速查询。
最佳答案
对于此查询,第二个总是更快 - 但您需要将更具选择性的查询放在第一位(按索引顺序)以获得更多好处。唯一的异常(exception)是,如果出于性能原因,SQL 决定使用聚集索引,因此会忽略非聚集索引。
两个值的组合创建了更具选择性的标准。它还有助于提高性能,因为没有 BOOKMARK LOOKUP覆盖索引所需。
书签查找是主要性能下降的根源,这就是为什么覆盖索引总是优于 2 个索引的原因。
更新
请记住,如果您的索引为column1+column2,则仅对column2进行搜索无法使用此索引,因此您还需要在column2上有一个单独的索引。
关于sql-server - SQL Server 上多列查询的多列索引优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194208/