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

Клаузула SAMPLE

Клаузула SAMPLE позволяет выполнять приближённую обработку запроса SELECT.

Когда выборка данных включена, запрос выполняется не по всем данным, а только по определённой доле данных (выборке). Например, если вам нужно посчитать статистику по всем визитам, достаточно выполнить запрос на 1/10 части всех визитов, а затем умножить результат на 10.

Приближённая обработка запросов может быть полезна в следующих случаях:

  • Когда у вас есть жёсткие требования по времени отклика (например, менее 100 мс), но вы не можете оправдать стоимость дополнительных аппаратных ресурсов для их выполнения.
  • Когда ваши сырые данные неточны, поэтому использование аппроксимации существенно не ухудшает качество результатов.
  • Когда бизнес‑требования ориентированы на приблизительные результаты (ради экономии или для продажи точных результатов премиальным пользователям).

:::note
Вы можете использовать выборку только с таблицами семейства 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

ОБРАЗЕЦ 1/10

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

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

Пример 2

SAMPLE 1/10 OFFSET 1/2

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

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