我如何解释几个连续的查询而不执行它们?

How can I EXPLAIN several consecutive queries without executing them?

假设我有一对任意 SQL 查询,每个查询都依赖于前一个查询,例如

CREATE VIEW v1 ( c3 ) AS SELECT c1 + c2 FROM t1;
SELECT sum(c3) FROM v1;
DROP VIEW v1;

(但请注意,我 不是 询问这些特定查询 - 这只是一个示例;假设我从文件中获取查询并且事先不知道它们。)

现在,我想让我的 DBMS 解释它对我所有查询的计划(或中间的任意查询,本质上是同一个问题)- 但我 不是 希望它实际执行其中任何一个。

这可以用 (1) MySQL 实现吗? (2) PostgreSQL? (3) MonetDB?

PostgreSQL

您可以使用如下说明语句。

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

参考 this,文档回答了您的问题。

MonetDB

和上面类似,除了事务相关的语句是BEGIN TRANSACTIONROLLBACK语句(假设你一开始就处于自动提交模式)。

参考this.

MySQL

MySQL 解释它自己做你需要的。不需要 ROLLBACK.

参考this答案。

当您执行一个视图时,显然会执行底层的 SELECT 查询。所以在PostgreSQL中实际的执行计划是这样的:

-- Common use of the view
SELECT sum(c3) FROM v1;

变成

-- Expansion of the view into plain SQL
SELECT sum(c3) FROM (SELECT c1 + c2 AS c3 FROM t1) v1;

变成

-- Flattening by the query planner, this is what actually gets executed
SELECT sum(c1 + c2) FROM t1;

所以答案是:

EXPLAIN SELECT sum(c1 + c2) FROM t1;

这肯定适用于 PostgreSQL,也很可能适用于所有其他 DBMS,但请查看他们的文档以了解查询规划器的工作原理。

如果您的视图定义非常复杂,只需对要评估的视图进行查询,然后将整个视图定义粘贴到视图名称前的方括号 () 中(然后有效地变成一个子查询的别名)。查询规划器将为您完成剩下的工作。