【发布时间】:2014-01-27 14:21:43
【问题描述】:
在PostgreSQL中可以使用ANALYZE语句来收集表的统计数据。但是,我并不想真正将这些数据插入表中,我只需要评估一些查询的成本,在PostgreSQL中是否可以手动指定表的统计数据而不实际放入数据?
【问题讨论】:
标签: sql performance postgresql statistics evaluation
在PostgreSQL中可以使用ANALYZE语句来收集表的统计数据。但是,我并不想真正将这些数据插入表中,我只需要评估一些查询的成本,在PostgreSQL中是否可以手动指定表的统计数据而不实际放入数据?
【问题讨论】:
标签: sql performance postgresql statistics evaluation
我认为你在混淆 ANALYZE 和 EXPLAIN ANALYZE。有不同的东西。
如果您想在不应用更改的情况下查询成本和时间,您唯一真正的选择是开始事务,在EXPLAIN ANALYZE 下执行查询,然后在ROLLBACK 下执行。
这仍然执行查询,这意味着:
VACUUM清理。【讨论】:
即使没有插入数据,您也可以解释查询,这将帮助您了解执行计划。
但是没有真实数据这样的东西 :) 作为一种解决方法,您可以做的是开始交易,插入一些数据,解释分析您的查询,然后回滚您的交易。
例子:
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 计划执行(以及它可以做的各种优化)应该是,恕我直言,比没有数据最好(免责声明:纯粹直观)
【讨论】: