Почему я должен заставить порядок с этими запросами иерархии / - PullRequest
0 голосов
/ 03 мая 2018

Ниже приведен пример запроса, который я могу выполнить, где для каждой категории я хочу, чтобы NumberOfCourses представлял не только эту конкретную категорию, но и любые дочерние категории в ней. Я думаю, что запрос довольно понятен.

select  c.CategoryID, courses.MarketID, count(distinct courses.CourseID) NumberOfCourses
from    Category c
        join CategoryHierarchy tch on tch.HierarchyKey like '%~' + cast(c.CategoryID as varchar) + '~%'
        join vLiveEvents courses on tch.CategoryID = courses.CategoryID
where   courses.MarketID is not null
group by c.CategoryHumanID, courses.MarketID

Когда я запускаю это как есть, это может занять почти две минуты, однако, если я добавлю подсказку Option (Force Order), тогда это займет всего несколько секунд. Итак, мой вопрос: я делаю что-то не так, что приводит к тому, что SQL создает плохой план, или движок SQL на самом деле просто не хорош для оптимизации иерархических объединений, как это?

Я пытался включить план sql, но он слишком длинный, и ТАК не позволяет мне иметь столько символов. Я рад поделиться этим, хотя, если кто-нибудь может сказать мне, как это сделать.

РЕДАКТИРОВАТЬ: Я думаю, вероятно, не все знают, как работают эти виды иерархий. Ключ иерархии будет выглядеть примерно так: ~ 1234 ~ 5678 ~ 9123 ~, где 1234 является родителем 5678, который является родителем 9123. Путем сравнения идентификаторов CategoryID я могу включить в результаты все дочерние категории.

1 Ответ

0 голосов
/ 03 июня 2018

Начиная с SQL Server 2016+, была добавлена ​​функция хранилища запросов для мониторинга производительности. Он дает представление о выборе и производительности плана запросов.

Он также предоставляет возможность форсировать план.

Это не полная замена трассировки или расширенных событий, но по мере развития от версии к версии мы могли бы получить полнофункциональное хранилище запросов в будущих выпусках SQL Server. Основной поток Query Store

  1. Существующие компоненты SQL Server взаимодействуют с хранилищем запросов с помощью диспетчера хранилища запросов.
  2. Диспетчер хранилища запросов определяет, какое хранилище следует использовать, а затем передает выполнение этому хранилищу (статистика плана или времени выполнения или статистика ожидания запроса)
    • Plan Store - Сохранение информации о плане выполнения
    • Runtime Stats Store - Сохранение информации статистики выполнения
    • Query Wait Stats Store - Сохраняющаяся информация статистики ожидания.
  3. Планирование, хранилище статистики времени выполнения и ожидания использует хранилище запросов в качестве расширения SQL Server.

enter image description here

  1. Включение хранилища запросов : хранилище запросов работает на уровне базы данных на сервере.

    • По умолчанию хранилище запросов неактивно для новых баз данных.
    • Нельзя включить хранилище запросов для главной или tempdb базы данных.
    • Доступен DMV

      sys.database_query_store_options (Transact-SQL)

  2. Сбор информации в хранилище запросов : Мы собираем всю доступную информацию из трех хранилищ, используя Query Store DMV (представления управления данными).

    • Магазин Query Plan: Сохранение информации о плане выполнения, и она отвечает за сбор всей информации, связанной с компиляцией запроса.

      sys.query_store_query (Transact-SQL) sys.query_store_plan (Transact-SQL) sys.query_store_query_text (Transact-SQL)

    • Runtime Stats Store: Сохранение информации статистики выполнения, и это, вероятно, наиболее часто обновляемое хранилище. Эта статистика представляет данные выполнения запроса.

      sys.query_store_runtime_stats (Transact-SQL)

    • Статистика запросов Query Wait Store: Сохранение и получение информации о статистике ожидания.

      sys.query_store_wait_stats (Transact-SQL)

ПРИМЕЧАНИЕ: Хранилище статистики ожидания запросов доступно только в SQL Server 2017 +

...