女主宣言
在SQL性能概述的第一部分中,我们研究了关系优化;第二部分介绍了查询分析,并介绍了单表访问路径公式。在今天的文章中,我们将继续讨论可以用于组合来自多个表的数据的各种方法。希望对大家在SQL性能优化方面有所帮助。
PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!
SQL性能第1篇:关系优化
SQL性能第2篇:查询分析和访问路径制定
在SQL性能概述的第一部分中,我们研究了关系优化;第二部分介绍了查询分析,并介绍了单表访问路径公式。在今天的文章中,我们将继续讨论可以用于组合来自多个表的数据的各种方法。
1
连接查询
当访问多个表时,优化器必须确定如何以最有效的方式组合这些表。在确定连接的访问路径时,优化器必须确定表连接的顺序,计算每个访问路径的总体成本估计,并为特定查询选择连接方法。DBMS 可以使用几种不同的方法来连接表。
不管 join 方法如何,DBMS都必须做出几个决策并执行某些操作。第一个决策是首先选择要处理的表——这个表称为外部表。接下来,在外部表上执行一系列操作,为连接做好准备。然后将该表中的行与第二个表(称为内部表)中的行组合。在连接发生之前、连接发生时或两者同时发生时,还会对内部表执行一系列操作。
尽管所有连接在功能上都很相似,但是每个连接方法在幕后的工作方式都不同。让我们研究两种常见的连接方法:嵌套循环连接和合并扫描连接。
内循环连接通过比较外部表和内部表的符合条件的行来工作。在外部表中标识符合条件的行,然后扫描内部表以查找匹配项。限定行是表中列的谓词匹配的行。当内部表扫描完成时,将标识外部表中的另一个符合条件的行。再次扫描内部表以查找匹配项,以此类推。内部表的重复扫描通常使用索引来完成,以避免不必要的I/O开销。内部表的大小越小,嵌套循环连接执行得越好,因为对于外部表的每个符合条件的行,需要扫描的行越少。
第二种连接方法是合并扫描连接。在合并扫描连接中,要连接的表是按键排序的。这种排序可以通过排序或通过索引访问来完成。在确保外部表和内部表的顺序正确之后,将按顺序读取每个表,并匹配连接列。在合并扫描连接期间,任何表中的行都不会被读取超过一次。当一个(或两个)表上没有合适的索引时,合并扫描连接是有益的。
根据DBMS的不同,也可以使用其他连接方法。例如,支持数据仓库和分析查询的星型连接在许多 DBMS 中很常见。还可以支持其他混合方法和使用散列的方法。
2
连接顺序和表选择
优化器检查查询中的每个连接,并分析适当的统计信息,以确定访问表以完成连接的最佳顺序。为了找到最优的连接访问路径,优化器使用内置的算法,其中包含关于连接和数据量的知识。它将此智能与连接谓词、数据库统计信息和可用索引相匹配,以估计哪种顺序更有效。一般情况下,优化器将部署一个算法,该算法将最小化必须访问内部表的次数,以获得符合条件的外部表行。
优化器了解每种方法的优缺点,以及该方法的使用如何影响性能。根据系统编目中的当前统计信息,优化器选择最适合内部表和外部表的表。以下是优化器必须考虑的一些问题的高级总结:
表越小,就越有可能被选为外部表。这有助于减少必须重新访问内部表的次数。
如果能够应用选择谓词,则更有可能选择表作为外部表,因为只有满足应用于外部表的谓词的行才能访问内部表。
如果可以对其中一个表执行索引查找,那么该表是用作内部表的一个很好的候选表。如果一个表没有索引,那么它就不适合用于内部表,因为必须为外部表的每一行扫描整个内部表(对于嵌套循环连接)。
重复最少的表可能倾向于被选择为联接中的外部表。
当然,这些都不是硬性规定。最后,优化器将根据详细的成本估计选择外部和内部表。
然而,现今的关系优化器没有一个是完美的。因此,DBA 和性能分析人员必须通过评估优化器生成的访问路径来审查优化器做出的选择。这可能是一个艰难的过程,因为它涉及到理解数据、统计数据和访问路径细节。认真考虑实现最佳性能的组织使用自动化工具来帮助评估其 SQL 的性能。
总结
今天的文章提供了SQL优化和多表访问路径的高级视图。当然,不同的 DBMS 有许多复杂的细节,你需要了解系统的工作方式,以实现你想要的性能。
通过四部分系列文章的前三部分,我们已经研究了SQL优化的核心过程,但是还有很多需要学习的地方。在下一期文章中,我们将介绍一些应该注意的其他重要SQL优化注意事项。
360云计算
由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
![0c8a68e9b7b4903cf425c8eb88b5d3ba.png](https://i-blog.csdnimg.cn/blog_migrate/2ed1064da1f1d0bed109e946d628a22e.jpeg)