У меня есть таблица с несколькими столбцами. Я ищу имя пользователя на основе имени или фамилии. Когда я запускаю запрос и проверяю план выполнения, я замечаю, что индекс не используется. Что мне нужно сделать, чтобы SQL Сервер использовал эти индексы?
Вот запрос:
DECLARE @fName nvarchar(50) = 'user'
,@lName nvarchar(50) = 'one';
SELECT userName
FROM Micro.MicroUser m
WHERE (m.firstName IN (@fName) OR @fName IS NULL)
OR (m.lastName in (@lName) or @lName IS NULL);
Это ИНДЕКСЫ, которые я создал.
CREATE NONCLUSTERED INDEX IX_MICROUSER_LNAME ON [Micro].[MicroUser]
(
firstName asc
) INCLUDE(userName);
go
CREATE NONCLUSTERED INDEX IX_MICROUSER_FNAME ON [Micro].[MicroUser]
(
lastName asc
) INCLUDE(userName);
go
![enter image description here](https://i.stack.imgur.com/RfH45.png)
Обновление
Мне удалось заставить его использовать индекс, но это все еще делает сканирование индекса вместо поиска. Кроме того, если я удалил «или имя_параметра равно нулю», он выполняет поиск.
CREATE NONCLUSTERED INDEX [ix_test_lname_fname] ON [Micro].[MicroUser]
(
[lastName] ASC,
[firstName] ASC
)
INCLUDE ( [userName])
Из-за нехватки времени я буду использовать операторы if для проверки на наличие нулевых значений и выполнения различных запросов. в зависимости от того, является ли имя или фамилия нулевым.
Обновлено 1/25/2020
Я все еще получаю сканирование индекса; Тем не менее, обходной путь производит поиск индекса вместо сканирования.
DECLARE @fName nvarchar(50) = NULL
,@lName nvarchar(50) = 'one';
If @lName IS NOT NULL AND @fName IS NOT NULL
BEGIN
SELECT userName
FROM Micro.MicroUser m
WHERE (m.lastName IN (@lName))
AND (M.firstName IN (@fName)) -- select * from Micro.MicroUser
END
ELSE IF @lName IS NOT NULL
BEGIN
SELECT userName
FROM Micro.MicroUser m
WHERE (m.lastName IN (@lName))
END
ELSE IF @fName IS NOT NULL
BEGIN
SELECT userName
FROM Micro.MicroUser m
WHERE (M.firstName IN (@fName))
END