Необходимость создания на самом деле определяет сам обработчик, мы лишь пользуемся аналитической информацией. При определении необходимости так же учитывается наличие блокировки. В данном примере это CXPAKET
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
SELECT dm_ws.wait_duration_ms, dm_ws.wait_type, dm_es.status, dm_t.TEXT, dm_qp.query_plan, dm_ws.session_ID, dm_es.cpu_time, dm_es.memory_usage, dm_es.logical_reads, dm_es.total_elapsed_time, dm_es.program_name, dm_ws.blocking_session_id, dm_r.wait_resource, dm_es.login_name, dm_r.command, dm_r.last_wait_type FROM sys.dm_os_waiting_tasks dm_ws INNER JOIN sys.dm_exec_requests dm_r ON dm_ws.session_id = dm_r.session_id INNER JOIN sys.dm_exec_sessions dm_es ON dm_es.session_id = dm_r.session_id OUTER APPLY sys.dm_exec_sql_text (dm_r.sql_handle) dm_t OUTER APPLY sys.dm_exec_query_plan (dm_r.plan_handle) dm_qp WHERE dm_es.is_user_process = 1 GO |
Результат выполнения
При просмотре плана запроса, обработчик предложит информацию об отсутствующих индексах. В данном примере видно, что происходит вставка во временную таблицу и добавлять указанный индекс нет ни какой причины. Но бываю ситуации, когда запрос указывает на реальные проблемы и после добавления индекса скорость выполнения значительно уменьшается
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Отсутствуют сведения об индексе из ExecutionPlan.sqlplan Обработчик запросов считает, что реализация следующего индекса может сократить стоимость запроса на 96.6746%. */ /* USE [DATABASE] GO CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] ON [dbo].[_AccumRgTn5561] ([_Fld5549RRef],[_Period]) INCLUDE ([_Fld5550RRef],[_Fld5551_TYPE],[_Fld5551_RTRef],[_Fld5551_RRRef],[_Fld5552RRef],[_Fld5553_TYPE],[_Fld5553_RTRef],[_Fld5553_RRRef],[_Fld5554RRef],[_Fld5555RRef],[_Fld13550RRef],[_Fld5556],[_Fld5557]) GO */ Дополнительная информация <a href="https://infostart.ru/public/128175/">тут</a> |