首页 > 解决方案 > 从性能的角度来看,以下 SQL 查询是麻烦还是正常?

问题描述

有人可以告诉我以下查询从性能角度是好还是坏?

CREATE INDEX tbl_index ON tbl_example(column1, column2)

SELECT ID, column1, column2
FROM tbl_example
WHERE column1 = @param1
AND   column2 = @param2

SELECT ID, column1, column2
FROM tbl_example
WHERE column2 = @param2

标签: sqltsql

解决方案


实际上,这两个查询都可能无法使用索引。在第一个查询中,WHERE子句可以使用索引。但是,除了column1和之外column2,您还选择了ID。该索引不包含该ID值,这意味着 SQL Server 必须在聚集索引上进行查找才能找到该值。考虑到这种查找的成本,优化器可能会选择根本不使用索引。

对于第二个查询,该WHERE子句限制使用column2. 不幸的是,column2它不构成索引的最左边部分,因此该索引也不能在此查询中使用。

这是一个应该能够使用索引的查询示例:

SELECT column1, column2
FROM tbl_example
WHERE column1 = @param1
AND   column2 = @param2;

以下也将起作用:

SELECT column1, column2
FROM tbl_example
WHERE column1 = @param1;

你也可以坚持你的第一个查询,而不是ID在索引的叶节点中包含列:

CREATE INDEX tbl_index ON tbl_example(column1, column2) INCLUDE (ID)

这应该使您的原始第一个查询可以使用索引。


推荐阅读