如何手动更新PostgreSQL中表的统计数据

时间:2014-01-09 06:45:51

标签: sql performance postgresql statistics evaluation

可以在PostgreSQL中使用ANALYZE语句来收集表的统计数据。但是,我不想将这些数据实际插入表中,我只需要评估一些查询的成本,无论如何都要手动指定PostgreSQL中表的统计数据而不实际将数据放入其中?

2 个答案:

答案 0 :(得分:2)

我认为你与ANALYZE混淆了EXPLAIN ANALYZE。有不同的东西。

如果您想要查询成本和时间而不应用更改,那么您唯一真正的选择就是开始交易,在EXPLAIN ANALYZE下执行查询,然后ROLLBACK

这仍然执行查询,意思是:

  • 消耗CPU时间和I / O
  • 锁定仍然持续
  • 新行实际上写入表和索引,但从未标记为可见。它们会在下一个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计划执行(以及它可以做的各种优化)应该是,恕我直言,最好没有数据(免责声明:纯粹直观)