¿Cómo puedo comprobar que la caché de consultas se está usando en mi consulta?
Consulte este ejemplo con clickhouse client y un servicio de ClickHouse Cloud.
cree una tabla query_cache_test
Uso del clickhouse client
clickhouse-cloud :) CREATE TABLE query_cache_test (name String, age UInt8) ENGINE =MergeTree ORDER BY name
CREATE TABLE query_cache_test
(
`name` String,
`age` UInt8
)
ENGINE = MergeTree
ORDER BY name
Query id: 81c54f09-7de4-48ec-916f-c7c304a46931
Ok.
0 rows in set. Elapsed: 0.343 sec.llena la tabla con algunos datos:
clickhouse-cloud :) INSERT INTO query_cache_test SELECT * FROM generateRandom('name String, age UInt8',1,1) LIMIT 100000;
INSERT INTO query_cache_test SELECT *
FROM generateRandom('name String, age UInt8', 1, 1)
LIMIT 100000
Query id: 90369105-bd67-494c-bdaf-d90dbfb6def9
Ok.
0 rows in set. Elapsed: 0.173 sec. Processed 327.05 thousand rows, 3.43 MB (1.89 million rows/s., 19.86 MB/s.)habilite los logs de traza:
clickhouse-cloud :) SET send_logs_level = 'trace'
SET send_logs_level = 'trace'
Query id: d65490b0-7960-4a85-a343-787e70e5e293
Ok.
0 rows in set. Elapsed: 0.134 sec.ejecute una consulta para usar la caché de consultas (añadiendo SETTINGS use_query_cache=true a la consulta):
clickhouse-cloud :) SELECT name FROM query_cache_test WHERE age > 1000 FORMAT Null SETTINGS use_query_cache=true;
SELECT name
FROM query_cache_test
WHERE age > 1000
FORMAT `Null`
SETTINGS use_query_cache = 1
Query id: 3754a7fd-b786-47c1-a258-dfbc75e35a04
[c-red-qc-36-server-0] 2023.05.29 12:06:10.542408 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \vuelve a ejecutar la misma consulta:
clickhouse-cloud :) SELECT name FROM query_cache_test WHERE age > 1000 FORMAT Null SETTINGS use_query_cache=true;
SELECT name
FROM query_cache_test
WHERE age > 1000
FORMAT `Null`
SETTINGS use_query_cache = 1
Query id: a047527c-9d55-4e6b-9747-0ccad8787515
[c-red-qc-36-server-0] 2023.05.29 12:06:17.931007 [ 454 ] {a047527c-9d55-4e6b-9747-0ccad8787515} \Observe ahora las diferencias entre los registros TRACE relacionados con QueryCache:
1.ª ejecución:
[c-red-qc-36-server-0] 2023.05.29 12:06:10.543559 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \<Trace\> QueryCache: No entry found for query SELECT name FROM query_cache_test WHERE age > 1000 FORMAT `Null` SETTINGS
[c-red-qc-36-server-0] 2023.05.29 12:06:10.547760 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \<Trace\> QueryCache: Stored result of query SELECT name FROM query_cache_test WHERE age > 1000 FORMAT `Null` SETTINGSen la segunda ejecución:
[c-red-qc-36-server-0] 2023.05.29 12:06:17.932043 [ 454 ] {a047527c-9d55-4e6b-9747-0ccad8787515} \<Trace\> QueryCache: Entry found for query SELECT name FROM query_cache_test WHERE age > 1000 FORMAT `Null` SETTINGSEn la 1.ª ejecución, claramente no se encontró ninguna entrada (No entry found for query SELECT...), así que ClickHouse almacenó (Stored result of query SELECT...) la entrada.
En la 2.ª ejecución, la consulta utilizó la caché de consultas, ya que encontró la entrada ya almacenada (Entry found for query SELECT...).
Solo con SQL
Simplemente ejecutando comandos SQL, sin inspeccionar los registros de nivel trace de clickhouse client,
también es posible validar si se está utilizando la caché de consultas comprobando las tablas system correspondientes:
clickhouse-cloud :) SELECT 1 SETTINGS use_query_cache=true;
SELECT 1
SETTINGS use_query_cache = 1
Query id: a5a078c7-61e5-4036-a6f0-4d602d5b72d2
┌En los resultados más recientes vemos 1 QueryCacheMisses correspondiente a la primera ejecución de la consulta SELECT 1 SETTINGS use_query_cache=true; y un evento QueryCacheHits asociado a la segunda ejecución de la consulta.
Tenga en cuenta también que el tamaño máximo predeterminado de una entrada de caché es de 1048576 bytes (= 1 MiB) y que, de forma predeterminada, los resultados se almacenan en caché solo durante 60 segundos (por ejemplo, puede usar query_cache_ttl=300 en SETTINGS para que el resultado de una consulta se almacene en caché durante 5 minutos).
Puede encontrar información más detallada sobre la caché de consultas de ClickHouse aquí