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