查看执行计划

最近更新时间: 2024-10-17 17:10:00

TDSQL PostgreSQL会为每一个收到的查询产生一个查询计划,可以使用EXPLAIN命令察看生成的查询计划。

EXPLAIN语法如下:

EXPLAIN [ ( 参数 [, ...] ) ] SQL语句

EXPLAIN [ ANALYZE ] [ VERBOSE ] SQL语句

这里 参数可以是:

ANALYZE [ boolean ]

VERBOSE [ boolean ]

COSTS [ boolean ]

SETTINGS [ boolean ]

BUFFERS [ boolean ]

WAL [ boolean ]

TIMING [ boolean ]

SUMMARY [ boolean ]

FORMAT { TEXT | XML | JSON | YAML }

参数说明:

ANALYZE

执行命令并且显示实际的运行时间和其他统计信息。这个参数默认被设置为FALSE。

VERBOSE

显示关于执行计划的附加信息。具体包括计划树中每个结点的输出列列表、模式限定的表和函数名称、在表达式中使用范围表别名标记变量,并输出显示统计信息的每个触发器的名称。这个参数默认被设置为FALSE。

COSTS

每一个计划结点的估计启动和总代价,以及估计的行数和每行的宽度。这个参数默认被设置为TRUE。

SETTINGS

有关配置参数的信息。具体包括影响查询计划的选项,其值与内置默认值不同。此参数默认为FALSE。

BUFFERS

缓冲区使用的信息。具体包括共享块命中、读取、标记为脏和写入的次数、本地块命中、读取、标记为脏和写入的次数、以及临时块读取和写入的次数。一次命中表示避免了一次读取,因为需要的块已经在缓存中找到了。共享块包含着来自于常规表和索引的数据,本地块包含着来自于临时表和索引的数据,而临时块包含着在排序、哈希、物化计划结点和类似情况中使用的短期工作数据。脏块的数量表示被这个查询改变的之前未被修改块的数量,而写入块的数量表示这个后台在查询处理期间从缓存中替换出去的脏块的数量。为一个较高层结点显示的块数包括它的所有子结点所用到的块数。在文本格式中,只会打印非零值。只有当ANALYZE也被启用时,这个参数才能使用。它的默认被设置为FALSE。

WAL

有关WAL记录生成的信息。 具体包括记录数、整页图像数(fpi)和生成的WAL字节数量。 在文本格式中,仅打印非零值。 此参数只能在同时启用ANALYZE时使用。 它默认为FALSE。

TIMING

在输出中包括实际启动时间以及在每个结点中花掉的时间。反复读取系统时钟的负荷在某些系统上会显著地拖慢查询,因此在只需要实际的行计数而不是实际时间时,把这个参数设置为FALSE可能会有用。即便用这个选项关闭结点层的计时,整个语句的运行时间也总是会被度量。只有当ANALYZE也被启用时,这个参数才能使用。它的默认被设置为TRUE。

SUMMARY

在查询计划之后包含摘要信息(例如,总计的时间信息)。当使用ANALYZE 时默认包含摘要信息。不使用ANALYZE时可以使用此选项仅启用摘要信息。 使用EXPLAIN EXECUTE中的计划时间包括从缓存中获取计划所需的时间 以及重新计划所需的时间(如有必要)。

FORMAT

指定输出格式,可以是 TEXT、XML、JSON 或者 YAML。非文本输出包含和文本输出格式相同的信息。这个参数默认被设置为TEXT。

说明:

为了保证TDSQL PostgreSQL优化器在优化查询时能做出合理的决策,查询中用到所有表的pg_statistic数据应该能保持为最新。通常这个工作会由autovacuum daemon自动完成。但是如果一个表最近发生大量的数据改变,那么需要手动做一次ANALYZE而不是等待 autovacuum 来修改记录。