[Документация Yandex Cloud](../../index.md) > [Yandex Query](../index.md) > [Концепции](index.md) > Аналитическая обработка данных > Расширенное партицирование

# Расширенное партицирование

[Партицирование](partitioning.md) позволяет подсказать для Yandex Query правила размещения данных в Yandex Object Storage.

Предположим, что данные в Yandex Object Storage хранятся в следующей структуре каталогов:

```text
year=2021
    month=01
    month=02
    month=03
year=2022
    month=01
```

При выполнении запроса ниже Yandex Query выполнит следующие действия:
1. Получит полный список подкаталогов внутри '/'.
1. Для каждого подкаталога выполнит попытку обработать имя подкаталога в формате "year=\<DIGITS\>". 
1. Для каждого подкаталога "year=\<DIGITS\>" получит список всех подкаталогов в формате "month=\<DIGITS\>".
1. Обработает считанные данные.

```sql
SELECT 
    * 
FROM 
    objectstorage.'/' 
    WITH
    (
        Schema =
        (
            data String, 
            year Int, 
            month Int
        ),
        partitioned_by = 
        (
            year,
            month
        )
    ) 
WHERE 
    year=2021 
    AND month=02
```

То есть при работе с партицированными данными выполняется полный листинг содержимого Yandex Object Storage, что может занимать продолжительное время на бакетах большого размера.

Для оптимизации работы на больших объемах данных следует использовать "расширенное партицирование". В этом режиме не происходит сканирования каталогов Yandex Object Storage, вместо этого все пути вычисляются заранее и обращение происходит только к ним.

Для работы расширенного партицирования необходимо задать правила работы через специальный параметр - "projection". В этом параметре описываются все правила размещения данных в каталога Yandex Object Storage.

## Синтаксис {#syntax}

Расширенное партицирование называется "partition projection" и задается через параметр `projection`.

Пример указания расширенного партицирования:

```sql

$projection = 
@@ 
{
    "projection.enabled" : true,

    "projection.year.type" : "integer",
    "projection.year.min" : 2010,
    "projection.year.max" : 2022,
    "projection.year.interval" : 1,

    "projection.month.type" : "integer",
    "projection.month.min" : 1,
    "projection.month.max" : 12,
    "projection.month.interval" : 1,
    "projection.month.digits" : 2,

    "storage.location.template" : "${year}/${month}"
}
@@;

SELECT 
    * 
FROM 
    <соединение>.`/`
WITH 
(
    schema=
    (
        data String, 
        year Int, 
        month Int
    ), 
    partitioned_by=(year, month),
    projection=$projection
)
```

В примере выше указывается, что данные существуют за каждый год и каждый месяц с 2010 по 2022 годы, при этом в бакете данные размещены в каталогах вида `2022/12`.

В общем виде настройка расширенного партицирования выглядит следующим образом:

```sql

$projection = 
@@ 
{
    "projection.enabled" : <доступность_расширенного_партицирования>,

    "projection.<имя_поля_1>.type" : "<тип>",
    "projection.<имя_поля_1>...." : "<свойства>",

    "projection.<имя_поля_2>.type" : "<тип>",
    "projection.<имя_поля_2>...." : "<свойства>",

    "storage.location.template" : ".../${<имя_поля_2>}/${<имя_поля_1>}/..."
}
@@;

SELECT 
    * 
FROM 
    <соединение>.<путь> 
WITH 
(
    schema=(<поля>, <поле_1>, <поле_2>), 
    partitioned_by=(<имя_поля_1>, <имя_поля_2>),
    projection=$projection
)
```

## Описание полей {#field_types}

|Название поля|Описание поля|Допустимые значения|
|----|----|----|
|`projection.enabled`|Включено или нет расширенное партицирование| true, false|
|`projection.<имя_поля_1>.type`|Тип данных поля|integer, enum, date|
|`projection.<имя_поля_1>.XXX`|Свойства конкретного типа||

### Поле типа integer {#integer_type}

Используется для колонок, чьи значения можно представить в виде целых чисел диапазона -2^63^ до 2^63^-1.

