确定查询命中的关系

Determining relations hit by a query

我有一个通过模板机制构建的 PostgreSQL 查询。我想做的是确定查询实际命中的关系 运行 并将它们记录在关系中。所以这是一个非常基本的血统问题。简单地查看查询中出现的关系名称(或解析查询)并不能轻易解决问题,因为查询有些复杂并且模板机制会插入像 WHERE FALSE 这样的表达式。

我当然可以通过在查询中使用 EXPLAIN 并插入我手动找到的关系名称来做到这一点。然而,这有两个缺点:

  1. EXPLAIN 实际上是 运行 查询。不幸的是,运行查询需要花费大量时间,因此 运行 查询两次并不理想,一次查询结果,一次查询 EXPLAIN.
  2. 这是手动的。

阅读一些文档后我发现 on 可以将 EXPLAIN 的结果自动记录到 CSV 文件并将其读回关系。但是,据我所知,这意味着将所有内容记录到 CSV 中,这对我来说不是一个选项。此外,似乎只有当执行时间超过预定阈值时才会触发自动日志记录,我想针对一些特定查询执行此操作,而不是针对所有耗时的查询。

PS:不需要完全在数据库层实现。例如,一旦我在关系中得到 EXPLAIN 的结果,我就可以解析它并提取它在应用层命中的关系。

EXPLAIN 执行查询。

您可以运行 EXPLAIN (FORMAT JSON) SELECT ...,这将return执行计划作为JSON。只需提取所有 Relation Name 属性,您就会得到扫描表的列表。