Рекомендации по язык запросов Kusto запросам
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Ниже приведены некоторые рекомендации, которые позволят ускорить выполнение запроса.
Короче говоря
Действие | Использование | Не используйте | Примечания. |
---|---|---|---|
Уменьшение объема запрашиваемых данных | Используйте такие механизмы, как where оператор, чтобы уменьшить объем обрабатываемых данных. |
Дополнительные сведения о эффективных способах уменьшения объема обрабатываемых данных см. в разделе "Уменьшение объема обрабатываемых данных". | |
Избегайте использования избыточных квалифицированных ссылок | При ссылке на локальные сущности используйте некавалифицированное имя. | Дополнительные сведения см. в статье "Избегайте использования избыточных квалифицированных ссылок". | |
datetime Столбцы |
datetime Используйте тип данных. |
Не используйте long тип данных. |
В запросах не используйте функции преобразования времени Unix, например unixtime_milliseconds_todatetime() . Вместо этого используйте политики обновления для преобразования времени Unix в datetime тип данных во время приема. |
Строковые операторы | Использовать оператор has . |
Не используйте contains . |
При поиске полных токенов лучше использовать метод has , поскольку он не ищет подстроки. |
Операторы с учетом регистра | Используйте == . |
Не используйте =~ . |
При возможности используйте операторы с учетом регистра. |
Используйте in . |
Не используйте in~ . |
||
Используйте contains_cs . |
Не используйте contains . |
Использование has /has_cs предпочтительнее contains /contains_cs . |
|
Поиск текста | Просмотрите определенный столбец. | Не используйте * . |
* выполняет полнотекстовый поиск по всем столбцам. |
Извлечение полей из динамических объектов в миллионах строк | Материализуйте столбец во время приема, если большинство запросов приводят к извлечению полей из динамических объектов в миллионах строк. | С помощью этого метода вы платите только один раз за извлечение столбцов. | |
Поиск редких ключей и значений в динамических объектах | Используйте MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value" . |
Не используйте MyTable | where DynamicColumn.SomeKey == "Rare value" . |
С помощью этого метода вы фильтруете большинство записей и выполняете анализ JSON только в оставшейся части. |
Операторlet со значением, которое используется более одного раза |
Используйте функцию materialize(). | Дополнительные сведения об использовании функции materialize() см. здесь. Дополнительные сведения см. в статье "Оптимизация запросов", использующих именованные выражения. |
|
Применение преобразований типов к более чем одному миллиарду записей | Измените область запроса, чтобы уменьшить объем данных, поступающих в преобразование. | Не преобразовывайте большие объемы данных, если их можно опустить. | |
Новые запросы | Используйте limit [small number] или count в конце. |
Выполнение несвязанных запросов по неизвестным наборам данных может привести к возврату гигабайт результатов, что приводит к медленному отклику и занятой среде. | |
Cравнения с учетом регистра | Используйте Col =~ "lowercasestring" . |
Не используйте tolower(Col) == "lowercasestring" . |
|
Сравнение данных, которые уже находятся в нижнем регистре (или в верхнем регистре) | Col == "lowercasestring" (или Col == "UPPERCASESTRING" ). |
Старайтесь не использовать сравнения без учета регистра. | |
Фильтрация по столбцам | Фильтруйте по столбцу таблицы. | Не фильтруйте по вычисляемому столбцу. | |
Использование T | where predicate(*Expression*) |
Не используйте T | extend _value = *Expression* | where predicate(_value) . |
||
Оператор суммирование | Используйте подсказку.shufflekey =<key> , если group by keys оператор summarize имеет высокую кратность. |
Высокая кратность в идеале составляет более одного миллиона. | |
Оператор соединения | Выберите таблицу с наименьшими строками в качестве первой (слева в запросе). | ||
Используйте in вместо левого полуфинала join для фильтрации по одному столбцу. |
|||
Присоединение между кластерами | Запустите запрос справа от соединения в удаленных средах, таких как кластеры или центры событий, где находится большая часть данных. | ||
Присоединение, когда левая сторона небольшая и правая сторона большая | Используйте hint.strategy=broadcast. | Малый относится к 100 мегабайтам (МБ) данных. | |
Присоединение, когда правая сторона небольшая и левая сторона большая | Используйте оператор подстановки join вместо оператора |
Если справа от подстановки больше нескольких десятков МБ, запрос завершается ошибкой. | |
Присоединение, когда обе стороны слишком большие | Используйте hint.shufflekey=<key>. | Используется, когда ключ соединения имеет высокую кратность. | |
Извлечение значений в столбце, которые имеют общий формат или шаблон строк | Используйте оператор синтаксического анализа. | Не используйте несколько операторов extract() . |
Например, такие значения, как "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ...." . |
Функция extract() | Используйте, если проанализированные строки не принадлежат к одному и тому же формату или шаблону. | Извлеките необходимые значения с помощью регулярного выражения. | |
Функция materialize(). | Отправьте все возможные операторы, которые сокращают материализованный набор данных и по-прежнему сохраняют семантику запроса. | Например, фильтры или столбцы, которые нужны только для проекта. Дополнительные сведения см. в статье "Оптимизация запросов", использующих именованные выражения. | |
Использование материализованных представлений | Используйте материализованные представления для хранения часто используемых агрегатов. Предпочитайте использовать функцию только для запроса материализованной materialized_view() части. |
materialized_view('MV') |
Уменьшение объема обрабатываемых данных
Производительность запроса зависит непосредственно от объема данных, необходимых для обработки. Чем меньше данных обрабатывается, тем быстрее запрос (и меньше ресурсов, которые он потребляет). Поэтому наиболее важным рекомендуется структурировать запрос таким образом, чтобы уменьшить объем обрабатываемых данных.
Примечание.
В следующем обсуждении важно иметь в виду концепцию выбора фильтра. Выборка — это процент отфильтрованных записей при фильтрации по некоторым предикатам. Высокоизбирательный предикат означает, что только несколько записей остаются после применения предиката, уменьшая объем данных, которые необходимо затем обрабатывать эффективно.
В порядке важности:
Ссылки на таблицы, данные которых необходимы запросу. Например, при использовании
union
оператора со ссылками на подстановочные знаки лучше использовать только точку зрения производительности, чтобы ссылаться только на несколько таблиц, а не использовать подстановочный знак (*
) для ссылки на все таблицы, а затем отфильтровать данные с помощью предиката в имени исходной таблицы.Воспользуйтесь областью данных таблицы, если запрос относится только к определенной области. Функция table() обеспечивает эффективный способ устранения данных путем определения области в соответствии с политикой кэширования (параметр DataScope).
where
Примените оператор запроса сразу после ссылок на таблицу.При использовании
where
оператора запроса порядок размещения предикатов, независимо от того, используется ли одинwhere
оператор или несколько последовательныхwhere
операторов, может существенно повлиять на производительность запроса.Сначала примените предикаты целых сегментов. Это означает, что предикаты, использующие функцию extent_id() и функцию extent_tags() сначала следует применить. Кроме того, если у вас есть выборочные предикаты, сужающие данные до определенных секций, они должны применяться сначала.
Затем примените предикаты, которые действуют на
datetime
столбцах таблицы. Kusto включает эффективный индекс для таких столбцов, часто полностью устраняя целые сегменты данных, не требуя доступа к этим сегментам.Затем примените предикаты, которые действуют и
string
dynamic
столбцы, особенно такие предикаты, которые применяются на уровне термина. Упорядочение предикатов по избирательности. Например, поиск идентификатора пользователя при наличии миллионов пользователей является очень выборочным и обычно включает поиск терминов, для которых индекс очень эффективен.Затем примените предикаты, которые являются выборочными и основаны на числовых столбцах.
Наконец, для запросов, которые сканируют данные столбца таблицы (например, для предикатов, таких как
contains
"@!@!"
, которые не имеют терминов и не получают выгоду от индексирования), упорядочение предикатов таким образом, чтобы те, которые сканировали столбцы с меньшим количеством данных, сначала. Это снижает необходимость распаковки и сканирования больших столбцов.
Избегайте использования избыточных квалифицированных ссылок
Ссылки на такие сущности, как таблицы и материализованные представления по имени.
Например, на таблицу T
можно ссылаться как простое T
(нечетное имя) или с помощью квалификатора базы данных (например, database("DB").T
при вызове таблицы в базе данныхDB
) или с помощью полного имени (например, cluster("<serviceURL>").database("DB").T
).
Например, на таблицу T
можно ссылаться как простое T
(нечетное имя) или с помощью квалификатора базы данных (например, database("DB").T
при вызове таблицы в базе данныхDB
) или с помощью полного имени (например, cluster("X.Y.kusto.windows.net").database("DB").T
).
Рекомендуется избежать использования квалификации имен, если они избыточны, по следующим причинам:
Неквалифицированные имена проще определить (для читателя человека) как принадлежащие к базе данных в области.
Ссылки на сущности базы данных в области всегда всегда как можно быстрее и в некоторых случаях гораздо быстрее, а сущности, принадлежащие другим базам данных.
Это особенно верно, если эти базы данных находятся в другом кластере.
Это особенно верно, если эти базы данных находятся в другом хранилище событий.
Избегание квалифицированных имен помогает читателю делать правильные вещи.
Примечание.
Это не означает, что квалифицированные имена являются плохими для производительности. На самом деле, Kusto в большинстве случаев может определить, когда полное имя ссылается на сущность, принадлежащую к базе данных в области и "короткой цепи", чтобы он не считался запросом между кластерами. Тем не менее, мы не рекомендуем полагаться на это, если это не требуется.
Примечание.
Это не означает, что квалифицированные имена являются плохими для производительности. На самом деле, Kusto в большинстве случаев может определить, когда полное имя ссылается на сущность, принадлежащую к базе данных в области. Тем не менее, мы не рекомендуем полагаться на это, если это не требуется.