Procedimientos recomendados para consultas de Lenguaje de consulta Kusto

Los siguientes son varios procedimientos recomendados que puede seguir para que las consultas se ejecuten con mayor rapidez.

En resumen

Acción Uso No use Notas
Reducir la cantidad de datos que se consultan Use mecanismos como el where operador para reducir la cantidad de datos que se procesan. Consulte a continuación para obtener formas eficaces de reducir la cantidad de datos que se procesan.
Evitar el uso de referencias calificadas redundantes Al hacer referencia a entidades locales, use el nombre no completo. Consulte a continuación para obtener más información sobre el tema.
datetime Columnas Use el tipo de datos datetime. No use el long tipo de datos. En las consultas, no use funciones de conversión de tiempo de Unix, como unixtime_milliseconds_todatetime(). En su lugar, use directivas de actualización para convertir la hora de Unix en el tipo de datos durante la datetime ingesta.
Operadores de cadena Use el operador has. No use contains. Al buscar tokens completos, has funciona mejor, ya que no busca subcadenas.
Operadores que distinguen mayúsculas de minúsculas Use == No use =~. Use los operadores que distinguen mayúsculas de minúsculas siempre que sea posible.
Use in No use in~.
Use contains_cs No use contains. Si puede usar has/has_cs en lugar de contains/contains_cs, es una mejor opción.
Búsqueda de texto Busque en una columna específica. No use *. * realiza una búsqueda de texto completo en todas las columnas.
Extracción de campos de objetos dinámicos en millones de filas Materialice la columna en el momento de la ingesta si la mayoría de las consultas extraen campos de objetos dinámicos en millones de filas. De este modo, solo pagará una vez para extraer las columnas.
Búsqueda de claves o valores raros en objetos dinámicos Use MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value" No use MyTable | where DynamicColumn.SomeKey == "Rare value". De esta manera, puede filtrar la mayoría de los registros y realizar el análisis de JSON solo del resto.
Instrucción let con un valor que se usa más de una vez Use la función materialize(). Para más información sobre cómo usar materialize(), consulte materialize(). Para obtener más información, consulte Optimización de consultas que usan expresiones con nombre.
Aplicación de conversiones en más de mil millones de registros Modifique la consulta para reducir la cantidad de datos que se introducen en la conversión. No convierta grandes cantidades de datos si puede evitarlo.
Nuevas consultas Use limit [small number] o count al final. La ejecución de consultas sin enlazar en conjuntos de datos desconocidos puede producir gb de resultados que se devolverán al cliente, lo que da lugar a una respuesta lenta y a un clúster ocupado.
Comparaciones que no distinguen mayúsculas de minúsculas Use Col =~ "lowercasestring" No use tolower(Col) == "lowercasestring".
Comparación de datos que ya están en minúsculas (o en mayúsculas) Col == "lowercasestring" (o Col == "UPPERCASESTRING") Evite el uso de comparaciones que no distinguen mayúsculas de minúsculas.
Filtrado de columnas Filtre una columna de tabla. No filtre las columnas calculadas.
Use T | where predicate(*Expression*) No use T | extend _value = *Expression* | where predicate(_value).
Operador summarize Use hint.shufflekey=<key> cuando el group by keys del operador summarize tenga una cardinalidad alta. Idealmente, una cardinalidad alta es superior a un millón.
Operador join Seleccione la tabla con menos filas para que sea la primera (la consulta del extremo izquierdo).
Use in en lugar de semi join izquierda para filtrar por una sola columna.
Unión entre clústeres En varios clústeres, ejecute la consulta del lado derecho de la combinación, donde se encuentran la mayoría de los datos.
Unión cuando el lado izquierdo es pequeño y el lado derecho es grande Use hint.strategy=broadcast. Small hace referencia a hasta 100 MB de datos.
Unión cuando el lado derecho es pequeño y el lado izquierdo es grande Usar el operador de búsqueda en lugar del join operador Si el lado derecho de la búsqueda es mayor que varias decenas de MB, se producirá un error en la consulta.
Unión cuando ambos lados son demasiado grandes Usar hint.shufflekey=<key> Se debe usar cuando la clave de combinación tiene una cardinalidad alta.
Extracción de valores en la columna con cadenas que comparten el mismo formato o patrón Use el operador parse. No use varias instrucciones extract(). Por ejemplo, los valores como "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ....".
Función extract() Se usa cuando las cadenas analizadas no tienen el mismo formato o patrón. Extraiga los valores necesarios mediante una expresión regular.
Función materialize() Inserte todos los operadores posibles que reducirán el conjunto de datos materializado y seguirán manteniendo la semántica de la consulta. Por ejemplo, los filtros o proyectar solo las columnas obligatorias. Para obtener más información, consulte Optimización de consultas que usan expresiones con nombre.
Uso de vistas materializadas Use vistas materializadas para almacenar agregaciones usadas habitualmente. Preferir el uso de la función para consultar solo elementos materialized_view() materializados materialized_view('MV')

