sql - 从性能的角度来看,以下 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
解决方案
实际上,这两个查询都可能无法使用索引。在第一个查询中,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)
这应该使您的原始第一个查询可以使用索引。
推荐阅读
- awk - 如何遍历awk中的列
- nginx - Nginx 高开 TCP 连接
- authentication - 任何针对移动应用程序的本地面向隐私的用户身份验证?
- firebase - SwiftUI、Firebase 链接以确认电子邮件
- c# - 如何使用 AngleSharp 查找和替换链接上的 href 值?
- startup - 为什么VI总是以插入模式启动?
- ios - 如何使用 firebase 在 UITextFieldi 中保存用户的输入?
- r - 加入 data.tables 时解析列名
- python - 如何使用 python GUI 创建指示灯(危险、警告、安全)
- tableau-api - 如果 Tablean 中的 1 个字段或另一个字段中的“是”,则计数