Procedimientos recomendados para consultas de Lenguaje de consulta Kusto
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Los siguientes son varios procedimientos recomendados que puede seguir para que las consultas se ejecuten con mayor rapidez.
En resumen
Action | Usar | 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 están procesando. |
Para obtener más información sobre formas eficaces de reducir la cantidad de datos que se procesan, consulte Reducción de la cantidad de datos que se están procesando. | |
Evitar el uso de referencias con redundancia | Al hacer referencia a entidades locales, use el nombre no completo. | Para obtener más información, vea Evitar el uso de referencias completas redundantes. | |
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 | Usar 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 . |
Se prefiere usar has /has_cs para contains /contains_cs . |
|
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. | Con este método solo se paga una vez por la extracción de 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" . |
Con este método se filtran la mayoría de los registros y solo se realiza el análisis de JSON en el 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. |
|
Aplicar conversiones de tipos 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 una devolución de gigabytes de resultados, lo que da lugar a una respuesta lenta y a un entorno 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 summarize del operador tenga una cardinalidad alta. |
La cardinalidad alta es idealmente más de un millón. | |
operador join | Seleccione la tabla con las filas más pocas como la primera (de la izquierda en la consulta). | ||
Use in en lugar de semi join izquierda para filtrar por una sola columna. |
|||
Unión entre clústeres | Ejecute la consulta en el lado derecho de la unión entre entornos remotos, como clústeres o Eventhouses, donde se encuentra la mayoría de los datos. | ||
Unirse cuando el lado izquierdo es pequeño y el lado derecho es grande | Use hint.strategy=broadcast. | Small hace referencia a hasta 100 megabytes (MB) de datos. | |
Unirse 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 produce un error en la consulta. | |
Unirse cuando ambos lados son demasiado grandes | Use 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, 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 reduzcan el conjunto de datos materializado y sigan 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. Prefiere usar la materialized_view() función para consultar solo la parte materializada. |
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ápida es la consulta (y menos recursos se consumen). Por lo tanto, el procedimiento recomendado más importante es estructurar la consulta de tal manera que reduzca la cantidad de datos que se procesan.
Nota:
En la siguiente discusión, es importante tener en cuenta el concepto de selectividad de filtro. La selectividad es el porcentaje de registros que se filtran al filtrar por algún predicado. Un predicado altamente selectivo significa que solo una serie de registros permanecen después de aplicar el predicado, lo que reduce la cantidad de datos que se deben procesar de forma eficaz.
En orden de importancia:
Haga referencia solo a tablas cuyos datos necesita la consulta. Por ejemplo, al usar el
union
operador con referencias de tabla comodín, es mejor que un punto de vista de rendimiento solo haga referencia 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
where
operador de consulta inmediatamente después de las referencias de tabla.Cuando se usa el
where
operador de consulta, el orden en el que coloca los predicados, tanto si usa un solowhere
operador como varios operadores consecutivoswhere
, puede tener un efecto significativo en el rendimiento de la consulta.Aplique primero los predicados de particiones completas. Esto significa que los predicados que usan la función extent_id() y la función extent_tags() deben aplicarse primero. Además, cuando tenga predicados selectivos que restrinjan los datos a particiones específicas, se deben aplicar primero.
A continuación, aplique predicados que actúen sobre
datetime
columnas de tabla. Kusto incluye un índice eficaz en estas columnas, a menudo eliminando completamente las particiones de datos completas sin necesidad de acceder a esas particiones.A continuación, aplique predicados que actúen sobre
string
ydynamic
columnas, especialmente estos predicados que se aplican en el nivel de término. Ordene los predicados por la selectividad. Por ejemplo, la búsqueda de un identificador de usuario cuando hay millones de usuarios es altamente selectiva y normalmente implica 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
contains
"@!@!"
, que no tienen términos y no se benefician de la indexación), ordenen los predicados de forma que los que examinan columnas con menos datos son primero. Al hacerlo, se reduce la necesidad de descomprimir y examinar columnas grandes.
Evitar el uso de referencias con redundancia
Haga referencia a entidades como tablas y vistas materializadas por nombre.
Por ejemplo, se puede hacer referencia a la tabla como simplemente (el nombre no calificado) o mediante un calificador de base de datos (por ejemplo, database("DB").T
cuando la tabla T
se encuentra en una base de datos denominada DB
), o mediante un nombre completo (por ejemplo, cluster("<serviceURL>").database("DB").T
).T
Por ejemplo, se puede hacer referencia a la tabla como simplemente (el nombre no calificado) o mediante un calificador de base de datos (por ejemplo, database("DB").T
cuando la tabla T
se encuentra en una base de datos denominada DB
), o mediante un nombre completo (por ejemplo, cluster("X.Y.kusto.windows.net").database("DB").T
).T
Es un procedimiento recomendado evitar el uso de calificaciones de nombre cuando son redundantes, por los siguientes motivos:
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.
Hacer referencia a las entidades de ámbito de base de datos siempre es tan rápido como mínimo y, en algunos casos, mucho más rápido, las entidades que pertenecen a otras bases de datos.
Esto es especialmente cierto cuando esas bases de datos están en un clúster diferente.
Esto es especialmente cierto cuando esas bases de datos están en un centro de eventos diferente.
Evitar nombres calificados ayuda al lector a hacer lo correcto.
Nota:
Esto no significa que los nombres calificados sean 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 al ámbito de la base de datos y "cortocircuito" de la consulta para que no se considere como una consulta entre clústeres. Sin embargo, no se recomienda confiar en esto cuando no sea necesario.
Nota:
Esto no significa que los nombres calificados sean incorrectos para el rendimiento. De hecho, Kusto puede identificar en la mayoría de los casos cuando un nombre completo hace referencia a una entidad que pertenece al ámbito de la base de datos. Sin embargo, no se recomienda confiar en esto cuando no sea necesario.