2014-01-09 61 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專家,我不確定回滾事務是否也回滾表統計信息。 –

相關問題