Re: [pgsql-ru-general] Партицирование и план запросов и индексы

Поиск
Список
Период
Сортировка
От Konstantin Gerasimenko
Тема Re: [pgsql-ru-general] Партицирование и план запросов и индексы
Дата
Msg-id 5610127D.8040405@gmx.net
обсуждение исходный текст
Список pgsql-ru-general
03.10.2015 15:16, Dmitry E. Oboukhov пишет:

смотрю EXPLAIN:

Result  (cost=0.00..189.86 rows=48 width=24) (actual time=0.064..0.483 rows=143 loops=1)
->  Append  (cost=0.00..189.86 rows=48 width=24) (actual time=0.063..0.470 rows=143 loops=1)
      ->  Seq Scan on points  (cost=0.00..0.00 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=1)
            Filter: (("time" >= '2015-10-03 15:41:48+03'::timestamp with time zone) AND ("time" <= '2015-10-03 16:03:28+03'::timestamp with time zone) AND (driver = '310758'::text))
      ->  Bitmap Heap Scan on points_2015_10_03 points  (cost=5.78..189.86 rows=47 width=24) (actual time=0.063..0.460 rows=143 loops=1)
            Recheck Cond: ((driver = '310758'::text) AND ("time" >= '2015-10-03 15:41:48+03'::timestamp with time zone) AND ("time" <= '2015-10-03 16:03:28+03'::timestamp with time zone))
            ->  Bitmap Index Scan on points_2015_10_03_driver_time_idx  (cost=0.00..5.77 rows=47 width=0) (actual time=0.049..0.049 rows=143 loops=1)
                  Index Cond: ((driver = '310758'::text) AND ("time" >= '2015-10-03 15:41:48+03'::timestamp with time zone) AND ("time" <= '2015-10-03 16:03:28+03'::timestamp with time zone))
Total runtime: 0.533 ms


В логе этот же запрос 3 минуты назад выполнялся за 34 сек.
а на explain - 0.533 ms почему такая разница может быть?
"3 (три) минуты назад" данные были не в кеше , и операционке пришлось обращаться к сравнительно медленным жостким дискам.

А тепер данные в кеше и все работает мухой.

для решения таких проблем есть два решения:
1- купить SSD в качестве места хранения базы данных. (сразу говорю что не хочу вступать в спор о том насколько это нужно.)
2- время от времени сортировать вашу "партицию". под этим я имею в виду команду "cluster points_2015_10_03 using points_2015_10_03_driver_time_idx" ( http://www.postgresql.org/docs/9.4/static/sql-cluster.html ). но нужно понимать что запросы с выборкой только по времени начнут тормозить )))


Далее

последние две строки мне понятны: берет из индекса с условием под которое индекс построен.
но мне непонятно почему после этого еще делается

  ->  Bitmap Heap Scan on points_2015_10_03 points  (cost=5.78..189.86 rows=47 width=24) (actual time=0.063..0.460 rows=143 loops=1)
        Recheck Cond: ((driver = '310758'::text) AND ("time" >= '2015-10-03 15:41:48+03'::timestamp with time zone) AND ("time" <= '2015-10-03 16:03:28+03'::timestamp with time zone))

и речек кондишен.
Почему так?
В старых версиях постгреста в индексе нет видимости состояния транзакции (тоесть данные могуть быть уже удалены в какойто старой транзакции) потому необходима проверка по тракзакционной видимости которая записанв в таблице.  потому "Recheck"

если выбирать минуя партицию - напрямую, то Bitmap Heap Scan + Recheck Cond
все равно остаются.

Может кто-то пояснить мне этот EXPLAIN?
Выше описал.

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: "Dmitry E. Oboukhov"
Дата:
Сообщение: Партицирование и план запросов и индексы
Следующее
От: Миша Тюрин
Дата:
Сообщение: Re: [pgsql-ru-general] Партицирование и план запросов и индексы