> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по SAMPLE

# SAMPLE

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

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

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

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

<Note>
  Сэмплирование можно использовать только с таблицами семейства [MergeTree](/ru/reference/engines/table-engines/mergetree-family/mergetree) и только если выражение для семплирования было указано при создании таблицы (см. [движок MergeTree](/ru/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-creating-a-table)).
</Note>

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

* Сэмплирование данных — это детерминированный механизм. Результат одного и того же запроса `SELECT .. SAMPLE` всегда одинаков.
* Сэмплирование работает согласованно для разных таблиц. Для таблиц с одним ключом выборки выборка с одинаковым коэффициентом всегда содержит одно и то же подмножество возможных данных. Например, выборка по идентификаторам пользователей берёт строки с одним и тем же подмножеством всех возможных идентификаторов пользователей из разных таблиц. Это означает, что выборку можно использовать в подзапросах в предложении [IN](/ru/reference/statements/in). Также можно объединять выборки с помощью предложения [JOIN](/ru/reference/statements/select/join).
* Сэмплирование позволяет считывать с диска меньше данных. Обратите внимание, что ключ выборки должен быть указан правильно. Подробнее см. в разделе [Создание таблицы MergeTree](/ru/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-creating-a-table).

Для предложения `SAMPLE` поддерживается следующий синтаксис:

| Синтаксис предложения SAMPLE | Описание                                                                                                                                                                                                                         |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SAMPLE k`                   | Здесь `k` — число от 0 до 1. Запрос выполняется по доле данных `k`. Например, `SAMPLE 0.1` выполняет запрос по 10% данных. [Подробнее](#sample-k)                                                                                |
| `SAMPLE n`                   | Здесь `n` — достаточно большое целое число. Запрос выполняется по выборке не менее чем из `n` строк (но не намного больше). Например, `SAMPLE 10000000` выполняет запрос как минимум по 10 000 000 строк. [Подробнее](#sample-n) |
| `SAMPLE k OFFSET m`          | Здесь `k` и `m` — числа от 0 до 1. Запрос выполняется по выборке доли данных `k`. Данные, используемые для выборки, смещаются на долю `m`. [Подробнее](#sample-k-offset-m)                                                       |

<div id="sample-k">
  ## SAMPLE K
</div>

Здесь `k` — число от 0 до 1 (поддерживаются как дробная, так и десятичная формы записи). Например, `SAMPLE 1/2` или `SAMPLE 0.5`.

В предложении `SAMPLE k` выборка берётся из доли данных `k`. Пример показан ниже:

```sql theme={null}
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.

<div id="sample-n">
  ## SAMPLE N
</div>

Здесь `n` — достаточно большое целое число. Например, `SAMPLE 10000000`.

В этом случае запрос выполняется на выборке как минимум из `n` строк (но не намного больше). Например, `SAMPLE 10000000` выполняет запрос как минимум по 10 000 000 строкам.

Поскольку минимальная единица чтения данных — одна гранула (её размер задаётся настройкой `index_granularity`), имеет смысл задавать выборку, значительно превышающую размер гранулы.

При использовании предложения `SAMPLE n` вы не знаете, какой относительный процент данных был обработан. Поэтому неизвестно, на какой коэффициент следует умножать агрегатные функции. Чтобы получить приблизительный результат, используйте виртуальный столбец `_sample_factor`.

Столбец `_sample_factor` содержит относительные коэффициенты, которые вычисляются динамически. Этот столбец создаётся автоматически, когда вы [создаёте](/ru/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-creating-a-table) таблицу с указанным ключом выборки. Примеры использования столбца `_sample_factor` приведены ниже.

Рассмотрим таблицу `visits`, содержащую статистику посещений сайта. Первый пример показывает, как вычислить количество просмотров страниц:

```sql theme={null}
SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000
```

В следующем примере показано, как рассчитать общее количество посещений:

```sql theme={null}
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000
```

В примере ниже показано, как рассчитать среднюю продолжительность сеанса. Обратите внимание: для расчёта средних значений относительный коэффициент использовать не нужно.

```sql theme={null}
SELECT avg(Duration)
FROM visits
SAMPLE 10000000
```

<div id="sample-k-offset-m">
  ## SAMPLE K OFFSET M
</div>

Здесь `k` и `m` — числа от 0 до 1. Примеры приведены ниже.

**Пример 1**

```sql theme={null}
SAMPLE 1/10
```

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

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

**Пример 2**

```sql theme={null}
SAMPLE 1/10 OFFSET 1/2
```

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

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