У меня есть несколько таблиц в базе данных. Таблица с объектами с именем ObjectTbl и таблицей с типами с именем TypesTbl.Производительность запроса на сервере Sql
Thats выглядит следующим образом:
ObjectTbl TypesTbl
objId | TypeId | objName | typeId | typeName |
-------------------------------- ----------------------
intObjId | typeId | objName | intTypeId | typeName |
TypeId столбец в таблице ObjectTbl является внешним ключом от TypesTbl. TypesTbl содержит ~ 200 записей, ObjectTbl ~ +1000000
Когда я выполнить запрос:
SELECT * FROM ObjectTbl obj
join TypesTbl t ON t.typeName='Type_Name'
WHERE obj.TypeId=t.typeId and (obj.objName like '%expression%' or obj.objName like '%expression2%' or obj.objName like '%expression3%')
Это работает более 10 секунд. Но когда я использую:
declare @typeId int
set @typeId=(select typeId from TypesTbl where typeName='Type_Name')
SELECT * FROM ObjectTbl obj
WHERE [email protected] and (obj.objName like '%expression%' or obj.objName like '%expression2%' or obj.objName like '%expression3%')
Thats работает менее 1 секунды. Может ли кто-нибудь объяснить мне, почему так?
Ваши индексы? что скажет ваш запрос? Это даст вам хорошую подсказку. – paqogomez
Спасибо. В таблице ObjectTbl у меня есть некластеризованный индекс для столбцов objectId и TypeId. – Gleb
Но ничего в 'TypeTbl'? Посмотрите на свой план запроса, найдите места, где он говорит такие неприятные вещи, как «Сканирование таблицы», и разместите там индекс. – paqogomez