Перейти к основному содержанию
Квоты в ClickHouse CloudКвоты поддерживаются в ClickHouse Cloud, но их нужно создавать с помощью синтаксиса DDL. Описанный ниже подход с XML-конфигурацией не поддерживается.
Квоты позволяют ограничивать использование ресурсов за определённый период времени или отслеживать их использование. Квоты задаются в пользовательской конфигурации, обычно в файле ‘users.xml’. В системе также есть возможность ограничивать сложность отдельного запроса. См. раздел Ограничения на сложность запросов. В отличие от ограничений на сложность запроса, квоты:
  • Ограничивают набор запросов, которые можно выполнять в течение заданного периода времени, вместо того чтобы ограничивать отдельный запрос.
  • Учитывают ресурсы, затраченные на всех удалённых серверах при распределённой обработке запросов.
Рассмотрим раздел файла ‘users.xml’, в котором задаются квоты.
<!-- Квоты -->
<quotas>
    <!-- Имя квоты. -->
    <default>
        <!-- Ограничения для временного периода. Можно задать несколько интервалов с разными ограничениями. -->
        <interval>
            <!-- Длина интервала. -->
            <duration>3600</duration>

            <!-- Без ограничений. Только сбор данных за указанный временной интервал. -->
            <queries>0</queries>
            <query_selects>0</query_selects>
            <query_inserts>0</query_inserts>
            <errors>0</errors>
            <result_rows>0</result_rows>
            <read_rows>0</read_rows>
            <execution_time>0</execution_time>
        </interval>
    </default>
По умолчанию квота отслеживает потребление ресурсов за каждый час, не ограничивая их использование. Потребление ресурсов, рассчитанное для каждого периода, выводится в журнал сервера после каждого запроса.
<statbox>
    <!-- Ограничения для временного периода. Можно задать несколько интервалов с разными ограничениями. -->
    <interval>
        <!-- Длина интервала. -->
        <duration>3600</duration>

        <queries>1000</queries>
        <query_selects>100</query_selects>
        <query_inserts>100</query_inserts>
        <written_bytes>5000000</written_bytes>
        <errors>100</errors>
        <result_rows>1000000000</result_rows>
        <read_rows>100000000000</read_rows>
        <execution_time>900</execution_time>
        <failed_sequential_authentications>5</failed_sequential_authentications>
    </interval>

    <interval>
        <duration>86400</duration>

        <queries>10000</queries>
        <query_selects>10000</query_selects>
        <query_inserts>10000</query_inserts>
        <errors>1000</errors>
        <result_rows>5000000000</result_rows>
        <result_bytes>160000000000</result_bytes>
        <read_rows>500000000000</read_rows>
        <result_bytes>16000000000000</result_bytes>
        <execution_time>7200</execution_time>
    </interval>
</statbox>
Для квоты ‘statbox’ ограничения задаются на каждый час и на каждые 24 часа (86 400 секунд). Временной интервал отсчитывается от фиксированного момента времени, определяемого реализацией. Иными словами, 24-часовой интервал не обязательно начинается в полночь. Когда интервал заканчивается, все накопленные значения сбрасываются. Для следующего часа расчёт квоты начинается заново. Вот какие величины можно ограничивать: queries – Общее количество запросов. query_selects – Общее количество запросов SELECT. query_inserts – Общее количество запросов на вставку. errors – Количество запросов, вызвавших исключение. result_rows – Общее количество строк, возвращённых в результате. result_bytes - Общий размер строк, возвращённых в результате. read_rows – Общее количество исходных строк, прочитанных из таблиц для выполнения запроса на всех удалённых серверах. read_bytes - Общий объём данных, прочитанных из таблиц для выполнения запроса на всех удалённых серверах. written_bytes - Общий объём записанных данных. execution_time – Общее время выполнения запроса в секундах (реальное время). failed_sequential_authentications - Общее количество последовательных ошибок аутентификации. queries_per_normalized_hash – Максимальное число выполнений любого нормализованного запроса. Нормализованные запросы — это запросы, в которых литералы заменены плейсхолдерами, поэтому SELECT 1 и SELECT 2 считаются одним и тем же нормализованным запросом. Этот лимит отслеживается независимо для каждого отдельного нормализованного шаблона запроса. Если лимит превышен хотя бы в одном временном интервале, генерируется исключение с сообщением о том, какое ограничение было превышено, для какого интервала и когда начинается новый интервал (то есть когда запросы снова можно будет отправлять). Квоты могут использовать возможность “quota key”, чтобы независимо учитывать ресурсы для нескольких ключей. Вот пример:
<!-- Для глобального дизайнера отчётов. -->
<web_global>
    <!-- keyed – "Ключ" quota_key передаётся в параметре запроса,
            и квота отслеживается отдельно для каждого значения ключа.
        Например, можно передавать имя пользователя в качестве ключа —
            тогда квота будет учитываться отдельно для каждого имени пользователя.
        Использование ключей имеет смысл только в том случае, если quota_key передаётся программой, а не пользователем.

        Также можно указать <keyed_by_ip />, тогда в качестве ключа квоты будет использоваться IP-адрес.
        (Но учтите, что пользователи могут достаточно легко менять IPv6-адрес.)
    -->
    <keyed />
При использовании синтаксиса DDL вы также можете задавать квоты по нормализованному хешу запроса, чтобы для каждого отдельного шаблона запроса создавался собственный независимый бакет квоты:
CREATE QUOTA my_quota KEYED BY normalized_query_hash FOR INTERVAL 1 hour MAX queries = 100 TO my_user;
В этом примере пользователь может выполнять до 100 запросов каждого уникального нормализованного вида в час. SELECT number FROM numbers(1) и SELECT number FROM numbers(2) используют один и тот же бакет (поскольку у них одинаковая нормализованная форма), а SELECT number, number FROM numbers(1) использует отдельный бакет. Квота назначается пользователям в разделе ‘users’ конфигурации. См. раздел “Права доступа”. При распределённой обработке запросов накопленные значения хранятся на сервере, отправившем запрос. Поэтому, если пользователь переключится на другой сервер, квота там “начнёт отсчёт заново”. При перезапуске сервера квоты сбрасываются.
Последнее изменение 10 июня 2026 г.