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
.