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

Клаузула 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 содержит относительные коэффициенты, которые вычисляются динамически. Этот столбец создается автоматически, когда вы создаете таблицу с указанным ключом выборки. Примеры использования столбца _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% берется из второй половины данных.

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