Analyze语句可以在PostgreSQL里被用来收集表的统计数据。 不过,我不希望真正插入这些数据到表中,我只需要评估某些查询的成本,反正是有手动指定统计表格的数据在PostgreSQL中,而无需实际将数据输入呢?
Answer 1:
我认为你是得过且过ANALYZE
用EXPLAIN ANALYZE
。 有不同的事情。
如果你想查询的成本和时间没有应用更改,你唯一真正的选择是开始一个事务,在执行查询EXPLAIN ANALYZE
,然后ROLLBACK
。
这仍然执行查询,这意味着:
- CPU时间和I / O被消耗
- 锁仍采取和保持时间
- 新行实际上写的是表和索引,但从来没有标明可见。 他们在未来被清理
VACUUM
。
Answer 2:
你已经可以解释分析查询,即使没有插入的数据,这将有助于你得到执行计划的感觉。
但有没有这样的东西实际数据:)你可以做什么,作为一种解决方法,开始交易,插入一些数据,EXPLAIN ANALYZE查询,然后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的计划执行(和它可以做各种优化)是应该的,恕我直言,最好比没有数据(免责声明:纯粹的直觉)
文章来源: How to manually update the statistics data of tables in PostgreSQL