Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

SAMPLE

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

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

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

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

Ниже перечислены особенности сэмплирования данных:

  • Сэмплирование данных — это детерминированный механизм. Результат одного и того же запроса 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

В этом примере выборка составляет одну десятую всех данных:

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

Пример 2

SAMPLE 1/10 OFFSET 1/2

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

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

Navigation