Перейти к основному содержимому
Версия: 2.0.x

CREATE DICTIONARY

Создаёт объект словаря на основе исходного объекта. Объект словаря организует сопоставления ключ-значение из исходного объекта в форме хеш-таблицы и кэшируется в памяти всех узлов BE. Его можно рассматривать как кэшированную таблицу.

Преимущества

  • Более широкий выбор исходных объектов для объектов словаря: При использовании dictionary_get() для запросов к объектам словаря исходным объектом может быть таблица любого типа, асинхронное материализованное представление или логическое представление. Однако при использовании dict_mapping() для запросов к таблицам словаря, таблицы словаря могут быть только таблицами с первичным ключом.
  • Высокая скорость запросов: Поскольку объект словаря является хеш-таблицей и полностью кэшируется в памяти всех узлов BE, запрос к объекту словаря для получения сопоставления реализуется путём поиска в хеш-таблице в памяти. Поэтому скорость запросов очень высокая.
  • Поддержка нескольких столбцов значений: Внутренне объект словаря кодирует несколько столбцов значений в один столбец типа STRUCT. При запросах по ключу возвращаются все значения вместе. Поэтому объект словаря может служить таблицей измерений, где каждый ключ (обычно уникальный идентификатор) соответствует нескольким значениям (описательным атрибутам).
  • Обеспечение согласованного чтения снимков: Снимок словаря, полученный в рамках одной транзакции, является согласованным, что гарантирует, что результаты запросов из объекта словаря не изменятся в ходе одного и того же запроса или процесса загрузки.

Синтаксис

CREATE DICTIONARY <dictionary_object_name> USING <dictionary_source>
(
column_name KEY, [..., column_name KEY,]
column_name VALUE[, ..., column_name VALUE]
)
[PROPERTIES ("key"="value", ...)];

Параметры

  • dictionary_object_name: Имя объекта словаря. Объект словаря действует глобально и не принадлежит конкретной базе данных.
  • dictionary_source: Имя исходного объекта, на основе которого создаётся объект словаря. Исходным объектом может быть таблица любого типа, асинхронное материализованное представление или логическое представление.
  • Определение столбцов в объекте словаря: Для сохранения сопоставления ключ-значение, поддерживаемого в таблице словаря, необходимо использовать ключевые слова KEY и VALUE в столбцах объекта словаря для указания ключей и их сопоставленных значений.
    • Имена столбцов column_name в объекте словаря должны совпадать с именами в таблице словаря.
    • Типы данных для столбцов ключей и значений в объекте словаря ограничены логическим, целочисленным, строковым типами и типами дат.
    • Столбец ключа в исходном объекте должен обеспечивать уникальность.
  • Связанные свойства объектов словаря (PROPERTIES):
    • dictionary_warm_up: Метод кэширования данных в объект словаря на каждом узле BE. Допустимые значения: TRUE (по умолчанию) или FALSE. Если параметр установлен в TRUE, данные автоматически кэшируются в объект словаря после его создания; если параметр установлен в FALSE, необходимо вручную обновить объект словаря для кэширования данных.
    • dictionary_memory_limit: Максимальный объём памяти, который объект словаря может занимать на каждом узле BE. Единица измерения: байты. Значение по умолчанию: 2 000 000 000 байт (2 ГБ).
    • dictionary_refresh_interval: Интервал периодического обновления объекта словаря. Единица измерения: секунды. Значение по умолчанию: 0. Значение <=0 означает отсутствие автоматического обновления.
    • dictionary_read_latest: Следует ли запрашивать только последний объект словаря, что в основном влияет на объект словаря, запрашиваемый во время обновления. Допустимые значения: TRUE или FALSE (по умолчанию). Если параметр установлен в TRUE, объект словаря не может быть запрошен во время обновления, так как последний объект словаря ещё обновляется. Если параметр установлен в FALSE, во время обновления можно запросить ранее успешно закэшированный объект словаря.
    • dictionary_ignore_failed_refresh: Следует ли автоматически откатываться к последнему успешно закэшированному объекту словаря при неудачном обновлении. Допустимые значения: TRUE или FALSE (по умолчанию). Если параметр установлен в TRUE, при неудачном обновлении происходит автоматический откат к последнему успешно закэшированному объекту словаря. Если параметр установлен в FALSE, при неудачном обновлении статус объекта словаря устанавливается в CANCELLED.