Reducir la cantidad de datos que se están procesando

El rendimiento de una consulta depende directamente de la cantidad de datos que necesita procesar. Cuantos menos datos se procesen, más rápido será la consulta (y menos recursos que consume). Por lo tanto, el procedimiento recomendado más importante es estructurar la consulta de forma que reduzca la cantidad de datos que se procesan.

Nota

En la explicación siguiente, es importante tener en cuenta el concepto de selectividad de filtro. La selectividad es el porcentaje de los registros que se filtran al filtrar por algún predicado. Un predicado altamente selectivo significa que solo un puñado de registros permanece después de aplicar el predicado, lo que reduce la cantidad de datos que debe procesarse de forma eficaz.

En orden de importancia:

  • Solo las tablas de referencia cuyos datos son necesarios para la consulta. Por ejemplo, al usar el union operador con referencias de tabla comodín, es mejor desde un punto de vista de rendimiento hacer referencia solo a una serie de tablas, en lugar de usar un carácter comodín (*) para hacer referencia a todas las tablas y, a continuación, filtrar los datos mediante un predicado en el nombre de la tabla de origen.

  • Aproveche el ámbito de datos de una tabla si la consulta solo es relevante para un ámbito específico. La función table() proporciona una manera eficaz de eliminar los datos mediante el ámbito según la directiva de almacenamiento en caché (el parámetro DataScope ).

  • Aplique el operador de where consulta inmediatamente después de las referencias de tabla.

  • Al usar el where operador de consulta, un uso prudente del orden de los predicados (en un único operador o con una serie de operadores consecutivos, no importa cuál) puede tener un efecto significativo en el rendimiento de la consulta, como se explica a continuación.

  • Aplique primero los predicados de partición completa. Esto significa que los predicados que usan la función extent_id() se deben aplicar primero, al igual que los predicados que usan la función extent_tags() y los predicados que son muy selectivos sobre las particiones de datos de la tabla (si se definen).

  • A continuación, aplique predicados que actúan sobre datetime columnas de tabla. Kusto incluye un índice muy eficaz en estas columnas, lo que a menudo elimina las particiones de datos completas por completo sin necesidad de acceder a esas particiones.

  • A continuación, aplique predicados que actúan sobre string las columnas y dynamic , especialmente estos predicados que se aplican en el nivel de término. Los predicados deben ordenarse por la selectividad (por ejemplo, buscar un identificador de usuario cuando hay millones de usuarios es muy selectivo y normalmente es una búsqueda de términos para la que el índice es muy eficaz).

  • A continuación, aplique predicados que sean selectivos y se basen en columnas numéricas.

  • Por último, para las consultas que examinan los datos de una columna de tabla (por ejemplo, para predicados como "contiene "@!@!" que no tienen términos y no se benefician de la indexación), ordene los predicados de modo que los que examinan columnas con menos datos serán primero. Esto reduce la necesidad de descomprimir y examinar columnas grandes.

Evitar el uso de referencias calificadas redundantes

Se hace referencia a entidades como tablas y vistas materializadas por nombre. Por ejemplo, se puede hacer referencia a la tabla T como simplemente T (el nombre no completo ) o mediante un calificador de base de datos (por ejemplo database("DB").T , cuando la tabla está en una base de datos denominada DB) o mediante un nombre completo (por ejemplo cluster("X.Y.kusto.windows.net").database("DB").T, ).

Es un procedimiento recomendado evitar el uso de calificaciones de nombre cuando son redundantes, por los siguientes motivos:

  1. Los nombres no calificados son más fáciles de identificar (para un lector humano) como pertenecientes a la base de datos en el ámbito.

  2. La referencia a entidades de ámbito de base de datos siempre es al menos tan rápida y, en algunos casos, mucho más rápida, las entidades que pertenecen a otras bases de datos (especialmente cuando esas bases de datos están en un clúster diferente). Evitar nombres calificados ayuda al lector a hacer lo correcto.

Nota

Esto no significa que los nombres calificados son incorrectos para el rendimiento. De hecho, Kusto es capaz en la mayoría de los casos de identificar cuándo un nombre completo hace referencia a una entidad que pertenece a la base de datos en el ámbito y "cortocircuito" de la consulta para que no se considere una consulta entre clústeres. Sin embargo, se recomienda no confiar en esto cuando no sea necesario, por los motivos especificados anteriormente.