0

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

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

  1. EXPLAIN实际运行查询。不幸的是,运行查询需要很长时间,因此运行两次查询并不理想,一次用于结果,一次用于EXPLAIN.
  2. 它是手动的。

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

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

4

1 回答 1

1

EXPLAIN执行查询。

您可以运行EXPLAIN (FORMAT JSON) SELECT ...,它将以 JSON 格式返回执行计划。只需提取所有Relation Name属性,您就会得到一个扫描表的列表。

于 2020-05-20T07:56:20.727 回答