获取索引搜索的查询(而不是扫描)

时间:2009-07-31 08:19:13

标签: tsql sql-server-2000

运行以下查询(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上有唯一的复合索引 还有其他专栏 - 为了简洁而将它们留下来

2 个答案:

答案 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