可以在PostgreSQL中使用ANALYZE语句来收集表的统计数据。但是,我不想将这些数据实际插入表中,我只需要评估一些查询的成本,无论如何都要手动指定PostgreSQL中表的统计数据而不实际将数据放入其中?
答案 0 :(得分:2)
我认为你与ANALYZE
混淆了EXPLAIN ANALYZE
。有不同的东西。
如果您想要查询成本和时间而不应用更改,那么您唯一真正的选择就是开始交易,在EXPLAIN ANALYZE
下执行查询,然后ROLLBACK
。
这仍然执行查询,意思是:
VACUUM
。答案 1 :(得分:1)
即使没有插入数据,您也可以解析分析查询,它可以帮助您了解执行计划。
但是没有真正的数据:) 作为一种解决方法,你可以做的是开始一个事务,插入一些数据,解析你的查询,然后ROLLBACK你的交易。
示例:
mydatabase=# BEGIN;
BEGIN
mydatabase=# INSERT INTO auth_message (user_id, message) VALUES (1, 'foobar');
INSERT 0 1
mydatabase=# EXPLAIN ANALYSE SELECT count(*) FROM auth_message;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Aggregate (cost=24.50..24.51 rows=1 width=0) (actual time=0.011..0.011 rows=1 loops=1)
-> Seq Scan on auth_message (cost=0.00..21.60 rows=1160 width=0) (actual time=0.007..0.008 rows=1 loops=1)
Total runtime: 0.042 ms
(3 lignes)
mydatabase=# ROLLBACK;
ROLLBACK
mydatabase=# EXPLAIN ANALYSE SELECT count(*) FROM auth_message;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Aggregate (cost=24.50..24.51 rows=1 width=0) (actual time=0.011..0.011 rows=1 loops=1)
-> Seq Scan on auth_message (cost=0.00..21.60 rows=1160 width=0) (actual time=0.009..0.009 rows=0 loops=1)
Total runtime: 0.043 ms
(3 lignes)
第一个EXPLAIN ANALYZE显示有一些“临时”数据(行= 1)
这不是严格的“模拟”,但至少,PostgreSQL计划执行(以及它可以做的各种优化)应该是,恕我直言,最好没有数据(免责声明:纯粹直观)