了解SQL执行计划
作为一名dba,掌握SQL执行计划可以帮助我们直观的确认SQL性能是否存在问题。SQL执行计划是指SQL语句在数据库内部从取数据到返回结果集的一个完整过程,通过这个过程,我们可以看到SQL每一步的开销,进而判断SQL响应是否正常。在pg中,执行计划包含四大类型,包括控制节点、扫描节点、物化节点和连接节点。

实战演练-了解如何通过执行计划进行优化
我们通过2张表进行实战练习,帮助大家熟悉SQL执行计划。t_user是用户表,并填充50万行数据信息,t_cust是客户表,以tid关联t_user表,并填充150万行数据信息。我们可以使用explain命令来查看执行计划,其中option可选项包括analyze、verbose等。需要注意的是,explain默认不执行语句,只显示估算信息,而explain analyze则会实际执行语句且输出真实消耗信息。当我们诊断DML语句时,就要格外小心analyze选项以免影响生产数据。
我们首先查看一个简单的查询计划,其中SeqScan on t_user代表着以全表扫描的方式访问t_user表。需要注意的是cost单位为毫秒,0.00代表这一步计划的启动开销,12423为这一步计划的总开销。rows为结果行数,width为平均行的字节数,这些都是估算值。如果要查看实际执行信息,需要使用explain analyze命令。
我们需要注意的是,在实际执行时,主要的计算开销都消耗在了扫描节点上,而过滤性取得了很好的优化效果。因此,我们可以在tid字段上建立索引,以优化性能。
除了简单查询计划外,我们还需要学会如何对带有控制节点的计划进行优化。由于此类语句使用了union操作,因此在计划中便出现了Append控制节点,将2个子扫描节点进行数据合并。
我们还需要了解如何优化带有物化节点的计划。在这种情况下,GroupAggregate以及Sort节点便是物化节点,使用子扫描节点的数据进行排序和分组计算。需要注意由于->存在不同层级,则最里层最先执行。
最后,我们需要了解两种常见的表连接执行计划。HashJoin适用于大结果集的表关联,而NestedLoop往往最终返回结果集较小,通常都是交易型场景,需要缩小结果集以降低循环次数,以及在t_user的关联条件上需要创建索引,提升循环体内部的扫描效率。
通过以上几种案例解读,我们可以发现各种数据库执行计划都大同小异,问题的类型以及优化思路也基本类似。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5864.html
