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

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

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