我如何解释几个连续的查询而不执行它们?
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 TRANSACTION
和ROLLBACK
语句(假设你一开始就处于自动提交模式)。
参考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,但请查看他们的文档以了解查询规划器的工作原理。
如果您的视图定义非常复杂,只需对要评估的视图进行查询,然后将整个视图定义粘贴到视图名称前的方括号 ()
中(然后有效地变成一个子查询的别名)。查询规划器将为您完成剩下的工作。
假设我有一对任意 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 TRANSACTION
和ROLLBACK
语句(假设你一开始就处于自动提交模式)。
参考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,但请查看他们的文档以了解查询规划器的工作原理。
如果您的视图定义非常复杂,只需对要评估的视图进行查询,然后将整个视图定义粘贴到视图名称前的方括号 ()
中(然后有效地变成一个子查询的别名)。查询规划器将为您完成剩下的工作。