学习优化SQL查询和理解执行计划-资源?


8

我发现自己在工作中编写越来越多的SQL查询(大多数是Oracle 11g,但有些是SQL Server 2005-2008),并且已经开始为分析师团队的其他成员创建一些非常复杂的视图。

它们大多数都运行得很好,但是其中一些并不那么好。所以...

  • 我如何学习调整查询?
  • 我需要学习阅读或执行执行计划吗?

和...

  • 您可以推荐哪些书/网站以了解有关SQL查询调优1)概述2)专门针对Oracle 11g的内容?

我们这里有一些不错的DBA,但是它们被淹没了,无法帮助我们调整我们编写的每个查询。

我在Amazon for Oracle上找到的大多数书籍似乎都是针对整体数据库优化的,并且/或者是在8到10年前写的。

谢谢您的建议:)


Answers:


7

我想说,学习如何理解解释计划是帮助您优化SQL语句的一项至关重要的技能。我发现Christian Antognini的书《Oracle性能疑难解答》在详细说明它们的工作方式以及解释如何进行数据库优化方面非常有用。几年后,您仍将从中学到很多仍然有意义的知识。

如果您更高级,则可以阅读乔纳森·刘易斯的书,但是这些书比较深入,因此可能不是一个好的起点。现在,基于成本的Oracle基础知识已经很老了,但其中大部分仍然适用。我还没有阅读《Oracle Core:故障排除的基本内部原理》,但是它得到了Oracle社区的好评。

当您使用11g时,如果您的查询花费的时间超过几秒钟,我绝对建议您查看实时SQL监视器(假设您已获得适当的许可)。顾名思义,它实时显示一条SQL语句的进度,并根据到目前为止提取的行的详细信息,细分了每个操作花费的时间。它还会保留最近执行的查询的详细信息一小段时间,以便可以查看您的更改如何影响语句。

Oracle SQL监视文档:http : //docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

学习如何调优查询将需要时间和实践。我学到的一些东西:

  • 编写查询以尽快获取尽可能少的行(例如,如果您只需要扫描其中的100行,则不想完全扫描1000万行表)
  • 验证解释(预期)计划的每个步骤中预期的行数是否与实际执行计划中返回的行数匹配。当这些数量级不同时,优化器可能没有选择“最佳”计划。
  • 了解良好索引的原理:执行查询时它们如何工作以及何时/不应该使用它们(Richard Foote的博客非常深入地讨论了Oracle中的索引)

通常,您将通过编写查询,查看(预期的)解释计划并将它们与实际的执行计划进行比较来学习(通过跟踪查询或使用SQL监视器)。然后重新编写查询,添加/删除索引等,并查看它如何影响计划和执行时间


1

当您寻找Oracle的特定信息时,我会推荐Oracle上的Ask Tom博客。一般来说,我认为您会发现建议是不要调整查询。您将获得有关如何编写优化程序可以优化的查询的良好建议。Oracle文档也是在线的,我通常会在那里查找有关Oracle的最新信息。我还没有使用SQLServer,所以没有任何建议。

在过去的几年中,我在优化查询领域没有看到很多新东西。最大的变化是基于规则的优化器的弃用,我几乎不记得使用它。但是,我了解SQLServer仍然使用基于规则的优化器,因此了解其规则可以有所帮助。

您可以在其中编辑,执行查询以及生成解释计划的工具有助于理解哪些更改使您的查询性能良好。我使用AquaData Studio取得了不错的效果,并且非常喜欢它的树状视图。SQL Developer也应该这样做。

与任何优化一样,您需要获得有关其性能的定量数据。然后,您可以确定是否确实对其进行了优化。

如何优化查询部分取决于解析器如何构建和优化查询。在很大程度上,它取决于您要查询的数据的分布。在Oracle数据库中,如果结果集占表的百分之四或更多,并且是随机分布的,则表扫描通常比索引快。

我曾为一组开发人员优化查询。一年仅需要进行两次或三个查询即可进行认真的优化。大多数查询非常简单,因此不需要优化。其余的通常可以通过添加缺少的联接路径来处理。

对于Oracle,有三个可调整的设置,它们会显着影响性能。索引和数据查找的成本核算会相互作用,以更改将使用或不使用索引的条件。这两个可以在每个会话的基础上进行调整。默认值通常不是最佳的。另一个值控制优化器尝试多少个替代方案。增大此值通常会有所帮助。

数据分布和数量极大地影响了优化。优化时,最好使用生产数据库的副本,或者至少使用具有相同数据分布和卷的数据库。我严重破坏了测试环境,优化了生产订单数据库的查询。测试和开发数据库的数据分布有很大的不同,即使数据少得多,也导致查询失败。


您可能需要考虑在此处添加更多内容。当前,这实际上是边界“不是答案”。
JNK 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.