Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server 2012未使用索引_Sql Server_Indexing_Sqlperformance_Non Clustered Index - Fatal编程技术网

Sql server Sql Server 2012未使用索引

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 (

我有一个有几列的表。我正在根据名字或姓氏搜索用户名。当我运行查询并检查执行计划时,我注意到索引没有被使用。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 (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以查看它是否会使用索引,但它没有。