Создание индексов для оптимизации выполнения Stored Prcocedures - PullRequest
1 голос
/ 13 июля 2010

Предложение WHERE одного из моих запросов выглядит так:

and tbl0.Type = 'Alert' 
AND (tbl0.AccessRights like '%'+TblCUG0.userGroup+'%' 
     or tbl0.AccessRights like 'All' )
AND (tbl0.ExpiryDate > CONVERT(varchar(8), GETDATE(), 1)  
     or tbl0.ExpiryDate is null)
order by tbl0.Priority,tbl0.PublishedDate desc, tbl0.Title asc

Я хотел бы знать, по каким столбцам можно создавать индексы и какой тип индекса лучше всего подойдет. Также я слышал, что индексы не работают с картами Like и Wild на старте. Так какой должен быть подход к оптимизации запросов.

Ответы [ 2 ]

3 голосов
/ 13 июля 2010
1    and tbl0.Type = 'Alert' 
2    AND (tbl0.AccessRights like '%'+TblCUG0.userGroup+'%' 
3         or tbl0.AccessRights like 'All' )
4    AND (tbl0.ExpiryDate > CONVERT(varchar(8), GETDATE(), 1)  
5         or tbl0.ExpiryDate is null)

Скорее всего, вы не сможете использовать индекс с таким предложением WHERE.

Строка 1 . Вы можете создать индекс для tbl0.Type, но если у вас много строк и мало фактических значений, SQL Server все равно пропустит сканирование индекса и таблицы. Кроме того, не имея ничего общего с проблемой индекса, столбец, подобный этому, значение кода / флага лучше в виде фиксированной ширины значения char (1), крошечного int и т. Д., Где «A» = alert или 1 = alert. Я бы назвал столбец XyzType, где Xyz - это то, что описывает тип (DoctorType, CarType и т. Д.). Я хотел бы создать новую таблицу XyzTye, с FK вернуться к этому столбцу в tb10. эта новая таблица будет иметь два столбца XyzType PK и XyzDescription, где вы расширяете имя.

Строка 2 , вы объединяете несколько значений в tbl0.AccessRights? и пытаясь использовать LIKE, чтобы найти значения в нем? если это так, разделите это на другую таблицу, а затем вы можете удалить подобное и, возможно, добавить туда индекс.

Строка 3 , OR убивает использование индекса. Представьте себе, что вы просматриваете в телефонной книге все имена «Смит» или начинаете с «G», вы не можете просто использовать индекс. Вы можете попытаться разделить запрос на UNION или UNION ALL вокруг ИЛИ, чтобы можно было использовать индекс (одна часть ищет «Смит», а другая - «G»). Вы не предоставили достаточно запроса, чтобы определить, возможно ли это в вашем случае. Вам часто нужно использовать производную таблицу, которая содержит этот UNION, чтобы вы могли присоединить его к остальной части вашего запроса.

Строка 4 , tbl0.ExpiryDate может извлечь выгоду из индекса, но or прекратит его использование, см. Комментарий в строке 3.

Строка 5 , вы можете попробовать OR трюк объединения, рассмотренный выше, или просто не использовать NULL, введите значение по умолчанию, например '01 / 01/3000 ', так что вам не нужно OR.

2 голосов
/ 13 июля 2010

Помощник по настройке базы данных SQL Server может подсказать, какие индексы оптимизируют ваш запрос, включая покрывающие индексы, которые оптимизируют выбранные столбцы, которые вы не включили в свой запрос. То, что вы добавляете индекс, не означает, что оптимизатор запросов будет его использовать. Некоторые индексы могут стоить дороже, чем другие, поэтому оптимизатор выберет индексы bext, используя статистику базовых таблиц. Вы можете без труда добавить все столбцы порядка и критериев в индекс, но это будет бесполезно, если, например, слишком мало различных значений Приоритета, чтобы оно стоило хранилища.

Вы правы насчет НРАВИТСЯ и групповых символов. Индекс - это btree, что означает, что он может ускорить быстрый поиск определенных значений или запросов диапазона. Подстановочный знак в начале означает, что запрос должен коснуться всех записей, чтобы проверить, соответствуют ли они шаблону. Подстановочный знак в конце означает, что запрос будет касаться только тех элементов, которые начинаются с подстроки, до подстановочного знака, частично превращая его в запрос диапазона, который может получить выгоду от индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...