При создании иерархической многораздельной таблицы Vertica возникает ошибка


Я использую Vertica Analytic Database v8.1.1-8.
Я создал таблицу с простым предложением о разделении как:

CREATE TABLE public.test
(
    id timestamp NOT NULL,
    cid numeric(37,15) NOT NULL DEFAULT 0
) 
UNSEGMENTED ALL NODES PARTITION BY id::DATE;

Таблица была успешно создана, и я вставил в нее несколько строк. Но когда я выполняю следующий SQL,

SELECT DUMP_PARTITION_KEYS();

Я вижу следующее:

Partition keys on node v_public_node0001
  Projection 'test_super'
   No of partition keys: 0

 Partition keys on node v_public_node0003
  Projection 'test_super'
   No of partition keys: 0

Я ожидал, что должны быть какие-то действительные «ключи раздела».
Итак, интересно, не пропустил ли я здесь хоть один шаг?

Как мне убедиться, что моя таблица действительно «секционирована»?

2) Затем я попробовал «Иерархическое разбиение» с мета-функцией CALENDAR_HIERARCHY_DAY, чтобы усилить группировку разделов. Но само создание расписания не удалось.

CREATE TABLE public.test
(
    id timestamp NOT NULL,
    cid numeric(37,15) NOT NULL DEFAULT 0
) 
UNSEGMENTED ALL NODES PARTITION BY id::DATE 
 GROUP BY CALENDAR_HIERARCHY_DAY(id::DATE, 2, 2);

со следующей ошибкой:

16:45:14  [CREATE - 0 rows, 0.130 secs]  [Code: 4856, SQL State: 42601]  [Vertica][VJDBC](4856) ERROR: Syntax error at or near "GROUP"
... 1 statement(s) executed, 0 rows affected, exec/fetch time: 0.130/0.000 sec  [0 successful, 1 errors]

Может кто-нибудь, пожалуйста. подскажите, что я сделал не так?
Моя цель - создать таблицу с иерархическим секционированием.

Большое спасибо заранее,
- Kuntal


person javauser71    schedule 08.03.2019    source источник


Ответы (1)


1) Причина, по которой вы не видите ключи разделов сразу после вставки, заключается в том, что разбиение на разделы происходит только на диске (для каждого узла, для каждой проекции). Когда вы вставляете строки в таблицу, они записываются в оптимизированное для записи хранилище (WOS) или другими словами. По истечении заданного интервала данные в памяти (WOS) записываются на диск или в хранилище, оптимизированное для чтения (ROS). В этот момент вы увидите ключи разделов.

Процесс копирования данных из WOS в ROS выполняется средством перемещения кортежей (https://www.vertica.com/docs/latest/HTML/Content/Authoring/Glossary/TupleMover.htm).

Короче говоря, чтобы увидеть ключи разделов, либо подождите около 5 минут, пока движитель кортежей не запустит автоматический moveout, либо вы можете принудительно записать данные из WOS в ROS, выполнив ручной moveout.

SELECT DO_TM_TASK('moveout', 'public.test');

Затем вы должны увидеть ключи.

2) Иерархическое разделение - это функция Vertica 9. Чтобы использовать эту функцию, вам необходимо обновить версию до Vertica 9.0.

https://www.vertica.com/blog/whats-new-vertica-9-0-hierarchical-partitioning/

person A. Saunders    schedule 08.03.2019
comment
Большое спасибо Сондерсу - теперь я вижу разделенные ключи. - person javauser71; 08.03.2019
comment
@ javauser71 Рад помочь. Я надеюсь, что это немного проясняет архитектуру Vertica. Если я адекватно ответил на вопрос, не могли бы вы отметить его как принятый? В противном случае дайте мне знать, если есть еще что-то, что нужно объяснить. Спасибо! - person A. Saunders; 08.03.2019
comment
У меня есть еще один вопрос. Поскольку я разделил данные по дате, поэтому, если я хочу запросить данные за определенную дату, нужно ли мне упоминать какие-либо параметры, относящиеся к разделу, в моем SQL? или значение простого столбца даты подскажет Vertica извлечь данные из этого конкретного раздела? Например, SELECT * from test, где id ›= '2019-03-07 00:00:00' и id‹ '2019-03-07 23:59:59' предоставит все данные за 2019-03-07? - person javauser71; 08.03.2019
comment
@ javauser71 Vertica позаботится об обрезке раздела за вас. Ваш пример будет работать. Vertica распознает, что вы выполняете фильтрацию по столбцу раздела, и автоматически обрежет разделы за вас. Чтобы проверить, запустите свой запрос, а затем запросите query_events системную таблицу и найдите STORAGE_CONTAINERS_ELIMINATED в столбце event_type. В качестве примечания для производительности я бы разделил на INT, а не на DATE. Это можно сделать следующим образом: PARTITION BY (DATE_PART('year', id) * 10000 + DATE_PART('month', id) * 100 + DATE_PART('day', id))::INT. - person A. Saunders; 09.03.2019