clickhouse 21. 7. 3. 14-2 (X) optimización de consultas
Cuando hay muchas más columnas de consulta que de filtro, el uso de la rueda previa puede mejorar diez veces el rendimiento de la consulta, y la rueda previa optimizará automáticamente el método de lectura de datos y reducirá las operaciones de IO durante la etapa de filtrado.
En algunos casos, la declaración prewhere puede procesar menos datos y funcionar mejor que la declaración donde.
De forma predeterminada, ciertamente no desactivamos la optimización automática a la optimización previa, pero incluso si la optimización está activada en algunos casos, no cambiará automáticamente a la optimización previa, por lo que debe especificar hágalo manualmente Preoptimización:
El rendimiento del análisis de datos se puede mejorar enormemente mediante operaciones de muestreo.
El modificador de muestreo solo es válido en las tablas del motor MergeTree y la estrategia de muestreo debe especificarse al crear la tabla.
Cuando la cantidad de datos es demasiado grande, se debe evitar la operación de selección *. El rendimiento de la consulta estará relacionado linealmente con el tamaño y la cantidad de campos de la consulta. Cuantos menos campos se cambien, menos recursos de E/S se consumirán y mayor será el rendimiento.
La poda de particiones consiste en leer solo las particiones requeridas y especificarlas en las condiciones del filtro.
Cuando se utilizan más de 10 millones de conjuntos de datos para consultas ordenadas, es necesario utilizarlos con condiciones Where y declaraciones de límite.
No cree columnas virtuales en el conjunto de resultados si no es necesario. Las columnas virtuales consumen muchos recursos y desperdician rendimiento. Podría considerar manejarlos en el front-end o construir campos reales en la tabla para aumentar el espacio de almacenamiento.
El rendimiento se puede mejorar más de 10 veces. La capa inferior de uniqCombined se implementa utilizando el algoritmo HyperLogLog, que puede aceptar un error de datos de aproximadamente 2, por lo que este método se puede utilizar directamente para mejorar la consulta. actuación. count(distinct) utiliza uniqExact para eliminar duplicados con precisión.
No se recomienda realizar diferentes consultas repetidas en decenas de millones de datos diferentes, sino aproximarse a uniqCombine.
Para evitar problemas de avalancha de servicio causados por consultas lentas individuales, además de establecer un tiempo de espera para una sola consulta, también puede configurar un disyuntor periódico. En un ciclo de consulta, si un usuario realiza con frecuencia consultas lentas que superan el umbral especificado, no podrá continuar con la operación de consulta.
El intercambio de datos entre la memoria física y la memoria virtual reducirá la velocidad de consulta y la memoria virtual se desactivará si los recursos lo permiten.
Agregar configuración join_use_Nulls para cada cuenta. Si el registro de la tabla de la izquierda no existe en la tabla de la derecha, el campo correspondiente en la tabla de la derecha devolverá el valor predeterminado del tipo de datos correspondiente del campo, en lugar del valor nulo en SQL estándar.
Al escribir datos en lotes, debe controlar el número de particiones involucradas en cada lote de datos. Es mejor ordenar los datos que se importarán antes de escribir. Los datos desordenados o que involucran demasiadas particiones harán que ClickHouse no pueda fusionar los datos recién importados a tiempo, lo que afectará el rendimiento de la consulta.
Generalmente, la CPU fluctuará alrededor de 50. Cuando llegue a 70, se producirá una amplia gama de tiempos de espera de consultas. La CPU es el indicador más crítico y se le debe prestar mucha atención.
La asociación de tablas múltiples de Clickhouse agregará datos de todas las tablas a la memoria y luego comparará cada tabla con los datos en la memoria. Una vez que la cantidad de datos en la tabla de la izquierda es demasiado grande, fácilmente provocará una memoria insuficiente.
Al realizar una consulta conjunta de varias tablas, cuando los datos consultados solo provienen de una de las tablas, puede considerar usar join en su lugar.
Al conectar varias mesas, se debe respetar el principio de que la mesa pequeña está a la derecha. Cuando se relaciona la tabla de la derecha, se carga en la memoria y se compara con la tabla de la izquierda.
En ClickHouse, ya sea una combinación izquierda, una combinación derecha o una combinación interna, cada registro de la tabla derecha siempre se lleva a la tabla izquierda para averiguar si el registro existe, por lo que la tabla derecha debe ser una tabla pequeña.
ClickHouse no iniciará activamente la operación de inserción de predicados al unirse a la consulta. Cada subconsulta debe completar la operación de filtrado por adelantado. Cabe señalar que si se realiza la inserción de predicados tiene un gran impacto en el rendimiento (este problema ya no existe en la nueva versión, pero cabe señalar que todavía existen diferencias de rendimiento con diferentes posiciones de predicados).
IN y JOIN en las dos tablas distribuidas deben ir precedidos de la palabra clave GLOBAL. La tabla correcta solo se consultará una vez en el nodo que recibe la solicitud de consulta y se distribuirá a otros nodos. Si no se agrega la palabra clave GLOBAL, cada nodo de la tabla distribuida de la izquierda iniciará de forma independiente una consulta a la tabla de la derecha, y la tabla de la derecha es una tabla distribuida. Esto hará que la tabla de la derecha sea n? veces (n es el número de fragmentos de la tabla distribuida), esto es una amplificación de consultas, lo que generará una gran sobrecarga.
Cree algunas empresas que requieran análisis de correlación en la tabla del diccionario para las operaciones de unión. La premisa es que la tabla del diccionario no puede ser demasiado grande, porque la tabla del diccionario será la dirección oficial del residente en la memoria.
Al agregar filtrado lógico, se puede reducir el escaneo de datos, aumentando así la velocidad de ejecución y reduciendo el consumo de memoria.