Sql server Sql Server 2012未使用索引
我有一个有几列的表。我正在根据名字或姓氏搜索用户名。当我运行查询并检查执行计划时,我注意到索引没有被使用。SQL Server使用这些索引需要做什么 以下是查询:Sql server Sql Server 2012未使用索引,sql-server,indexing,sqlperformance,non-clustered-index,Sql Server,Indexing,Sqlperformance,Non Clustered Index,我有一个有几列的表。我正在根据名字或姓氏搜索用户名。当我运行查询并检查执行计划时,我注意到索引没有被使用。SQL Server使用这些索引需要做什么 以下是查询: 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 (
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
更新
我能够让它使用索引,但它仍然在进行索引扫描,而不是搜索。此外,如果我删除了“or parameterName is null”,它将进行查找
CREATE NONCLUSTERED INDEX [ix_test_lname_fname] ON [Micro].[MicroUser]
(
[lastName] ASC,
[firstName] ASC
)
INCLUDE ( [userName])
由于时间限制,我将使用if语句检查null值,并根据firstname或lastname是否为null运行不同的查询
于2020年1月25日更新
我仍在进行索引扫描;但是,解决方法是生成索引查找而不是扫描
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
选中此项:如果添加
选项(重新编译)
,它是否使用索引?我运行了DBCC FREEPROCCACHE以查看它是否会使用索引,但它没有。