先看例子:
use
tempdb;
-- Numbers 方便插入数据
CREATE
TABLE dbo . Numbers ( n INT NOT NULL PRIMARY KEY )
GO
DECLARE
@i INT ;
SET
@i = 1 ;
INSERT
INTO dbo . Numbers ( n ) SELECT 1 ;
WHILE
@i < 1024000 BEGIN
INSERT INTO dbo.Numbers(n)
SELECT n + @i FROM dbo.Numbers;
SET @i = @i * 2;
END
;
GO
CREATE
TABLE dbo . Users ( MessageID INT NOT NULL PRIMARY KEY ,
SenderID
INT NOT NULL,
ReceiverID
INT NOT NULL,
FirstName
varchar(50),
LastName
varchar(50));
GO
INSERT
INTO dbo . Users ( MessageID ,
SenderID
,
ReceiverID
,
FirstName
,
LastName
)
SELECT
n , n % 1000 , n / 1000 , n % 1000 , n % 10
FROM dbo . Numbers ;
GO
-- 将其中一条记录的LastName改成WSW
UPDATE
dbo . Users SET LastName = 'WSW'
WHERE SenderID = 123 AND ReceiverID = 456;
GO
create
index idx_LastName on Users ( LastName
)
select LastName from Users
where LastName='WSW'
go
select
LastName from Users
where
LastName=N'WSW'
go
以上两句执行效率没有明显差别。
不过以下两句可就完全不同了:
select
* from Users
where
LastName='WSW'
go
select
* from Users
where
LastName=N'WSW'
请看执行计划:
通过执行计划可以看出使用'WSW'和N'WSW'的性能有天壤之别。
结论:
当数据库索引字段设计为VARCHAR时,传入VARCHAR字符常量,查询性能明显由于传入NVARCHAR字符常量。
所以,在查询条件中传入字符常量时,应该根据数据库设计的数据类型正确的传入unicode字符或者非unicode字符以取得最佳的数据库性能。