![]() |
1
60
这正是优化器为生存所做的(我不是说他们总是做得很好)。
自从
如此查询:
可以转化为:
或者:
这看起来更丑,但可以产生更好的执行计划。 最常见的操作之一是替换此查询:
有了这个:
在一些
VS
在
VS
但是在我的博客中看到这篇文章,关于如何在
此分层查询位于
可以转换为:
后者表现得更出色。 有关执行计划的详细信息,请参阅我的博客中的这篇文章: 要查找与给定范围重叠的所有范围,可以使用以下查询:
但在
不管你信不信由你,我的博客上也有一篇文章:
可以更有效地重写,上帝保佑我,诅咒者(你听我说得对:
在我的博客中看到关于如何做到这一点的文章:
在金融应用程序中,有一种常见的查询,用于搜索货币的有效汇率,如
可以大量重写此查询,以使用允许
尽管这是一个庞大的地狱,后一个查询是
这里的主要想法是替换
|
![]() |
2
9
下面是使用Oracle8&9的一些例子(当然,有时做相反的事情可能会使查询更简单或更快):
如果圆括号不用于替代运算符优先级,则可以删除圆括号。一个简单的例子是当
子查询通常(如果不总是)可以 与主查询合并 简化它。根据我的经验,这通常会显著提高性能:
等于
使用 ANSI加入 将许多“代码猴子”逻辑与WHERE子句中真正有趣的部分分开:前面的查询等价于
如果要检查是否存在行,请不要使用
伯爵(*)
,而是使用
|
![]() |
3
6
正如@quassnoi所提到的,乐观主义者经常做得很好。帮助它的一种方法是确保索引和统计是最新的,并且为您的查询工作负载存在合适的索引。 |
![]() |
4
5
我喜欢用连接查询替换所有类型的子选择。 这一点很明显:
通过
这一个还未被估计:
通过
它可以帮助DBMS在大的请求中选择好的执行计划。 |
![]() |
5
5
我喜欢团队中的每个人都遵循一套标准,以使代码可读、可维护、可理解、可清洗等。:)
这里还有一些东西 What are some of your most useful database standards? |
![]() |
6
4
考虑到SQL的性质,您必须完全了解任何重构的性能影响。 Refactoring SQL Applications 是一个很好的重构资源,重点关注性能(见第5章)。 |
![]() |
7
3
虽然简化可能不等于优化,但简化在编写可读的SQL代码时可能很重要,而这反过来又对能够检查SQL代码的概念正确性(而不是开发环境应该检查的语法正确性)至关重要。在我看来,在理想的环境中,我们会编写最简单、最可读的SQL代码,然后优化器会将该SQL代码重写为运行速度最快的任何形式(可能更冗长)。 我发现将SQL语句看作是基于集合逻辑的非常有用,特别是当我需要组合WHERE子句或计算出WHERE子句的复杂否定时。我用 laws of boolean algebra 在这种情况下。 简化where子句最重要的可能是demorgan定律(请注意,“·”是“and”and“+”是“or”):
这在SQL中转换为:
这些定律对于简化含有大量嵌套的WHERE子句非常有用。
记住这句话也很有用
子查询也可以这样考虑。例如,这否定了WHERE子句:
可重写为:
这些法则并不告诉您如何使用子查询将SQL查询转换为使用联接的查询,但是布尔逻辑可以帮助您了解联接类型以及查询应返回的内容。例如,使用表格
|
![]() |
8
0
我的方法是学习一般的关系理论,特别是关系代数。然后学习找出SQL中用于实现关系代数(例如通用量化a.k.a.除法)和微积分(例如存在量化)运算符的构造。关键是,在关系模型中没有找到SQL的特性,例如nulls,这可能是最好的重构方式。推荐阅读: SQL and Relational Theory: How to Write Accurate SQL Code By C. J. Date . 在这种情况下,我不相信“大多数子select可以重写为join这一事实”代表了一种简化。 以这个查询为例:
使用join重写
加入更详细!
或者,识别构造是在投影上实现反连接
使用关系运算符简化:
|