Saltar al contenido principal

Comprobar la clave primaria

En algunos casos, los usuarios pueden observar que una consulta es más lenta de lo esperado, pese a creer que están ordenando o filtrando por una clave primaria. En este artículo mostramos cómo confirmar que la clave se está usando y destacamos los motivos más habituales por los que no ocurre.

Crear una tabla

Considere la siguiente tabla sencilla:
Observa que nuestra clave de ordenación incluye toUnixTimestamp(timestamp) como segundo elemento.

Cargar datos

Carga esta tabla con 100 millones de filas:

Filtrado básico

Si filtramos por código, podemos ver en el resultado el número de filas escaneadas: 49,15 mil. Observa que esto es un subconjunto del total de 100m filas.
Además, podemos confirmar que se usa el índice con la cláusula EXPLAIN indexes=1:
Observe cómo el número de gránulos analizados, 8012, es una fracción del total, 12209. La sección resaltada a continuación confirma el uso de la clave primaria code.
Los gránulos son la unidad de procesamiento de datos en ClickHouse, y cada uno suele contener 8192 filas. Para obtener más información sobre los gránulos y cómo se filtran, le recomendamos leer esta guía.
Filtrar por claves situadas más adelante en una clave de ordenación no será tan eficiente como filtrar por las que aparecen antes en la tupla. Para saber por qué, consulte aquí

Filtrado por varias claves

Supongamos que filtramos por code y timestamp:
En este caso, ambas claves de ordenación se utilizan para filtrar filas, por lo que solo es necesario leer 87 gránulos.

Uso de claves en la ordenación

ClickHouse también puede aprovechar las claves de ordenación para ordenar de forma eficiente. En concreto, Cuando la configuración optimize_read_in_order está habilitada (de forma predeterminada), el servidor de ClickHouse utiliza el índice de la tabla y lee los datos siguiendo el orden de la clave ORDER BY. Esto permite evitar leer todos los datos cuando se especifica un LIMIT. Por tanto, las consultas sobre grandes volúmenes de datos con LIMIT pequeños se procesan más rápido. Consulta aquí y aquí para obtener más información. Sin embargo, esto requiere que las claves utilizadas estén alineadas. Por ejemplo, considera esta consulta:
Podemos confirmar que la optimización no se ha aplicado aquí mediante EXPLAIN pipeline:
La línea MergeTreeSelect(pool: ReadPool, algorithm: Thread) aquí no indica que se esté usando la optimización, sino una lectura estándar. Esto se debe a que la clave de ordenación de nuestra tabla usa toUnixTimestamp(Timestamp), NO timestamp. Corregir esta discrepancia resuelve el problema:
Última modificación el 12 de junio de 2026