Перейти к основному содержанию
Перейти к основному содержанию

Клауза 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. Пример показан ниже:

SELECT
    Title,
    count() * 10 AS PageViews
FROM hits_distributed
SAMPLE 0.1
WHERE
    CounterID = 34
GROUP BY Title
ORDER BY PageViews DESC LIMIT 1000

В этом примере запрос выполняется на выборке в 0,1 (10 %) данных. Значения агрегатных функций не корректируются автоматически, поэтому, чтобы получить приблизительный результат, значение функции count() вручную умножается на 10.

SAMPLE N

Здесь n — достаточно большое целое число. Например, SAMPLE 10000000.

В этом случае запрос выполняется на выборке как минимум из n строк (но не существенно больше этого). Например, SAMPLE 10000000 выполняет запрос как минимум по 10 000 000 строк.

Поскольку минимальной единицей чтения данных является одна гранула (ее размер задается настройкой index_granularity), имеет смысл задавать выборку, которая значительно больше размера гранулы.

При использовании оператора SAMPLE n вы не знаете, какой относительный процент данных был обработан. Поэтому вы не знаете коэффициент, на который нужно умножать агрегатные функции. Используйте виртуальный столбец _sample_factor, чтобы получить приближенный результат.

Столбец _sample_factor содержит относительные коэффициенты, которые вычисляются динамически. Этот столбец создается автоматически при создании таблицы с заданным ключом выборки (sampling key). Примеры использования столбца _sample_factor приведены ниже.

Рассмотрим таблицу visits, которая содержит статистику посещений сайта. Первый пример показывает, как посчитать количество просмотров страниц:

SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000

Следующий пример показывает, как вычислить общее количество посещений:

SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000

В приведённом ниже примере показано, как вычислить среднюю длительность сессии. Обратите внимание, что для расчёта средних значений не требуется использовать относительный коэффициент.

SELECT avg(Duration)
FROM visits
SAMPLE 10000000

SAMPLE K OFFSET M

Здесь k и m — числа в диапазоне от 0 до 1. Примеры приведены ниже.

Пример 1

SAMPLE 1/10

В этом примере выборка равна 1/10 от всех данных:

[++------------]

Пример 2

SAMPLE 1/10 OFFSET 1/2

Здесь берётся выборка 10 % из второй половины данных.

[------++------]