Примечания по использованию

  • Объект словаря полностью кэшируется в памяти каждого узла BE, поэтому потребляет относительно больше памяти.
  • Даже если исходный объект удалён, созданный на его основе объект словаря продолжает существовать. Необходимо вручную удалить (DROP) объект словаря.

Примеры

Пример 1: Создание простого объекта словаря для замены исходной таблицы словаря.

Возьмём следующую таблицу словаря в качестве примера и вставим тестовые данные.

CREATE TABLE dict (
order_uuid STRING,
order_id_int BIGINT AUTO_INCREMENT
)
PRIMARY KEY (order_uuid)
DISTRIBUTED BY HASH (order_uuid);
INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3');
Query OK, 3 rows affected (0.12 sec)
{'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'}
SELECT * FROM dict;
+------------+--------------+
| order_uuid | order_id_int |
+------------+--------------+
| a1 | 1 |
| a2 | 2 |
| a3 | 3 |
+------------+--------------+
3 rows in set (0.01 sec)

Создайте объект словаря на основе сопоставлений в этой таблице словаря.

CREATE DICTIONARY dict_obj USING dict
(order_uuid KEY,
order_id_int VALUE);

Для последующих запросов сопоставлений в таблице словаря можно напрямую запрашивать объект словаря вместо таблицы словаря. Например, запрос значения, сопоставленного с ключом a1.

SELECT dictionary_get("dict_obj", "a1");
+--------------------+
| DICTIONARY_GET |
+--------------------+
| {"order_id_int":1} |
+--------------------+
1 row in set (0.01 sec)

Пример 2: Создание объекта словаря для замены исходной таблицы измерений

Возьмём следующую таблицу измерений в качестве примера и вставим тестовые данные.

CREATE TABLE ProductDimension (
ProductKey BIGINT AUTO_INCREMENT,
ProductName VARCHAR(100) NOT NULL,
Category VARCHAR(50),
SubCategory VARCHAR(50),
Brand VARCHAR(50),
Color VARCHAR(20),
Size VARCHAR(20)
)
PRIMARY KEY (ProductKey)
DISTRIBUTED BY HASH (ProductKey);
INSERT INTO ProductDimension (ProductName, Category, SubCategory, Brand, Color, Size)
VALUES
('T-Shirt', 'Apparel', 'Shirts', 'BrandA', 'Red', 'M'),
('Jeans', 'Apparel', 'Pants', 'BrandB', 'Blue', 'L'),
('Running Shoes', 'Footwear', 'Athletic', 'BrandC', 'Black', '10'),
('Jacket', 'Apparel', 'Outerwear', 'BrandA', 'Green', 'XL'),
('Baseball Cap', 'Accessories', 'Hats', 'BrandD', 'White', 'OneSize');
Query OK, 5 rows affected (0.48 sec)
{'label':'insert_e938481f-181e-11ef-a6a9-00163e19e14e', 'status':'VISIBLE', 'txnId':'50'}
SELECT * FROM ProductDimension;
+------------+---------------+-------------+-------------+--------+-------+---------+
| ProductKey | ProductName | Category | SubCategory | Brand | Color | Size |
+------------+---------------+-------------+-------------+--------+-------+---------+
| 1 | T-Shirt | Apparel | Shirts | BrandA | Red | M |
| 2 | Jeans | Apparel | Pants | BrandB | Blue | L |
| 3 | Running Shoes | Footwear | Athletic | BrandC | Black | 10 |
| 4 | Jacket | Apparel | Outerwear | BrandA | Green | XL |
| 5 | Baseball Cap | Accessories | Hats | BrandD | White | OneSize |
+------------+---------------+-------------+-------------+--------+-------+---------+
5 rows in set (0.02 sec)

Создайте объект словаря для замены исходной таблицы измерений.

CREATE DICTIONARY dimension_obj USING ProductDimension
(ProductKey KEY,
ProductName VALUE,
Category VALUE,
SubCategory VALUE,
Brand VALUE,
Color VALUE,
Size VALUE);
Query OK, 0 rows affected (0.00 sec)

Для последующих запросов значений измерений можно напрямую запрашивать объект словаря вместо таблицы измерений для получения значений измерений. Например, запрос значения, сопоставленного с ключом 1.

SELECT dictionary_get("dict_obj", "a1");
1 row in set (0.01 sec)
+-----------------------------------------+
| DICTIONARY_GET('dict_obj', 'a1', false) |
+-----------------------------------------+
| {"order_id_int":1} |
+-----------------------------------------+