|Название поля|Обязательное|Описание поля|Пример значений|
|----|----|----|----|
|`projection.<имя_поля>.type`|Да|Тип данных поля|integer|
|`projection.<имя_поля>.min`|Да|Определяет минимально допустимое значение. Задается в виде целого числа|-100<br>004|
|`projection.<имя_поля>.max`|Да|Определяет максимально допустимое значение. Задается в виде целого числа|-10<br>5000|
|`projection.<имя_поля>.interval`|Нет, по умолчанию `1`|Определяет шаг между элементами внутри диапазона значений. Например, шаг 3 при диапазоне значений 2, 10, приведет к следующим значениям: 2, 5, 8|2<br>11|
|`projection.<имя_поля>.digits`|Нет, по умолчанию `0`|Определяет количество цифр в числе. Если ненулевых цифр в числе меньше, чем указанное значение, то значение дополняется нулями спереди вплоть до числа указанного числа цифр. Например, если указано значение .digits=3, а передается число 2, то оно будет превращено в значение 002|2<br>4|

### Поле типа enum {#enum_type}

Используется для колонок, чьи значения можно представить в виде перечисления значений.

|Название поля|Обязательное|Описание поля|Пример значений
|----|----|----|----|
|`projection.<имя_поля>.type`|Да|Тип данных поля|enum|
|`projection.<имя_поля>.values`|Да|Определяет допустимые значения, указанные через запятую. Пробелы не игнорируются|1, 2<br>A,B,C|

### Поле типа date {#date_type}

Используется для колонок, чьи значения можно представить в виде даты. 

|Название поля|Обязательное|Описание поля|Пример значений|
|----|----|----|----|
|`projection.<имя_поля>.type`|Да|Тип данных поля|date|
|`projection.<имя_поля>.min`|Да|Определяет минимально допустимую дату. Разрешены значения в формате `YYYY-MM-DD` или в виде выражения, содержащего специальную макроподстановку NOW. С макроподстановкой NOW возможно выполнять арифметические действия:  <br>NOW-3DAYS, <br> NOW+1MONTH, <br>NOW-6YEARS, <br>NOW+4HOURS, <br>NOW-5MINUTES, <br> NOW+6SECONDS. |2020-01-01<br/>NOW-5DAYS<br/>NOW+3HOURS|
|`projection.<имя_поля>.max`|Да|Определяет максимально допустимую дату. Разрешены значения в формате `YYYY-MM-DD` или в виде выражения, содержащего специальную макроподстановку NOW. С макроподстановкой NOW возможно выполнять арифметические действия:  <br>NOW-3DAYS, <br> NOW+1MONTH, <br>NOW-6YEARS, <br>NOW+4HOURS, <br>NOW-5MINUTES, <br> NOW+6SECONDS. |2020-01-01<br/>NOW-5DAYS<br/>NOW+3HOURS|
|`projection.<имя_поля>.format`|Да|Строка форматирования даты на основе [strptime](https://cplusplus.com/reference/ctime/strftime/)|%Y-%m-%d<br/>%D|
|`projection.<имя_поля>.unit`|Нет|Единицы измерения интервалов времени. Допустимые значения: DAYS|DAYS|
|`projection.<имя_поля>.interval`|Нет, по умолчанию `1`|Определяет шаг между элементами внутри диапазона значений с размерностью, указанной в `projection.<имя_поля>.unit`. Например, для диапазона 2021-02-02, 2021-03-05 шаг 15 c размерностью DAYS приведет к значениям: 2021-02-17, 2021-03-04|2<br/>6|

## Шаблоны путей {#storage_location_template}

Данные в бакетах Yandex Object Storage могут быть размещены в каталогах с произвольными названием. С помощью настройки `storage.location.template` можно указать правила именования каталогов, где хранятся данные.

|Название поля|Описание поля|Пример значений|
|----|----|----|
|`storage.location.template`|Шаблон пути имен каталогов. Задается в формате `${<имя_поля...>}/${<имя_поля...>}`|`root/a/${year}/b/${month}/d`<br/>`${year}/${month}`|

## Примеры использования {#examples}

* [Работа с данными в Yandex Object Storage](../tutorials/yq-storage.md).