Перейти к основному содержанию
Предложение SAMPLE позволяет выполнять приближённую обработку запросов SELECT. Когда сэмплирование данных включено, запрос выполняется не по всем данным, а только по некоторой их части (выборке). Например, если вам нужно рассчитать статистику по всем visits, достаточно выполнить запрос по 1/10 всех visits, а затем умножить результат на 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
В этом примере выборка составляет одну десятую всех данных: [++------------] Пример 2
SAMPLE 1/10 OFFSET 1/2
Здесь 10%-ная выборка берётся из второй половины данных. [------++------]
Последнее изменение 10 июня 2026 г.