如何在不执行它们的情况下解析几个连续查询?

时间:2016-08-20 14:51:32

标签: mysql postgresql explain sql-execution-plan monetdb

假设我有一对任意的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?

2 个答案:

答案 0 :(得分:1)

<强>的PostgreSQL

您可以使用以下解释声明。

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

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

<强> MonetDB

与上述类似,除了与事务相关的语句是BEGIN TRANSACTIONROLLBACK语句(假设您处于自动提交模式开始)。

参考this

<强>的MySQL

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

参考this回答。

答案 1 :(得分:1)

执行视图时,显然会执行基础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,但请查看他们的文档,了解查询规划器的工作原理。

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