Обсуждение: Партицирование и план запросов и индексы

Поиск
Список
Период
Сортировка

Партицирование и план запросов и индексы

От
"Dmitry E. Oboukhov"
Дата:
Имеется таблица

"points"
(
    "id" BIGSERIAL,
    "driver" TEXT NOT NULL,
    "time" TIMESTAMP WITH TIME ZONE NOT NULL,
    "lon" NUMERIC(9,6) NOT NULL,
    "lat" NUMERIC(9,6) NOT NULL
)

и ежедневно создается партиция

CREATE TABLE "points_2015_10_01" (
    LIKE "points" INCLUDING ALL,
    CHECK (
            "time" >= '2015-10-01 00:00:00'
        AND "time" <  '2015-10-02 00:00:00'
    )
) INHERITS ("points")

Имеется индекс

BTREE ("driver", "time")

Далее каждый раз когда новая партиция создается этот индекс попадает и
в нее.
Вставку осуществляем только в партиции.

Однако выборку делаем из points.

Допустим надо получить трек водителя:

SELECT
    "time", "lon", "lat"
FROM
    "points"
WHERE
    "driver" = 'driver-id'
    AND "time" BETWEEN '2015-10-01 11:12:13' AND '2015-10-01 12:30:35'
ORDER BY
    "time"
;

Столкнулся что эти запросы выполняются очень большое время, хотя вроде
все под них подстроено.

смотрю 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'::timestampwith 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=143loops=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.049rows=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 почему такая разница может быть?

Далее

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

 ->  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=143loops=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 Heap Scan + Recheck Cond
все равно остаются.

Может кто-то пояснить мне этот EXPLAIN?
--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Вложения

порядок вставки

От
"Dmitry E. Oboukhov"
Дата:
WITH
"a" AS (
    SELECT 1 AS "col"
),
"b" AS (
    SELECT 2 AS "col"
),
"bc" AS (
    SELECT
        *
    FROM
        "a"

    UNION ALL

    SELECT
        *
    FROM
        "b"
)
INSERT INTO "table" ("col")

SELECT
    *
FROM
    "bc"
;

Вопрос: есть ли гарантия того что в таблицу "table" записи вставятся
строго в том порядке в котором они в таблице "bc" или нет?


--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Вложения