2014-01-09 1 views
1

Оператор ANALYZE может использоваться в PostgreSQL для сбора статистических данных таблиц. Однако я не хочу вставлять эти данные в таблицы, мне просто нужно оценить стоимость некоторых запросов, так или иначе вручную указывать статистические данные таблиц в PostgreSQL без фактического ввода данных в него?Как вручную обновлять статистические данные таблиц в PostgreSQL

ответ

2

Я думаю, что вы путаетесь ANALYZE с EXPLAIN ANALYZE. Есть разные вещи.

Если вам нужны затраты и сроки запроса без применения изменений, единственная реальная опция, которую вы имеете, - это начать транзакцию, выполнить запрос под EXPLAIN ANALYZE, а затем ROLLBACK.

Это все еще выполняет запрос, а это означает, что:

  • процессорного времени и I/O потребляются
  • Замки все еще принимаются и проводятся в течение всего срока
  • новые строки фактически записаны в таблицах и индексы, но никогда не заметны. Они очищаются в следующем VACUUM.
+0

Привет, спасибо за ваш ответ. Ну, может быть, мое заявление несколько неясное, я имею в виду, что я хочу найти способ вручную указать статистику таблиц, скажем, что таблица A не имеет данных на деле, но я хочу, чтобы PostgreSQL считал, что там 1000 строк в этой таблице, поэтому я могу использовать статистику макета для оценки запроса. – yingzhox

+0

@ user1780833 Да, очень неясно! На этом этапе рассмотрите вопрос о публикации нового, который включает в себя такие весьма важные детали и любой другой соответствующий контекст. –

1

Вы уже можете ОБЪЯВЛЯТЬ 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) 

1-й EXPLAIN ANALYZE показывает, что Существовал некоторые "временные" данных (строки = 1)

Это не строго "ложно", но, по крайней мере, план PostgreSQL выполнение (и различные оптимизации, которые оно может сделать) должно быть, ИМХО, лучше, чем без данных (отказ от ответственности: чисто интуитивный)

+0

А ... и добавив ВАКУУМНЫЙ АНАЛИЗ your_table после того, как ваш ROLLBACK может помочь очистить потенциальные изменения в статистике, используемой для плана выполнения ... Но я не эксперт PostgreSQL, я не уверен, что если откатные транзакции также отображают статистику отката , –

Смежные вопросы