Предложение 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 10000000SAMPLE K OFFSET M
Здесь k и m — числа от 0 до 1. Примеры приведены ниже.
Пример 1
SAMPLE 1/10В этом примере выборка составляет одну десятую всех данных:
[++------------]
Пример 2
SAMPLE 1/10 OFFSET 1/2Здесь 10%-ная выборка берётся из второй половины данных.
[------++------]