I have 3 nonclustered indexes on my SQL Server user
table, they are
FirstName
MiddleName
LastName
When I run this query
select *
from user
where FirstName like 'name' + '%'
or LastName like 'name' + '%'
or MiddleName like 'name' + '%'
The actual execution plan shows an index seek based on nonclustered index for limited number of rows.
But when I change the query to this:
declare @search varchar(30) = 'name'
select *
from user
where FirstName like @search + '%'
or LastName like @search + '%'
or MiddleName like @search + '%'
The actual execution plan performs an index scan on the whole table without taking nonclustered indexes into account.
The DDL is as below
CREATE TABLE [dbo].[user] (
[UserGuid] UNIQUEIDENTIFIER NOT NULL,
[CreateDate] DATETIME NOT NULL,
[LastModifiedDate] DATETIME NULL,
[Active] BIT NOT NULL,
[FirstName] VARCHAR (20) NULL,
[MiddleName] VARCHAR (100) NULL,
[LastName] VARCHAR (20) NULL,
[DateOfBirth] DATETIME NULL,
[Email] VARCHAR (255) NULL,
[HomePhone] VARCHAR (10) NULL,
[WorkPhone] VARCHAR (10) NULL
)
CREATE CLUSTERED INDEX [M_ACTIVE]
ON [dbo].[user]([Active] ASC, [LastName] ASC, [FirstName] ASC);
CREATE NONCLUSTERED INDEX [M_DateOfBirth]
ON [dbo].[user]([DateOfBirth] ASC, [LastName] ASC, [FirstName] ASC, [MiddleName] ASC);
CREATE NONCLUSTERED INDEX [M_FIRSTNAME]
ON [dbo].[user]([FirstName] ASC)
CREATE NONCLUSTERED INDEX [M_MIDDLENAME]
ON [dbo].[user]([MiddleName] ASC)
CREATE NONCLUSTERED INDEX [M_LASTNAME]
ON [dbo].[user]([LastName] ASC)