如何手动更新统计PostgreSQL的表的数据(How to manually update the

2019-10-19 04:51发布

Analyze语句可以在PostgreSQL里被用来收集表的统计数据。 不过,我不希望真正插入这些数据到表中,我只需要评估某些查询的成本,反正是有手动指定统计表格的数据在PostgreSQL中,而无需实际将数据输入呢?

Answer 1:

我认为你是得过且过ANALYZEEXPLAIN 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