我有一个由模板机制构造的PostgreSQL查询。我想要做的是确定查询在运行时实际命中的关系,并将它们记录在关系中。所以这是一个非常基本的血统问题。简单地查看查询中出现的关系名称(或解析查询)并不容易解决这个问题,因为查询有些复杂,模板机制会插入像WHERE FALSE这样的表达式。
当然,我可以在查询中使用EXPLAIN并手动插入我找到的关系名称。然而,这有两个缺点:
EXPLAIN实际上运行了这个查询。不幸的是,运行查询需要花费大量的时间,所以两次运行查询并不理想,一次是针对结果,一次是手动的。在阅读了一些文档之后,我发现on可以自动地将EXPLAIN的结果记录到CSV文件中,并将其读回一个关系。但是,据我所知,这意味着将所有东西记录到CSV,这对我来说不是一个选择。而且,只有在执行所需的时间比预定的阈值更长时,才会触发自动日志记录,而且我希望对一些特定的查询执行此操作,而不是对所有耗时的查询执行。
PS:这不需要在数据库层完全实现。例如,一旦我在关系中得到了EXPLAIN的结果,我就可以解析它并提取它在应用层碰到的关系。
发布于 2020-05-20 07:56:20
EXPLAIN不执行查询。
您可以运行EXPLAIN (FORMAT JSON) SELECT ...,它将以JSON的形式返回执行计划。只需提取所有Relation Name属性,就可以得到扫描的表列表。
https://stackoverflow.com/questions/61903233
复制相似问题