Sql Server 2012 не использует индекс - PullRequest
0 голосов
/ 25 января 2020

У меня есть таблица с несколькими столбцами. Я ищу имя пользователя на основе имени или фамилии. Когда я запускаю запрос и проверяю план выполнения, я замечаю, что индекс не используется. Что мне нужно сделать, чтобы 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

Обновление

Мне удалось заставить его использовать индекс, но это все еще делает сканирование индекса вместо поиска. Кроме того, если я удалил «или имя_параметра равно нулю», он выполняет поиск.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...