sql - SQL Server 视图中的括号会影响性能吗?
问题描述
当我在 MS SQL Server 视图查询中的“OR”语句周围添加一组括号时,性能受到了极大的影响。
我遇到了一个视图,其中包含一组复杂的and
/or
子句。我认为添加括号后该语句会更易于阅读和维护。但是,在我添加括号后,视图性能下降了。
- 我运行了这个语句:
SELECT COUNT(*) FROM [ViewName]
。结果是 630,644。查询需要 14 秒来处理。 - 然后在视图定义中添加一组括号并运行相同的
COUNT(*)
语句。75秒后停止查询;它还没有完成。 - 从视图中删除了括号。
COUNT(*)
再次。结果花了15秒。 - 又加了括号。
COUNT(*)
查询在我停止之前花了 90 秒。
这让我相信括号肯定会影响视图的性能。但是我读过的所有内容都表明 SQL 中的括号不会影响性能。
我错过了什么?
解决方案
这让我相信括号肯定会影响视图的性能。但是我读过的所有内容都表明 SQL 中的括号不会影响性能。
这取决于括号的应用位置。有时它适用于对逻辑没有影响,有时有效果,即按照以下示例,在示例 1 中,查询处理最终会对性能产生影响,但在示例 2 中,添加括号不会有任何影响
示例 1
ColumnA = 0 and ColmnB = 1 or ColumnB = 2
ColumnA = 0 and (ColmnB = 1 or ColumnB = 2)
ColumnA = 0 and ColmnB = 1 or (ColumnB = 2)
示例 2
ColumnA = 0 and ColmnB = 1
ColumnA = 0 and (ColmnB = 1)
(ColumnA = 0) and ColmnB = 1
其中包含一组复杂的和/或子句
此外,我建议您也查看执行计划以便清楚地理解,您可以ctrl+m
在执行查询之前在 SSMS(快捷方式)中启用它,并查看每次执行的差异:
- 查询必须执行多少任务才能获得结果
- 查询必须执行什么类型的任务
- 每个任务中的
estimated rows
和是什么Actual number of rows
- 索引使用发生变化,需要任何新索引等...
推荐阅读
- python - 工作 10-15 秒后关闭烧瓶
- vba - VBA 代码仅适用于第一张纸
- ruby-on-rails - 连接两个查询集 - Ruby on Rails 和 MongoDB
- php - 通过 Dropbox API 上传后无法从服务器取消链接(删除)文件
- php - Php,MySql - 将数据作为键值对插入两个表中
- cassandra - Cassandra - Nodetool 状态显示“拥有为?”
- fortran - 声明多组变量时出现 Gfortran 编译错误
- javascript - 过滤特定复选框
- passenger - 乘客作为 Apache 模块:看门狗和乘客核心以 root 身份运行
- javascript - 验证输入字段以进行人工测试