Оператор SAMPLE
Оператор SAMPLE
позволяет выполнять приближенные запросы SELECT
.
Когда включена выборка данных, запрос выполняется не ко всем данным, а только к определенной их части (выборке). Например, если вам нужно подсчитать статистику для всех визитов, достаточно выполнить запрос на 1/10 всех визитов и затем умножить результат на 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
доли данных. Пример показан ниже:
В этом примере запрос выполняется на выборке из 0.1 (10%) данных. Значения агрегатных функций не корректируются автоматически, поэтому для получения приблизительного результата значение 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
В этом примере выборка составляет 1/10 всех данных:
[++------------]
Пример 2
Здесь выборка 10% берется из второй половины данных.
[------++------]