Рекомендации по запросамQuery best practices

Ниже приведены некоторые рекомендации, которые позволят ускорить выполнение запроса.Here are several best practices to follow to make your query run faster.

ДействиеAction НазначениеUse Не используйтеDon't use ПримечанияNotes
Фильтры времениTime filters Сначала используйте фильтры времени.Use time filters first. Kusto высоко оптимизирован для использования фильтров времени.Kusto is highly optimized to use time filters.
Строковые операторыString operators Используйте оператор has.Use the has operator Не используйте contains.Don't use contains При поиске полных токенов лучше использовать метод has, поскольку он не ищет подстроки.When looking for full tokens, has works better, since it doesn't look for substrings.
Операторы с учетом регистраCase-sensitive operators Используйте ==.Use == Не используйте =~.Don't use =~ При возможности используйте операторы с учетом регистра.Use case-sensitive operators when possible.
Используйте in.Use in Не используйте in~.Don't use in~
Используйте contains_cs.Use contains_cs Не используйте contains.Don't use contains Если вы можете использовать has/has_cs, а не contains/contains_cs, это даже лучше.If you can use has/has_cs and not use contains/contains_cs, that's even better.
Поиск текстаSearching text Поиск в определенном столбцеLook in a specific column Не используйте *.Don't use * * выполняет полнотекстовый поиск по всем столбцам.* does a full text search across all columns.
Извлечение полей из динамических объектов в миллионах строкExtract fields from dynamic objects across millions of rows Материализуйте столбец во время приема, если большинство запросов приводят к извлечению полей из динамических объектов в миллионах строк.Materialize your column at ingestion time if most of your queries extract fields from dynamic objects across millions of rows. Таким образом, вы будете платить лишь за одно извлечение данных из столбца.This way, you'll only pay once for column extraction.
Поиск редких ключей и значений в динамических объектахLookup for rare keys/values in dynamic objects Используйте MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value".Use MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value" Не используйте MyTable | where DynamicColumn.SomeKey == "Rare value".Don't use MyTable | where DynamicColumn.SomeKey == "Rare value" Таким образом, вы отфильтруете большинство записей и выполните синтаксический анализ JSON только для оставшихся записей.This way, you filter out most records, and do JSON parsing only of the rest.
Оператор let со значением, которое используется более одного разаlet statement with a value that you use more than once Используйте функцию materialize().Use the materialize() function Дополнительные сведения об использовании функции materialize()см. здесь.For more information on how to use materialize(), see materialize().
Применение преобразований к более чем 1 миллиарду записейApply conversions on more than 1 billion records Измените область запроса, чтобы уменьшить объем данных, поступающих в преобразование.Reshape your query to reduce the amount of data fed into the conversion. Не преобразовывайте большие объемы данных, если их можно опустить.Don't convert large amounts of data if it can be avoided.
Новые запросыNew queries Используйте limit [small number] или count в конце.Use limit [small number] or count at the end. Выполнение запросов без ограничений на неизвестном наборе данных может привести к тому, что клиенту будет возвращено несколько ГБ результатов, что приведет к замедлению ответов и перегрузке кластера.Running unbound queries over unknown data sets may yield GBs of results to be returned to the client, resulting in a slow response and a busy cluster.
Cравнения с учетом регистраCase-insensitive comparisons Используйте Col =~ "lowercasestring".Use Col =~ "lowercasestring" Не используйте tolower(Col) == "lowercasestring".Don't use tolower(Col) == "lowercasestring"
Сравнение данных, которые уже находятся в нижнем регистре (или в верхнем регистре)Compare data already in lowercase (or uppercase) Col == "lowercasestring" (или Col == "UPPERCASESTRING")Col == "lowercasestring" (or Col == "UPPERCASESTRING") Старайтесь не использовать сравнения без учета регистра.Avoid using case insensitive comparisons.
Фильтрация по столбцамFiltering on columns Фильтруйте по столбцу таблицы.Filter on a table column. Не фильтруйте по вычисляемому столбцу.Don't filter on a calculated column.
Используйте T | where predicate(<expression>).Use T | where predicate(<expression>) Не используйте T | extend _value = <expression> | where predicate(_value).Don't use T | extend _value = <expression> | where predicate(_value)
Оператор summarizesummarize operator Используйте hint.strategy=shuffle, если group by keys оператора суммирования имеет высокую кратность.Use the hint.strategy=shuffle when the group by keys of the summarize operator are with high cardinality. Высокая кратность в идеале превышает 1 миллион.High cardinality is ideally above 1 million.
Оператор joinjoin operator Выберите первой таблицу с меньшим количеством строк (самая левая в запросе).Select the table with the fewer rows to be the first one (left-most in query).
Соединение между кластерамиJoin across clusters Во всех кластерах выполните запрос на "правой" стороне соединения, где находится большинство данных.Across clusters, run the query on the "right" side of the join, where most of the data is located.
Соединение, если левая часть маленькая, а правая большаяJoin when left side is small and right side is large Используйте hint.strategy=broadcast.Use hint.strategy=broadcast Небольшим считается значение до 100 000 записей.Small refers to up to 100,000 records.
Соединение, если обе стороны слишком большиеJoin when both sides are too large Используйте hint.strategy=shuffle.Use hint.strategy=shuffle Используется, когда ключ соединения имеет высокую кратность.Use when the join key has high cardinality.
Извлечение значений в столбце, которые имеют общий формат или шаблон строкExtract values on column with strings sharing the same format or pattern Используйте оператор parse.Use the parse operator Не используйте несколько операторов extract().Don't use several extract() statements. Например, значения вроде "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ...."For example, values like "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ...."
Функция extract()extract() function Используйте, если проанализированные строки не принадлежат к одному и тому же формату или шаблону.Use when parsed strings don't all follow the same format or pattern. Извлеките необходимые значения с помощью регулярного выражения.Extract the required values by using a REGEX.
Функция materialize() .materialize() function Принудительно отправьте все возможные операторы, которые уменьшат набор материализованных данных и сохранят при этом семантику запроса.Push all possible operators that will reduce the materialized data set and still keep the semantics of the query. Например, фильтры или столбцы, которые нужны только для проекта.For example, filters, or project only required columns.