May 11

Clickhouse. Использование ключа типа String в словаре (draft). complex_key_hashed

В заметке рассказывается о том, что делать, если ключ в словаре имеет не числовой тип, а строковый.

Существует несколько способов хранения словарей в памяти, каждый из которых имеет свои компромиссы между использованием CPU и RAM (дока Clickhouse). И если - так сложились обстоятельства - ключ словаря это натуральный ключ из источника имеющий строковый тип, а не UInt64, то параметр Layout придётся делать complex_key_hashed.

Посмотрим на примере из пет-проекта. Есть такой источник

Словарь создаётся так

CREATE DICTIONARY portfolio.actual_quotation_dict
(
ticker           String,
quotation        Decimal64(6)
)
PRIMARY KEY ticker
SOURCE(CLICKHOUSE(
	QUERY 'SELECT ticker, quotation FROM portfolio.actual_quotation'
	USER 'username'
	PASSWORD 'password'
	HOST 'localhost'
    PORT 9000
))
LIFETIME(MIN 600 MAX 900)
LAYOUT(complex_key_hashed())

И теперь при использовании словаря вызывая dictGet, нужно обернуть значение из словаря в tuple()

SELECT instr_short, ticker, qty, quotation
,dictGet('portfolio.actual_quotation_dict', 'quotation', tuple(ticker)) as act_quotation
, equity, balance_datetime
FROM portfolio.portfolio_history