QueryRunner representan consultas que ejecuta el motor.
El motor puede usarse para la ejecución asíncrona de consultas, la ejecución en lote de consultas generadas,
el envío de consultas a clústeres remotos, benchmarks, fuzzing y pruebas con tráfico espejo.
Crear una tabla
query, database, settings.
La columna query es obligatoria y las demás columnas son opcionales.
Configuración del motor
Detalles
INSERT.
Las consultas se ejecutan en modo “fire and forget”: en caso de excepción, no hay reintentos
y los resultados de las consultas SELECT se descartan (la única forma de conservar los resultados es INSERT SELECT).
El resultado de cada consulta puede comprobarse en la tabla system.query_log, donde las consultas iniciadas por
este motor se marcan con is_internal = 1 en el servidor iniciador.
Las consultas en cola se mantienen en memoria y no sobreviven al reinicio del servidor. Al apagar el servidor
(o al hacer DROP/DETACH de la tabla), las consultas que aún no se hayan iniciado se descartan. De las
consultas que ya están en ejecución, las que se han enviado a un clúster se cancelan, mientras que se espera
a que finalicen las que se ejecutan localmente.
Cuando la consulta que se va a ejecutar es a su vez un INSERT, sus datos deben ir en línea: INSERT ... VALUES (...),
INSERT ... SELECT ... o INSERT ... FORMAT ... con los datos en el texto de la consulta. Un INSERT que
espera recibir los datos desde un stream independiente no es compatible.
Modo local y SQL SECURITY
cluster, las consultas se ejecutan en el servidor local.
El usuario con cuyos permisos se ejecutan lo determina la cláusula SQL SECURITY:
INVOKER(predeterminado): las consultas se ejecutan en nombre del usuario que realizó elINSERT.DEFINER: las consultas se ejecutan en nombre del usuarioDEFINERespecificado. Como las consultas insertadas son arbitrarias, concederINSERTen una tabla de este tipo delega todos los privilegios del definidor.NONE: las consultas se ejecutan con acceso total, sin usuario. Requiere el privilegioALLOW_SQL_SECURITY_NONEal crear la tabla.
Modo de clúster
cluster, las consultas se envían al clúster especificado.
El segmento de destino se selecciona mediante shard: un índice fijo de base 1 ('1' de forma predeterminada), 'random' para elegir un
segmento aleatorio para cada consulta, o 'all' para ejecutar cada consulta en todos los segmentos del clúster. La réplica dentro
del segmento se elige según la configuración load_balancing del servidor.
La columna database establece la base de datos predeterminada de la conexión con el servidor remoto. Como la
base de datos predeterminada se establece una vez por conexión, cada valor distinto de database usa su propio
pool de conexiones, que se crea en el primer uso y se reutiliza durante toda la vida útil de la tabla.
DEFINER y SQL SECURITY solo tienen efecto en el modo local, y combinarlos con la
configuración cluster es un error. En los servidores remotos, las consultas se autentican con las
credenciales de la configuración del clúster y se ejecutan como consultas iniciales normales: se registran en
system.query_log con is_initial_query = 1 y su propio query_id (no vinculado al INSERT que
las produjo). En el servidor iniciador, las consultas despachadas se registran en system.query_log
con is_internal = 1.
Como el motor descarta los resultados de las consultas, siempre ejecuta las consultas despachadas con
discard_query_data = 1, por lo que los datos de resultado de las consultas SELECT no se transfieren por la red
(esto sustituye cualquier valor de discard_query_data establecido en la columna settings).
Esperar a que finalicen las consultas
Ejemplo
SELECT recientes del registro de consultas: