Клаузула SAMPLE
Клаузула SAMPLE позволяет выполнять приближённую обработку запроса SELECT.
Когда выборка данных включена, запрос выполняется не по всем данным, а только по определённой доле данных (выборке). Например, если вам нужно посчитать статистику по всем визитам, достаточно выполнить запрос на 1/10 части всех визитов, а затем умножить результат на 10.
Приближённая обработка запросов может быть полезна в следующих случаях:
- Когда у вас есть жёсткие требования по времени отклика (например, менее 100 мс), но вы не можете оправдать стоимость дополнительных аппаратных ресурсов для их выполнения.
- Когда ваши сырые данные неточны, поэтому использование аппроксимации существенно не ухудшает качество результатов.
- Когда бизнес‑требования ориентированы на приблизительные результаты (ради экономии или для продажи точных результатов премиальным пользователям).
:::note
Вы можете использовать выборку только с таблицами семейства MergeTree и только если выражение для выборки было указано при создании таблицы (см. движок MergeTree).
:::
Особенности выборки данных перечислены ниже:
- Выборка данных является детерминированным механизмом. Результат одного и того же запроса
SELECT .. SAMPLEвсегда одинаков. - Выборка работает согласованно для разных таблиц. Для таблиц с одним ключом выборки выборка с одинаковым коэффициентом всегда выбирает один и тот же поднабор возможных данных. Например, выборка по идентификаторам пользователей берёт строки с одинаковым поднабором всех возможных идентификаторов пользователей из разных таблиц. Это означает, что вы можете использовать выборку во вложенных запросах в клаузуле IN. Также вы можете объединять выборки с помощью клаузулы JOIN.
- Выборка позволяет читать меньше данных с диска. Обратите внимание, что вы должны корректно указать ключ выборки. Дополнительную информацию см. в разделе Создание таблицы MergeTree.
Для клаузулы SAMPLE поддерживается следующий синтаксис:
| Синтаксис клаузулы SAMPLE | Описание |
|---|---|
SAMPLE k | Здесь k — число от 0 до 1. Запрос выполняется на доле данных k. Например, SAMPLE 0.1 запускает запрос на 10% данных. Подробнее |
SAMPLE n | Здесь n — достаточно большое целое число. Запрос выполняется на выборке как минимум из n строк (но не значительно больше этого). Например, SAMPLE 10000000 запускает запрос как минимум на 10 000 000 строк. Подробнее |
SAMPLE k OFFSET m | Здесь k и m — числа от 0 до 1. Запрос выполняется на выборке из k доли данных. Данные, используемые для выборки, смещены на долю m. Подробнее |
SAMPLE K
Здесь k — число от 0 до 1 (поддерживаются как дробная, так и десятичная формы записи). Например, SAMPLE 1/2 или SAMPLE 0.5.
В конструкции SAMPLE k выборка производится из части данных, составляющей долю k. Пример приведён ниже:
В этом примере запрос выполняется по 0.1 (10%) объёма данных. Значения агрегатных функций не корректируются автоматически, поэтому для получения приближённого результата значение count() вручную умножается на 10.
SAMPLE N
Здесь n — достаточно большое целое число. Например, SAMPLE 10000000.
В этом случае запрос выполняется на выборке как минимум из n строк (но и не существенно больше этого). Например, SAMPLE 10000000 выполняет запрос как минимум по 10 000 000 строк.
Поскольку минимальной единицей чтения данных является один гранул (его размер задаётся настройкой index_granularity), имеет смысл задавать выборку, которая существенно больше размера гранула.
При использовании клаузы SAMPLE n неизвестно, какой относительный процент данных был обработан. Следовательно, неизвестен коэффициент, на который следует умножать результат агрегатных функций. Используйте виртуальный столбец _sample_factor для получения приблизительного результата.
Столбец _sample_factor содержит относительные коэффициенты, которые вычисляются динамически. Этот столбец создаётся автоматически при создании таблицы с заданным sampling key. Примеры использования столбца _sample_factor приведены ниже.
Рассмотрим таблицу visits, которая содержит статистику посещений сайта. Первый пример показывает, как посчитать количество просмотров страниц:
Следующий пример показывает, как посчитать общее число посещений:
Пример ниже показывает, как рассчитать среднюю длительность сеанса. Обратите внимание, что для расчёта средних значений вам не требуется использовать относительный коэффициент.
SAMPLE K OFFSET M
Здесь k и m — числа в диапазоне от 0 до 1. Примеры приведены ниже.
Пример 1
В этом примере объём выборки составляет 1/10 от всех данных:
[++------------]
Пример 2
Здесь берётся выборка 10% из второй половины набора данных.
[------++------]