解释更新 - 没有分析是否有副作用?
EXPLAIN UPDATE - side effects or not without ANALYZE?
众所周知,如果您 运行 对查询进行 EXPLAIN ANALYZE,查询将被执行(尽管结果 - 假设 SELECT - 将被丢弃)。因此,如果您在 UPDATE 语句上 运行 EXPLAIN ANALYZE ,那么手头的 table 将被更新。
我知道你可以通过将整个事情变成一个事务来缓解这种情况(如文档中所述:https://www.postgresql.org/docs/9.1/sql-explain.html)或将 1=0 添加到 WHERE 子句(后者可能会更改查询计划)。
虽然文档中的这个声明是模棱两可的:
”重要提示:请记住,当使用 ANALYZE 选项时,该语句实际上会被执行。虽然 EXPLAIN 会丢弃任何 SELECT 会 return 的输出,但该语句的其他副作用会照常发生
这是否意味着如果您 运行 在 UPDATE 语句中不使用 ANALYZE 关键字进行 EXPLAIN,就会产生副作用(即更新)?还是仅当您将 ANALYZE 添加到 EXPLAIN 时它们才会发生?引用中的第一句话暗示了后者,但第二句暗示了前者(因此含糊不清)。我知道这是一个学术问题,但我仍然很想知道答案。
dbfiddle 中的一个简单测试将回答您的问题。
ANALYZE 关键字强制执行 sql 语句,而不是 EXPLAIN 关键字。
众所周知,如果您 运行 对查询进行 EXPLAIN ANALYZE,查询将被执行(尽管结果 - 假设 SELECT - 将被丢弃)。因此,如果您在 UPDATE 语句上 运行 EXPLAIN ANALYZE ,那么手头的 table 将被更新。
我知道你可以通过将整个事情变成一个事务来缓解这种情况(如文档中所述:https://www.postgresql.org/docs/9.1/sql-explain.html)或将 1=0 添加到 WHERE 子句(后者可能会更改查询计划)。
虽然文档中的这个声明是模棱两可的:
”重要提示:请记住,当使用 ANALYZE 选项时,该语句实际上会被执行。虽然 EXPLAIN 会丢弃任何 SELECT 会 return 的输出,但该语句的其他副作用会照常发生
这是否意味着如果您 运行 在 UPDATE 语句中不使用 ANALYZE 关键字进行 EXPLAIN,就会产生副作用(即更新)?还是仅当您将 ANALYZE 添加到 EXPLAIN 时它们才会发生?引用中的第一句话暗示了后者,但第二句暗示了前者(因此含糊不清)。我知道这是一个学术问题,但我仍然很想知道答案。
dbfiddle 中的一个简单测试将回答您的问题。
ANALYZE 关键字强制执行 sql 语句,而不是 EXPLAIN 关键字。