As cotas permitem limitar o uso de recursos durante um período de tempo ou acompanhar esse uso. As cotas são configuradas na configuração do usuário, que geralmente é 'users.xml'.
O sistema também tem um recurso para limitar a complexidade de uma única consulta. Consulte a seção Restrictions on query complexity.
Em contraste com as restrições de complexidade de consulta, as cotas:
- Impõem restrições a um conjunto de consultas que podem ser executadas ao longo de um período, em vez de limitar uma única consulta.
- Contabilizam os recursos consumidos em todos os servidores remotos no processamento de consultas distribuídas.
Vamos examinar a seção do arquivo 'users.xml' que define as cotas.
<!-- Cotas -->
<quotas>
<!-- Nome da QUOTA. -->
<default>
<!-- Restrições para um período de tempo. É possível definir vários intervalos com restrições diferentes. -->
<interval>
<!-- Duração do intervalo. -->
<duration>3600</duration>
<!-- Sem limite. Apenas coleta dados para o intervalo de tempo especificado. -->
<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>Por padrão, a QUOTA acompanha o consumo de recursos a cada hora, sem limitar o uso. O consumo de recursos calculado para cada intervalo é registrado no log do servidor após cada solicitação.
<statbox>
<!-- Restrições para um período de tempo. Você pode definir vários intervalos com diferentes restrições. -->
<interval>
<!-- Duração do intervalo. -->
<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>Para a QUOTA 'statbox', as restrições são definidas para cada hora e para cada 24 horas (86.400 segundos). O intervalo de tempo é contado a partir de um momento fixo definido pela implementação. Em outras palavras, o intervalo de 24 horas não necessariamente começa à meia-noite.
Quando o intervalo termina, todos os valores coletados são zerados. Na próxima hora, o cálculo da QUOTA recomeça.
Aqui estão as quantidades que podem ser restringidas:
queries – O número total de requisições.
query_selects – O número total de requisições SELECT.
query_inserts – O número total de requisições INSERT.
errors – O número de consultas que geraram uma exceção.
result_rows – O número total de linhas retornadas como resultado.
result_bytes - O tamanho total das linhas retornadas como resultado.
read_rows – O número total de linhas de origem lidas das tabelas para executar a consulta em todos os servidores remotos.
read_bytes - O tamanho total lido das tabelas para executar a consulta em todos os servidores remotos.
written_bytes - O tamanho total de uma operação de gravação.
execution_time – O tempo total de execução da consulta, em segundos (wall time).
failed_sequential_authentications - O número total de falhas consecutivas de autenticação.
queries_per_normalized_hash – O número máximo de execuções de uma mesma consulta normalizada. Consultas normalizadas são consultas com literais substituídos por placeholders, portanto SELECT 1 e SELECT 2 são consideradas a mesma consulta normalizada. Esse limite é acompanhado de forma independente para cada padrão distinto de consulta normalizada.
Se o limite for excedido em pelo menos um intervalo de tempo, uma exceção será lançada com um texto informando qual restrição foi excedida, para qual intervalo e quando o novo intervalo começa (ou seja, quando as consultas podem ser enviadas novamente).
As QUOTAs podem usar o recurso "QUOTA key" para contabilizar recursos de várias chaves de forma independente. Veja um exemplo:
<!-- For the global reports designer. -->
<web_global>
<!-- keyed – The quota_key "key" is passed in the query parameter,
and the quota is tracked separately for each key value.
For example, you can pass a username as the key,
so the quota will be counted separately for each username.
Using keys makes sense only if quota_key is transmitted by the program, not by a user.
You can also write <keyed_by_ip />, so the IP address is used as the quota key.
(But keep in mind that users can change the IPv6 address fairly easily.)
Instead of <keyed_by_ip /> you can use <keyed_by_forwarded_ip />, so the address
from the X-Forwarded-For header is used as the quota key.
For both <keyed_by_ip /> and <keyed_by_forwarded_ip /> you can additionally specify
<ipv4_prefix_bits> and <ipv6_prefix_bits> to group clients by subnet instead of by a
single address: the IP address is masked to the given prefix length before being used
as the quota key. For example, <ipv4_prefix_bits>24</ipv4_prefix_bits> shares one bucket
across a /24 IPv4 subnet, and <ipv6_prefix_bits>64</ipv6_prefix_bits> across a /64 IPv6
subnet. These elements can only be used together with <keyed_by_ip /> or
<keyed_by_forwarded_ip />.
-->
<keyed />Você também pode definir QUOTAs com base no hash normalizado da consulta, para que cada padrão de consulta distinto tenha seu próprio bucket de QUOTA independente. Na configuração XML, isso é escrito como <keyed_by_normalized_query_hash />:
<my_quota>
<keyed_by_normalized_query_hash />
<interval>
<duration>3600</duration>
<queries>100</queries>
</interval>
</my_quota>O mesmo pode ser expresso com a sintaxe DDL:
CREATE QUOTA my_quota KEYED BY normalized_query_hash FOR INTERVAL 1 hour MAX queries = 100 TO my_user;Neste exemplo, o usuário pode executar até 100 vezes por hora cada consulta normalizada distinta. SELECT number FROM numbers(1) e SELECT number FROM numbers(2) compartilham o mesmo bucket (porque têm a mesma forma normalizada), mas SELECT number, number FROM numbers(1) usa um bucket separado.
A QUOTA é atribuída aos usuários na seção 'users' da configuração. Consulte a seção "Direitos de acesso".
No processamento de consultas distribuídas, os valores acumulados são armazenados no servidor que faz a solicitação. Portanto, se o usuário acessar outro servidor, a QUOTA nele vai "recomeçar".
Quando o servidor é reiniciado, as QUOTAs são redefinidas.