假设我有一对任意的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?
答案 0 :(得分:1)
<强>的PostgreSQL 强>
您可以使用以下解释声明。
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
参考this,文档回答您的问题。
<强> MonetDB 强>
与上述类似,除了与事务相关的语句是BEGIN TRANSACTION
和ROLLBACK
语句(假设您处于自动提交模式开始)。
参考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,但请查看他们的文档,了解查询规划器的工作原理。
如果您的视图定义非常复杂,只需对要评估的视图进行查询,然后将整个视图定义粘贴到视图名称之前的括号()
中(然后它有效地成为视图的别名)一个子查询)。查询规划器将为您完成剩下的工作。