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

运行以下查询(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是主聚簇键名称上有非唯一索引,id / name上有唯一的复合索引还有其他列 - 为简洁起见而将其留出


现在你已经添加了模式,请试试这个。 SQL Server将长度差别视为不同的数据类型,并将转换varchar(13)列以匹配varchar(20)变量

declare @p varchar(13)

如果不是,那么整理优势呢? 数据库或服务器与列不同?

declare @p varchar(13) COLLATE Latin1_General_CI_AS NOT NULL

如果不是,请在结果前后加上

SET SHOWPLAN_TEXT ON
GO

如果名称列是NVARCHAR,那么你需要你的参数也是相同的类型。 它应该通过索引查找来提取它。

declare @p nvarchar(20)
select @p = N'0010000546163'
select top 1 id from table where name = @p order by id desc
链接地址: http://www.djcxy.com/p/7651.html

上一篇: Getting a query to index seek (rather than scan)

下一篇: Recieving audio stream with Gstreamer results in reason not negotiated error