3

这是explain.depesz.com上的示例计划:

Limit  (cost=65301.950..65301.950 rows=1 width=219) (actual time=886.074..886.074 rows=0 loops=1)
  ->  Sort  (cost=65258.840..65301.950 rows=17243 width=219) (actual time=879.683..885.211 rows=17589 loops=1)
          Sort Key: juliet.romeo
          Sort Method: external merge  Disk: 4664kB
        ->  Hash Join  (cost=30177.210..62214.980 rows=17243 width=219) (actual time=278.986..852.834 rows=17589 loops=1)
                Hash Cond: (whiskey_quebec.whiskey_five = juliet.quebec)
              ->  Bitmap Heap Scan on whiskey_quebec  (cost=326.060..21967.630 rows=17243 width=4) (actual time=7.494..65.956 rows=17589 loops=1)
                      Recheck Cond: (golf = 297)
                    ->  Bitmap Index Scan on kilo  (cost=0.000..321.750 rows=17243 width=0) (actual time=4.638..4.638 rows=17589 loops=1)
                            Index Cond: (golf = 297)
              ->  Hash  (cost=15750.510..15750.510 rows=329651 width=219) (actual time=267.388..267.388 rows=329651 loops=1)
                      Buckets: 1024  Batches: 128  Memory Usage: 679kB
                    ->  Seq Scan on juliet  (cost=0.000..15750.510 rows=329651 width=219) (actual time=0.003..65.704 rows=329651 loops=1)

这些操作按什么顺序执行?自下而上?自顶向下?

4

2 回答 2

9

两个方向都有意义。从上到下是对数据的请求。从下到上是数据。您会看到一棵树 - 每个节点都有最少一个孩子。在执行时,节点调用他的孩子 - “给我发送数据”,并且这个调用递归地重复到叶子 - seq 扫描,索引扫描,设置返回的函数调用,......产生数据和逐行 - 是发送给父母的数据.

于 2014-02-15T04:38:39.457 回答
3

我通常从底部最后一行开始阅读树->,到顶部

在您的情况下,它显然需要数据才能对其进行排序,因此排序是它所做的最后一件事......

顺序扫描和索引查找:要查找的重要事项通常是它是否使用索引。如果您没有足够的数据供计划程序使用索引,您可以禁用顺序扫描SET enable_seqscan = OFF;强制使用索引。记得放回去!

重要提示:如果您使用 EXPLAIN ANALYZE(或 ANALYZE),它会产生副作用!!!

我真的建议您阅读官方文档,您还可以找到一些不错的东西,例如将输出获取为 yaml 或 json:

EXPLAIN (format yaml) your_query_here

另请参阅:https ://explain.depesz.com/ (以获得漂亮的表示)

于 2018-07-23T10:41:13.780 回答