Query Cache
Query Cache — это мощная функция Selena, которая может значительно повысить производительность агрегатных запросов. Сохраняя промежуточные результаты локальных агрегаций в памяти, Query Cache может избежать ненужного доступа к диску и вычислений для новых запросов, которые идентичны или похожи на предыдущие. С помощью Query Cache Selena может предоставлять быстрые и точные результаты для агрегатных запросов, экономя время и ресурсы и обеспечивая лучшую масштабируемость. Query Cache особенно полезен в сценариях с высокой конкурентностью, где многие пользователи выполняют похожие запросы на больших и сложных наборах данных.
Эта функция поддерживается начиная с версии 1.5.0.
В версии 2.5 Query Cache поддерживает только агрегатные запросы к отдельным плоским таблицам. Начиная с версии 1.5.0, Query Cache также поддерживает агрегатные запросы к нескольким таблицам, соединенным в схеме звезды.
Сценарии применения
Мы рекомендуем использовать Query Cache в следующих сценариях:
- Вы часто выполняете агрегатные запросы к отдельным плоским таблицам или к нескольким соединенным таблицам, которые связаны в схеме звезды.
- Большинство ваших агрегатных запросов — это агрегатные запросы без GROUP BY и агрегатные запросы GROUP BY с низкой кардинальностью.
- Ваши данные загружаются в режиме добавления по временным разделам и могут быть категоризированы как горячие данные и холодные данные на основе частоты доступа.
Query Cache поддерживает запросы, которые соответствуют следующим условиям:
-
Движок запросов — Pipeline. Чтобы включить движок Pipeline, установите переменную сессии
enable_pipeline_engineвtrue.ПРИМЕЧАНИЕ
Другие движки запросов не поддерживают Query Cache.
-
Запросы к нативным OLAP таблицам (с версии 2.5) или облачно-нативным таблицам (с версии 3.0). Query Cache не поддерживает запросы к внешним таблицам. Query Cache также поддерживает запросы, планы которых требуют доступа к синхронным материализованным представлениям. Однако Query Cache не поддерживает запросы, планы которых требуют доступа к асинхронным материализованным представлениям.
-
Запросы являются агрегатными запросами к отдельным таблицам или к нескольким соединенным таблицам.
ПРИМЕЧАНИЕ
- Query Cache поддерживает Broadcast Join и Bucket Shuffle Join.
- Query Cache поддерживает две древовидные структуры, содержащие операторы Join: Aggregation-Join и Join-Aggregation. Shuffle joins не поддерживаются в структуре дерева Aggregation-Join, в то время как Hash joins не поддерживаются в структуре дерева Join-Aggregation.
-
Запросы не включают недетерминированные функции, такие как
rand,random,uuidиsleep.
Query Cache поддерживает запросы к таблицам, которые используют любую из следующих политик разделения: Unpartitioned, Multi-Column Partitioned и Single-Column Partitioned.
Ограничения функции
- Query Cache основан на вычислениях по tablet'ам движка Pipeline. Вычисление по tablet'ам означает, что драйвер pipeline может обрабатывать целые tablet'ы один за другим, а не обрабатывать часть tablet'а или множество tablet'ов вперемешку. Если количество tablet'ов, которые нужно обработать каждым отдельным BE для запроса, больше или равно количеству драйверов pipeline, которые вызываются для выполнения этого запроса, Query Cache работает. Количество вызванных драйверов pipeline представляет фактическую степень параллелизма (DOP). Если количество tablet'ов меньше количества драйверов pipeline, каждый драйвер pipeline обрабатывает только часть конкретного tablet'а. В этой ситуации результаты вычислений по tablet'ам не могут быть получены, и поэтому Query Cache не работает.
- В Selena агрегатный запрос состоит как минимум из четырех этапов. Результаты вычислений по tablet'ам, генерируемые AggregateNode на первом этапе, могут быть кэшированы только тогда, когда OlapScanNode и AggregateNode вычисляют данные из одного и того же фрагмента. Результаты вычислений по tablet'ам, генерируемые AggregateNode на других этапах, не могут быть кэшированы. Для некоторых DISTINCT агрегатных запросов, если переменная сессии
cbo_cte_reuseустановлена вtrue, Query Cache не работает, когда OlapScanNode, который производит данные, и AggregateNode первого этапа, который потребляет произведенные данные, вычисляют данные из разных фрагментов и соединены ExchangeNode. Следующие два примера показывают сценарии, в которых выполняются оптимизации CTE и поэтому Query Cache не работает:- Выходные столбцы вычисляются с использованием агрегатной функции
avg(distinct). - Выходные столбцы вычисляются несколькими DISTINCT агрегатными функциями.
- Выходные столбцы вычисляются с использованием агрегатной функции
- Если ваши данные перемешиваются перед агрегацией, Query Cache не может ускорить запросы к этим данным.
- Если столбцы group-by или столбцы дедупликации таблицы являются столбцами с высокой кардиналь ностью, для агрегатных запросов к этой таблице будут генерироваться большие результаты. В этих случаях запросы будут обходить Query Cache во время выполнения.
- Query Cache занимает небольшое количество памяти, предоставляемой BE для сохранения результатов вычислений. Размер Query Cache по умолчанию составляет 512 МБ. Поэтому Query Cache не подходит для сохранения элементов данных большого размера. Кроме того, после включения Query Cache производительность запросов снижается, если коэффициент попаданий в кэш низкий. Поэтому, если размер результатов вычислений, генерируемых для tablet'а, превышает порог, указанный параметром
query_cache_entry_max_bytesилиquery_cache_entry_max_rows, Query Cache больше не работает для запроса, и запрос переключается в режим Passthrough.
Как это работает
Когда Query Cache включен, каждый BE разделяет локальную агрегацию запроса на следующие два этапа:
-
Агрегация по tablet'ам
BE обрабатывает каждый tablet индивидуально. Когда BE начинает обрабатывать tablet, он сначала проверяет Query Cache, чтобы увидеть, находится ли промежуточный результат агрегации по этому tablet'у в Query Cache. Если да (попадание в кэш), BE напрямую извлекает промежуточный результат из Query Cache. Если нет (промах кэша), BE обращается к данным на диске и выполняет локальную агрегацию для вычисления промежуточного результата. Когда BE заканчивает обработку tablet'а, он заполняет Query Cache промежуточным результатом агрегации по этому tablet'у.
-
Межтабletная агрегация
BE собирает промежуточные результаты со всех tablet'ов, участвующих в запросе, и объединяет их в окончательный результат.

