QueryRunner representam consultas que o motor executa.
O motor pode ser usado para execução assíncrona de consultas, execução em lote de consultas geradas,
direcionamento de consultas para clusters remotos, benchmarks, fuzzing e testes com tráfego espelhado.
Criando uma tabela
query, database, settings.
A coluna query é obrigatória, e as demais colunas são opcionais.
Configurações do motor
Detalhes
INSERT.
As consultas são executadas no modo “fire and forget”: em caso de exceção, não há novas tentativas,
e os resultados das consultas SELECT são descartados (a única forma de preservar os resultados é INSERT SELECT).
O sucesso de cada consulta pode ser verificado na tabela system.query_log, onde as consultas iniciadas por
este motor são marcadas com is_internal = 1 no servidor iniciador.
As consultas enfileiradas são mantidas na memória e não sobrevivem à reinicialização do servidor. No desligamento do servidor
(ou em um DROP/DETACH da tabela), as consultas que ainda não tiverem sido iniciadas serão descartadas. Das
consultas que já estiverem em execução, aquelas enviadas para um cluster são canceladas, enquanto as que estiverem em execução
localmente são aguardadas até terminarem.
Quando uma consulta a ser executada é, ela própria, um INSERT, seus dados devem estar inline — INSERT ... VALUES (...),
INSERT ... SELECT ... ou INSERT ... FORMAT ... com os dados no texto da consulta. Um INSERT que
receba seus dados de um fluxo separado não tem suporte.
Modo local e SQL SECURITY
cluster, as consultas são executadas no servidor local.
O usuário com cujas permissões elas são executadas é determinado pela cláusula SQL SECURITY:
INVOKER(padrão): as consultas são executadas em nome do usuário que realizou oINSERT.DEFINER: as consultas são executadas em nome do usuárioDEFINERespecificado. Como as consultas inseridas são arbitrárias, concederINSERTem uma tabela desse tipo delega todos os privilégios do definidor.NONE: as consultas são executadas com acesso total, sem usuário. Requer o privilégioALLOW_SQL_SECURITY_NONEna criação da tabela.
Modo cluster
cluster é especificada, as consultas são enviadas ao cluster especificado.
O shard de destino é selecionado por shard: um índice fixo começando em 1 ('1' por padrão), 'random' para escolher um
shard aleatório para cada consulta, ou 'all' para executar cada consulta em todos os shards do cluster. A réplica dentro
do shard é escolhida de acordo com a configuração load_balancing do servidor.
A coluna database define o banco de dados padrão da conexão com o servidor remoto. Como o
banco de dados padrão é definido uma vez por conexão, cada valor distinto de database usa seu próprio
pool de conexões, que é criado no primeiro uso e reutilizado durante todo o ciclo de vida da tabela.
DEFINER e SQL SECURITY têm efeito apenas no modo local, e combiná-los com a configuração
cluster é um erro. Nos servidores remotos, as consultas são autenticadas com as
credenciais da configuração do cluster e executadas como consultas iniciais normais: elas são registradas em
system.query_log com is_initial_query = 1 e seu próprio query_id (não vinculado ao INSERT que
as produziu). No servidor iniciador, as consultas encaminhadas são registradas em system.query_log
com is_internal = 1.
Como o motor descarta os resultados das consultas, ela sempre executa as consultas encaminhadas com
discard_query_data = 1, portanto os dados de resultado de consultas SELECT não são transferidos pela rede
(isso substitui qualquer valor de discard_query_data definido na coluna settings).
Aguardando a conclusão das consultas
Exemplo
SELECT recentes do log de consultas: