SAMPLE позволяет выполнять приближённую обработку запросов SELECT.
Когда сэмплирование данных включено, запрос выполняется не по всем данным, а только по некоторой их части (выборке). Например, если вам нужно рассчитать статистику по всем visits, достаточно выполнить запрос по 1/10 всех visits, а затем умножить результат на 10.
Приближённая обработка запросов может быть полезна в следующих случаях:
- Когда у вас жёсткие требования к задержке (например, менее 100 мс), но дополнительные аппаратные ресурсы для их соблюдения не оправдывают затрат.
- Когда исходные данные сами по себе не очень точны, поэтому приближение не приводит к заметному ухудшению качества.
- Когда бизнес-требования допускают приблизительные результаты (ради снижения затрат или чтобы предоставлять точные результаты только премиум-пользователям).
Сэмплирование можно использовать только с таблицами семейства 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. Пример показан ниже:
count() вручную умножается на 10.
SAMPLE N
n — достаточно большое целое число. Например, SAMPLE 10000000.
В этом случае запрос выполняется на выборке как минимум из n строк (но не намного больше). Например, SAMPLE 10000000 выполняет запрос как минимум по 10 000 000 строкам.
Поскольку минимальная единица чтения данных — одна гранула (её размер задаётся настройкой index_granularity), имеет смысл задавать выборку, значительно превышающую размер гранулы.
При использовании предложения SAMPLE n вы не знаете, какой относительный процент данных был обработан. Поэтому неизвестно, на какой коэффициент следует умножать агрегатные функции. Чтобы получить приблизительный результат, используйте виртуальный столбец _sample_factor.
Столбец _sample_factor содержит относительные коэффициенты, которые вычисляются динамически. Этот столбец создаётся автоматически, когда вы создаёте таблицу с указанным ключом выборки. Примеры использования столбца _sample_factor приведены ниже.
Рассмотрим таблицу visits, содержащую статистику посещений сайта. Первый пример показывает, как вычислить количество просмотров страниц:
SAMPLE K OFFSET M
k и m — числа от 0 до 1. Примеры приведены ниже.
Пример 1
[++------------]
Пример 2
[------++------]