Клаузула 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% берется из второй половины данных.
[------++------]