оптимизация раздела Greenplum - PullRequest
       6

оптимизация раздела Greenplum

1 голос
/ 15 декабря 2011

В greenplum у меня есть большая таблица с именем fact_table, которая разделена на RANGE(day_bucket).Почему это так медленно для следующего запроса:

select max(day_bucket) from fact_table where day_bucket >= '2011-09-11 00:00:00' and day_bucket < '2011-12-14'.

Полагаю, он должен просто посмотреть на заголовок каждого раздела и немедленно вернуть результат, поскольку каждый раздел одного и того же столбца day_bucket.Но greenplum сделал ПОЛНОЕ сканирование, чтобы вычислить результат.Кто-нибудь может объяснить мне причину?


Обновление:

Спасибо за ответ на мой вопрос, но это не поможет с вашим советом.Greenplum всегда выполняет полное сканирование, даже если я создаю таблицу с PARTITION BY LIST (day_bucket):

CREATE TABLE fact_table (
    id character varying(25) NOT NULL,
    day_bucket timestamp without time zone NOT NULL,
)
WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=6) DISTRIBUTED BY (user_id) PARTITION BY LIST(day_bucket) 
          (
          PARTITION p20120101 VALUES ('2012-01-01 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120101', appendonly=true, orientation=column, compresstype=zlib, compresslevel=6 ), 
          PARTITION p20120102 VALUES ('2012-01-02 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120102', appendonly=true, orientation=column, compresstype=zlib, compresslevel=6 ), 
          PARTITION p20120103 VALUES ('2012-01-03 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120103', appendonly=true, orientation=column, compresstype=zlib, compresslevel=6 ), 
          PARTITION p20120104 VALUES ('2012-01-04 00:00:00'::timestamp without time zone) WITH (tablename='fact_table_1_prt_p20120104', appendonly=true, orientation=column, compresstype=zlib, compresslevel=6 ), 
       .....

Команда объяснения показывает, что она всегда выполняет полное сканирование:

-> Столбец только для добавленияСканирование в mytestlist_1_prt_p20120102 mytestlist (стоимость = 0,00..34.95 строк = 1 ширина = 8) Фильтр: day_bucket> = '2012-01-02 00:00:00' :: отметка времени без часового пояса И day_bucket Сканирование столбцов только для добавления на mytestlist_1_prt_p20120103mytestlist (стоимость = 0.00..39.61 рядов = 1 ширина = 8) Фильтр: day_bucket> = '2012-01-02 00:00:00' :: отметка времени без часового пояса И day_bucket

1 Ответ

2 голосов
/ 16 декабря 2011

Вы должны обратить внимание на ограничения, накладываемые на ваши разделы. Чтобы оптимизатор правильно исключил некоторые разделы из сканирования, вам следует помочь ему. В вашем случае вы должны использовать явное приведение типов: (GP не мог автоматически понять на этапе планирования, что такие строки, как «гггг-мм-дд», фактически являются меткой времени)

select max(day_bucket) 
from fact_table 
where day_bucket >= '2011-09-11 00:00:00'::timestamp 
  and day_bucket <  '2011-12-14'::timestamp
...