Когда в будущем выдается похожий запрос, он может повторно использовать кэшированный результат предыдущего запроса. Например, запрос, показанный на следующем рисунке, включает три tablet'а (Tablets 0-2), и промежуточный результат для первого tablet'а (Tablet 0) уже находится в Query Cache. Для этого примера BE может напрямую извлечь результат для Tablet 0 из Query Cache вместо обращения к данным на ди ске. Если Query Cache полностью прогрет, он может содержать промежуточные результаты для всех трех tablet'ов, и таким образом BE не нужно обращаться к каким-либо данным на диске.

Для освобождения дополнительной памяти Query Cache использует политику вытеснения на основе Least Recently Used (LRU) для управления записями кэша в нем. Согласно этой политике вытеснения, когда объем памяти, занимаемый Query Cache, превышает его предопределенный размер (query_cache_capacity), наименее недавно используемые записи кэша вытесняются из Query Cache.
ПРИМЕЧАНИЕ
В будущем Selena также будет поддерживать политику вытеснения на основе Time to Live (TTL), основанную на которой записи кэша могут быть вытеснены из Query Cache.
FE определяет, нужно ли каждый запрос ускорять с помощью Query Cache, и нормализует запросы для устранения тривиальных литеральных деталей, которые не влияют на семантику запросов.
Чтобы предотвратить снижение производительности, вызванное плохими случаями Query Cache, BE использует адаптивную политику для обхода Query Cache во время выполнения.
Включение Query Cache
В этом разделе описываются параметры и переменные сессии, которые используются для включения и настройки Query Cache.
Переменные сессии FE
| Переменная | Значение по умолчанию | Может быть динамически настроена | Описание |
|---|---|---|---|
| enable_query_cache | false | Да | Указывает, включать ли Query Cache. Допустимые значения: true и false. true указывает на включение этой функции, а false указывает на отключение этой функции. Когда Query Cache включен, он работает только для запросов, которые соответствуют условиям, указанным в разделе "Сценарии применения" этой те мы. |
| query_cache_entry_max_bytes | 4194304 | Да | Указывает порог для запуска режима Passthrough. Допустимые значения: 0 до 9223372036854775807. Когда количество байтов или строк из результатов вычислений конкретного tablet'а, к которому обращается запрос, превышает порог, указанный параметром query_cache_entry_max_bytes или query_cache_entry_max_rows, запрос переключается в режим Passthrough.Если параметр query_cache_entry_max_bytes или query_cache_entry_max_rows установлен в 0, режим Passthrough используется даже тогда, когда из задействованных tablet'ов не генерируются результаты вычислений. |
| query_cache_entry_max_rows | 409600 | Да | То же, что и выше. |
Параметры BE
Вам нужно настроить следующий параметр в файле конфигурации BE be.conf. После перенастройки этого параметра для BE вы должны перезапустить BE, чтобы новая настройка параметра вступила в силу.
| Параметр | Обязательный | Описание |
|---|---|---|
| query_cache_capacity | Нет | Указывает размер Query Cache. Единица: байты. Размер по умолчанию составляет 512 МБ. Каждый BE имеет свой собственный локальный Query Cache в памяти, и он заполняет и проверяет только свой собственный Query Cache. Обратите внимание, что размер Query Cache не может быть меньше 4 МБ. Если емкость памяти BE недостаточна для обеспечения ожидаемого размера Query Cache, вы можете увеличить емкость памяти BE. |
Разработан для максимального коэффициента попаданий в кэш во всех сценариях
Рассмотрим три сценария, где Query Cache все еще эффективен, даже когда запросы не идентичны буквально. Эти три сценария:
- Семантически эквивалентные запросы
- Запросы с перекрывающимися сканируемыми разделам и
- Запросы к данным с изменениями данных только для добавления (без операций UPDATE или DELETE)
Семантически эквивалентные запросы
Когда два запроса похожи, что не означает, что они должны быть буквально эквивалентными, но означает, что они содержат семантически эквивалентные фрагменты в своих планах выполнения, они считаются семантически эквивалентными и могут повторно использовать результаты вычислений друг друга. В широком смысле два запроса семантически эквивалентны, если они запрашивают данные из одного источника, используют один и тот же метод вычисления и имеют один и тот же план выполнения. Selena применяет следующие правила для оценки того, являются ли два запроса семантически эквивалентными:
-
Если два запроса содержат несколько агрегаций, они оцениваются как семантически эквивалентные, если их первые агрегации семантически экви валентны. Например, следующие два запроса, Q1 и Q2, оба содержат несколько агрегаций, но их первые агрегации семантически эквивалентны. Поэтому Q1 и Q2 оцениваются как семантически эквивалентные.
-
Q1
SELECT
(
ifnull(sum(murmur_hash3_32(hour)), 0) + ifnull(sum(murmur_hash3_32(k0)), 0) + ifnull(sum(murmur_hash3_32(__c_0)), 0)
) AS fingerprint
FROM
(
SELECT
date_trunc('hour', ts) AS hour,
k0,
sum(v1) AS __c_0
FROM
t0
WHERE
ts between '2022-01-03 00:00:00'
and '2022-01-03 23:59:59'
GROUP BY
date_trunc('hour', ts),
k0
) AS t; -
Q2
SELECT
date_trunc('hour', ts) AS hour,
k0,
sum(v1) AS __c_0
FROM
t0
WHERE
ts between '2022-01-03 00:00:00'
and '2022-01-03 23:59:59'
GROUP BY
date_trunc('hour', ts),
k0
-
-
Если оба запроса принадлежат к одному из следующих типов запросов, они могут быть оценены как семантически эквивалентные. Обратите внимание, что запросы, которые включают предложение HAVING, не могут быть оценены как семантически эквивалентные запросам, которые не включают предложение HAVING. Однако включение предложения ORDER BY или LIMIT не влияет на оценку того, являются ли два запроса семантически эквивалентными.
-
GROUP BY агрегации
SELECT <GroupByItems>, <AggFunctionItems>
FROM <Table>
WHERE <Predicates> [and <PartitionColumnRangePredicate>]
GROUP BY <GroupByItems>
[HAVING <HavingPredicate>]ПРИМЕЧАНИЕ
В предыдущем примере предложение HAVING является необязательным.
-
GROUP BY DISTINCT агрегации
SELECT DISTINCT <GroupByItems>, <Items>
FROM <Table>
WHERE <Predicates> [and <PartitionColumnRangePredicate>]
GROUP BY <GroupByItems>
HAVING <HavingPredicate>ПРИМЕЧАНИЕ
В предыдущем примере предложение HAVING является необязательным.
-
Агрегации без GROUP BY
SELECT <AggFunctionItems> FROM <Table>
WHERE <Predicates> [and <PartitionColumnRangePredicate>] -
DISTINCT агрегации без GROUP BY
SELECT DISTINCT <Items> FROM <Table>
WHERE <Predicates> [and <PartitionColumnRangePredicate>]
-
-
Если любой из запросов включает
PartitionColumnRangePredicate,PartitionColumnRangePredicateудаляется перед оценкой двух запросов на семантическую эквивалентность.PartitionColumnRangePredicateуказывает один из следующих типов предикатов, которые ссылаются на столбец разделения:col between v1 and v2: Значения столбца разделения попадают в диапазон [v1, v2], гдеv1иv2— константные выражения.v1 < col and col < v2: Значения столбца разделения попадают в диапазон (v1, v2), гдеv1иv2— константные выражения.v1 < col and col <= v2: Значения столбц а разделения попадают в диапазон (v1, v2], гдеv1иv2— константные выражения.v1 <= col and col < v2: Значения столбца разделения попадают в диапазон [v1, v2), гдеv1иv2— константные выражения.v1 <= col and col <= v2: Значения столбца разделения попадают в диапазон [v1, v2], гдеv1иv2— константные выражения.
-
Если выходные столбцы предложений SELECT двух запросов одинаковы после их перестановки, два запроса оцениваются как семантически эквивалентные.
-
Если выходные столбцы предложений GROUP BY двух запросов одинаковы после их перестановки, два запроса оцениваются как семантически эквивалентные.
-
Если оставшиеся предикаты предложений WHERE двух запросов семантически эквивалентны после удаления
PartitionColumnRangePredicate, два запроса оцениваются как семантически эквивалентные. -
Если предикаты в предложениях HAVING двух запросов семантически эквивалентны, два запроса оцениваются как семантически эквивалентные.
Используйте следующую таблицу lineorder_flat в качестве примера:
CREATE TABLE `lineorder_flat`
(
`lo_orderdate` date NOT NULL COMMENT "",
`lo_orderkey` int(11) NOT NULL COMMENT "",
`lo_linenumber` tinyint(4) NOT NULL COMMENT "",
`lo_custkey` int(11) NOT NULL COMMENT "",
`lo_partkey` int(11) NOT NULL COMMENT "",
`lo_suppkey` int(11) NOT NULL COMMENT "",
`lo_orderpriority` varchar(100) NOT NULL COMMENT "",
`lo_shippriority` tinyint(4) NOT NULL COMMENT "",
`lo_quantity` tinyint(4) NOT NULL COMMENT "",
`lo_extendedprice` int(11) NOT NULL COMMENT "",
`lo_ordtotalprice` int(11) NOT NULL COMMENT "",
`lo_discount` tinyint(4) NOT NULL COMMENT "",
`lo_revenue` int(11) NOT NULL COMMENT "",
`lo_supplycost` int(11) NOT NULL COMMENT "",
`lo_tax` tinyint(4) NOT NULL COMMENT "",
`lo_commitdate` date NOT NULL COMMENT "",
`lo_shipmode` varchar(100) NOT NULL COMMENT "",
`c_name` varchar(100) NOT NULL COMMENT "",
`c_address` varchar(100) NOT NULL COMMENT "",
`c_city` varchar(100) NOT NULL COMMENT "",
`c_nation` varchar(100) NOT NULL COMMENT "",
`c_region` varchar(100) NOT NULL COMMENT "",
`c_phone` varchar(100) NOT NULL COMMENT "",
`c_mktsegment` varchar(100) NOT NULL COMMENT "",
`s_name` varchar(100) NOT NULL COMMENT "",
`s_address` varchar(100) NOT NULL COMMENT "",
`s_city` varchar(100) NOT NULL COMMENT "",
`s_nation` varchar(100) NOT NULL COMMENT "",
`s_region` varchar(100) NOT NULL COMMENT "",
`s_phone` varchar(100) NOT NULL COMMENT "",
`p_name` varchar(100) NOT NULL COMMENT "",
`p_mfgr` varchar(100) NOT NULL COMMENT "",
`p_category` varchar(100) NOT NULL COMMENT "",
`p_brand` varchar(100) NOT NULL COMMENT "",
`p_color` varchar(100) NOT NULL COMMENT "",
`p_type` varchar(100) NOT NULL COMMENT "",
`p_size` tinyint(4) NOT NULL COMMENT "",
`p_container` varchar(100) NOT NULL COMMENT ""
)
ENGINE=OLAP
DUPLICATE KEY(`lo_orderdate`, `lo_orderkey`)
COMMENT "olap"
PARTITION BY RANGE(`lo_orderdate`)
(PARTITION p1 VALUES [('0000-01-01'), ('1993-01-01')),
PARTITION p2 VALUES [('1993-01-01'), ('1994-01-01')),
PARTITION p3 VALUES [('1994-01-01'), ('1995-01-01')),
PARTITION p4 VALUES [('1995-01-01'), ('1996-01-01')),
PARTITION p5 VALUES [('1996-01-01'), ('1997-01-01')),
PARTITION p6 VALUES [('1997-01-01'), ('1998-01-01')),
PARTITION p7 VALUES [('1998-01-01'), ('1999-01-01')))
DISTRIBUTED BY HASH(`lo_orderkey`)
PROPERTIES
(
"replication_num" = "3",
"colocate_with" = "groupxx1",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "false",
"compression" = "LZ4"
);
Следующие два запроса, Q1 и Q2, к таблице lineorder_flat семантически эквивалентны после их обработки следующим образом:
- Переставить выходные столбцы оператора SELECT.
- Переставить выходные столбцы предложения GROUP BY.
- Удалить выходные столбцы предложения ORDER BY.
- Переставить предикаты в предложении WHERE.
- Добавить
PartitionColumnRangePredicate.
-
Q1
SELECT sum(lo_revenue), year(lo_orderdate) AS year,p_brand
FROM lineorder_flat
WHERE p_category = 'MFGR#12' AND s_region = 'AMERICA'
GROUP BY year,p_brand
ORDER BY year,p_brand; -
Q2
SELECT year(lo_orderdate) AS year, p_brand, sum(lo_revenue)
FROM lineorder_flat
WHERE s_region = 'AMERICA' AND p_category = 'MFGR#12' AND
lo_orderdate >= '1993-01-01' AND lo_orderdate <= '1993-12-31'
GROUP BY p_brand, year(lo_orderdate)
Семантическая эквивалентность оценивается на основе физических планов запросов. Поэтому буквальные различия в запросах не влияют на оценку семантической эквивалентности. Кроме того, константные выражения удаляются из запросов, а выражения cast удаляются во время оптимизации запросов. Поэтому эти выражения не влияют на оценку семантической эквивалентности. В-третьих, псевдонимы столбцов и отношений также не влияют на оценку семантической эквивалентности.
Запросы с перекрывающимися сканируемыми разделами
Query Cache поддерживает разделение запросов на основе предикатов.
Разделение запросов на основе семантики предикатов помогает реализовать повторное использование частичных результатов вычислений. Когда запрос содержит предикат, который ссылается на столбец разделения таблицы, и предикат указывает диапазон значений, Selena может разделить диапазон на несколько интервалов на основе разделения таблицы. Результаты вычислений из каждого отдельного интервала могут быть отдельно повторно использованы другими запросами.
Используйте следующую таблицу t0 в качестве примера:
CREATE TABLE if not exists t0
(
ts DATETIME NOT NULL,
k0 VARCHAR(10) NOT NULL,
k1 BIGINT NOT NULL,
v1 DECIMAL64(7, 2) NOT NULL
)
ENGINE=OLAP
DUPLICATE KEY(`ts`, `k0`, `k1`)
COMMENT "OLAP"
PARTITION BY RANGE(ts)
(
START ("2022-01-01 00:00:00") END ("2022-02-01 00:00:00") EVERY (INTERVAL 1 day)
)
DISTRIBUTED BY HASH(`ts`, `k0`, `k1`)
PROPERTIES
(
"replication_num" = "3",
"storage_format" = "default"
);
Таблица t0 разделена по дням, и столбец ts является столбцом разде ления таблицы. Среди следующих четырех запросов Q2, Q3 и Q4 могут повторно использовать части результатов вычислений, кэшированных для Q1:
-
Q1
SELECT date_trunc('day', ts) as day, sum(v0)
FROM t0
WHERE ts BETWEEN '2022-01-02 12:30:00' AND '2022-01-14 23:59:59'
GROUP BY day;Диапазон значений, указанный предикатом
ts between '2022-01-02 12:30:00' and '2022-01-14 23:59:59'запроса Q1, может быть разделен на следующие интервалы:1. [2022-01-02 12:30:00, 2022-01-03 00:00:00),
2. [2022-01-03 00:00:00, 2022-01-04 00:00:00),
3. [2022-01-04 00:00:00, 2022-01-05 00:00:00),
...
12. [2022-01-13 00:00:00, 2022-01-14 00:00:00),
13. [2022-01-14 00:00:00, 2022-01-15 00:00:00), -
Q2
SELECT date_trunc('day', ts) as day, sum(v0)
FROM t0
WHERE ts >= '2022-01-02 12:30:00' AND ts < '2022-01-05 00:00:00'
GROUP BY day;Q2 может повторно использовать результаты вычислений в следующих интервалах Q1:
1. [2022-01-02 12:30:00, 2022-01-03 00:00:00),
2. [2022-01-03 00:00:00, 2022-01-04 00:00:00),
3. [2022-01-04 00:00:00, 2022-01-05 00:00:00), -
Q3
SELECT date_trunc('day', ts) as day, sum(v0)
FROM t0
WHERE ts >= '2022-01-01 12:30:00' AND ts <= '2022-01-10 12:00:00'
GROUP BY day;Q3 может повторно использовать результаты вычислений в следующих интервалах Q1:
2. [2022-01-03 00:00:00, 2022-01-04 00:00:00),
3. [2022-01-04 00:00:00, 2022-01-05 00:00:00),
...
8. [2022-01-09 00:00:00, 2022-01-10 00:00:00), -
Q4
SELECT date_trunc('day', ts) as day, sum(v0)
FROM t0
WHERE ts BETWEEN '2022-01-02 12:30:00' and '2022-01-02 23:59:59'
GROUP BY day;Q4 может повторно использовать результаты вычислений в следующих интервалах Q1:
1. [2022-01-02 12:30:00, 2022-01-03 00:00:00),
Поддержка повторного использования частичных результатов вычислений варьируется в зависимости от используемой политики разделения, как описано в следующей таблице.
| Политика разделения | Поддержка повторного использования частичных результатов вычислений |
|---|---|
| Unpartitioned | Не поддерживается |
| Multi-Column Partitioned | Не поддерживается ПРИМЕЧАНИЕ Эта функция может быть поддержана в будущем. |
| Single-Column Partitioned | Поддерживается |
Запросы к данным с изменениями данных только для добавления
Query Cache поддерживает многоверсионное кэширование.
По мере загрузки данных генерируются новые версии tablet'ов. Следовательно, кэшированные результаты вычислений, которые генерируются из предыдущих версий tablet'ов, становятся устаревшими и отстают от последних версий tablet'ов. В этой ситуации механизм многоверсионного кэширования пытается объединить устаревшие результаты, сохраненные в Query Cache, и инкрементальные версии tablet'ов, хранящиеся на диске, в окончательные результаты tablet'ов, чтобы новые запросы могли нести последние версии tablet'ов. Многоверсионное кэширование ограничено типами таблиц, типами запросов и типами обновления данных.
Поддержка многоверсионного кэширования варьируется в зависимости от типов таблиц и типов запросов, как описано в следующей таблице.
| Тип таблицы | Тип запроса | Поддержка многоверсионного кэширования |
|---|---|---|
| Duplicate Key table |
|
|
| Aggregate table | Запросы к базовым таблицам или запросы к синхронным материализованным представлениям | Поддерживается во всех ситуациях, кроме следующих: Схемы базовых таблиц содержат агрегатную функцию replace. Предложения GROUP BY, HAVING или WHERE запросов ссылаются на столбцы агрегации. Инкрементальные версии tablet'ов содержат записи удаления данных. |
| Unique Key table | Н/Д | Не поддерживается. Однако Query Cache поддерживается. |
| Primary Key table | Н/Д | Не поддерживается. Однако Query Cache поддерживается. |
Влияние типов обновления данных на многоверсионное кэширование следующее:
-
Удаления данных
Многоверсионное кэширование не может работать, если инкрементальные версии tablet'ов содержат операции удаления.
-
Вставки данных
- Если для tablet'а генерируется пустая версия, существующие данные tablet'