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