【问题标题】:How to manually update the statistics data of tables in PostgreSQLPostgreSQL中如何手动更新表的统计数据
【发布时间】:2014-01-27 14:21:43
【问题描述】:

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

【问题讨论】:

    标签: sql performance postgresql statistics evaluation


    【解决方案1】:

    我认为你在混淆 ANALYZEEXPLAIN ANALYZE。有不同的东西。

    如果您想在不应用更改的情况下查询成本和时间,您唯一真正的选择是开始事务,在EXPLAIN ANALYZE 下执行查询,然后在ROLLBACK 下执行。

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

    • 消耗 CPU 时间和 I/O
    • 在此期间仍会锁定并保持锁定
    • 新行实际上被写入表和索引,但从未标记为可见。他们在接下来的VACUUM清理。

    【讨论】:

    • 您好,感谢您的回复。好吧,可能我的表述有点不清楚,我的意思是我想找到一种方法来手动指定表的统计信息,说表A实际上没有数据,但我想让PostgreSQL认为有该表中有 1000 行,因此我可以使用模拟统计信息来评估查询。
    • @user1780833 是的,非常不清楚!在这一点上,考虑发布一个新的,其中包含那些相当重要的细节和任何其他相关背景。
    【解决方案2】:

    即使没有插入数据,您也可以解释查询,这将帮助您了解执行计划。

    但是没有真实数据这样的东西 :) 作为一种解决方法,您可以做的是开始交易,插入一些数据,解释分析您的查询,然后回滚您的交易。

    例子:

    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 显示有一些“临时”数据 (rows=1)

    这不是严格意义上的“模拟”,但至少,PostgreSQL 计划执行(以及它可以做的各种优化)应该是,恕我直言,比没有数据最好(免责声明:纯粹直观)

    【讨论】:

    • 啊...并在您的 ROLLBACK 之后添加一个 VACUUM ANALYZE your_table 可能有助于清除用于执行计划的统计数据中的潜在修改...但我不是 PostgreSQL 专家,我不确定如果回滚的事务也回滚表统计信息。
    猜你喜欢
    • 2013-04-29
    • 2023-03-02
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多