2014-01-09 84 views
1

ANALYZE语句可用于PostgreSQL中收集表的统计数据。然而,我不想将这些数据实际插入到表中,我只需要评估一些查询的成本,无论如何手动指定PostgreSQL中表的统计数据而不实际将数据放入它中?如何手动更新PostgreSQL中表的统计数据

回答

2

我觉得你很混乱ANALYZEEXPLAIN ANALYZE。有不同的事情。

如果您想要查询成本和时间而不应用更改,则唯一的实际选项是开始一个事务,执行EXPLAIN ANALYZE下的查询,然后执行ROLLBACK下的查询。

这仍然执行查询,这意味着:

  • CPU时间和I/O消耗
  • 锁仍采取和保持时间
  • 新行实际上写的是表和索引,但从未标记为可见。他们在下一个VACUUM清理。
+0

嗨,谢谢你的回复。那么,也许我的陈述有点不清楚,我的意思是我想找到一种方法来手动指定表的统计信息,说表A没有数据,但我想让PostgreSQL认为那里在该表中有1000行,因此我可以使用模拟统计来评估查询。 – yingzhox

+0

@ user1780833是的,非常不清楚!在这一点上,考虑发布一个新的,包括那些相当重要的细节和任何其他相关的背景。 –

1

即使没有插入数据,您也可以已经EXPLAIN ANALYZE查询,它可以帮助您了解执行计划。

但是没有像真实数据那样的东西:) 作为解决方法,您可以做些什么开始一个事务,插入一些数据,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的计划执行(和它可以做的各种优化)应该是,恕我直言,最好比没有数据(免责声明:纯粹直观)

+0

啊......并且在ROLLBACK之后添加VACUUM ANALYZE your_table可能有助于清除用于执行计划的统计信息中的潜在修改......但我不是PostgreSQL专家,我不确定回滚事务是否也回滚表统计信息。 –

相关问题