SELECT语句的性能调优有时是一项非常耗时的工作,在我看来它遵循帕累托原则。20%的努力很可能让你得到80%的性能提升,而你可能需要花费80%的时间才能获得另外20%的性能提升。除非您在金星上工作,那里的每一天都等于地球上的243天,否则交付截止日期很可能不会让您有足够的时间来调整SQL查询。根据我多年编写和运行SQL语句的经验,我着手制定一个清单,供我在尝试提高查询性能时参考。在进行查询计划和阅读我使用的数据库的文档之前,我会参考它,这有时会很复杂。我的清单绝不是全面或科学的,它更像是一个保守的计算,但我可以说,按照这些简单的步骤,我在大多数时候确实获得了性能提升。清单如下。检查索引SQL语句的WHERE和JOIN部分中使用的所有字段都应该被索引。参加这个3分钟的SQL性能测试。无论您的成绩如何,请务必阅读信息丰富的结果。限制工作数据集的大小检查SELECT语句中使用的表,看看是否可以应用WHERE子句进行过滤。一个典型的例子是当表中只有几千行时执行良好的查询。但是随着应用程序的增长,查询速度变慢了。解决方案可能与限制查询查看当月数据一样简单。当你有一个带有子查询的查询时,要小心在子查询的内部语句上使用过滤,而不是在外部语句上。只选择你需要的字段额外的字段通常会增加返回数据的纹理,导致更多的数据返回给SQL客户端。另外:当使用具有报告和分析功能的应用程序时,有时报告性能会很低,因为报告工具必须以详细的形式聚合它接收到的数据。有时查询可能运行得足够快,但您的问题可能是网络相关问题,因为大量详细数据通过网络发送到报告服务器。使用面向列的DBMS时,只会从磁盘读取您选择的列。查询中包含的列越少,IO开销就越少。删除不需要的表的原因与删除查询语句中不需要的字段的原因相同。编写SQL语句是一个过程,通常需要大量的编写和测试SQL语句的迭代过程。在开发过程中,您可能会在查询中添加表,这可能不会对SQL代码返回的数据产生任何影响。SQL正常运行后,我发现很多人不检查他们的脚本并删除对最终返回数据没有影响的表。通过删除那些不必要的表的JOINS操作,您可以减少数据库必须执行的大量处理。有时,例如删除列,您会发现减少的数据通过数据库返回。删除外连接查询说起来容易做起来难,这取决于更改表内容的影响有多大。解决方法是通过在两个表的行中放置占位符来删除OUTERJOINS操作。假设你有如下几张表,通过定义OUTERJOINS来保证返回所有数据:解决方法是在customer表的行中添加一个占位符,将sales表中的所有NULL值更新为占位符。您不仅消除了对OUTERJOIN操作的依赖,而且还标准化了没有客户的销售人员的表示方式。其他开发人员不必编写额外的语句,如ISNULL(customer_id,“Nocustomeryet”)。删除JOIN和WHERE子句中的计算字段这是另一个有时说起来容易做起来难的技巧,具体取决于您拥有多少特权来更改表架构。连接语句中使用的计算字段可以创建为表中的新字段。给定以下SQL语句:使用年和月向销售表添加一列可以提高性能。更新后的SQL语句如下:总结以上建议可以归结为以下几点:检查索引在最小需要的数据集上操作删除不需要的字段和表删除JOIN和WHERE子句中的计算操作
