运行以下查询(SQL Server 2000),执行计划显示它使用了索引查找,而Profiler显示它正在执行71次读取,持续时间为0.
select top 1 id from table where name = '0010000546163' order by id desc
与以下内容对比使用带有8500次读取的索引扫描和大约一秒的持续时间。
declare @p varchar(20)
select @p = '0010000546163'
select top 1 id from table where name = @p order by id desc
为什么执行计划有所不同?有没有办法改变第二种寻找方法?
感谢
修改
表格如
CREATE TABLE [table] (
[Id] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (13) COLLATE Latin1_General_CI_AS NOT NULL)
Id是主群集密钥 Name上有一个非唯一索引,id / name上有唯一的复合索引 还有其他专栏 - 为了简洁而将它们留下来
答案 0 :(得分:3)
现在您已添加架构,请尝试此操作。 SQL Server将长度差异视为不同的数据类型,并将varchar(13)
列转换为与varchar(20)
变量匹配
declare @p varchar(13)
如果没有,整理coercien怎么样? DB或服务器与列不同吗?
declare @p varchar(13) COLLATE Latin1_General_CI_AS NOT NULL
如果没有,请在结果前后添加
SET SHOWPLAN_TEXT ON
GO
答案 1 :(得分:0)
如果name列是NVARCHAR,那么你需要你的参数也是同一类型。然后它应该通过索引搜索来获取它。
declare @p nvarchar(20)
select @p = N'0010000546163'
select top 1 id from table where name = @p order by id desc