获取索引查找(而不是扫描)的查询
运行以下查询 (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 上有唯一复合索引 还有其他列 - 为了简洁起见,将它们省略
Running the following query (SQL Server 2000) the execution plan shows that it used an index seek and Profiler shows it's doing 71 reads with a duration of 0.
select top 1 id from table where name = '0010000546163' order by id desc
Contrast that with the following with uses an index scan with 8500 reads and a duration of about a second.
declare @p varchar(20)
select @p = '0010000546163'
select top 1 id from table where name = @p order by id desc
Why is the execution plan different? Is there a way to change the second method to seek?
thanks
EDIT
Table looks like
CREATE TABLE [table] (
[Id] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (13) COLLATE Latin1_General_CI_AS NOT NULL)
Id is primary clustered key
There is a non-unique index on Name and a unique composite index on id/name
There are other columns - left them out for brevity
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果名称列是 NVARCHAR 那么你需要你的参数也是相同的类型。 然后它应该通过索引查找来获取它。
If the name column is NVARCHAR then u need your parameter to be also of the same type. It should then pick it up by index seek.
现在您已添加架构,请尝试此操作。 SQL Server 将长度差异视为不同的数据类型,并将转换
varchar(13)
列以匹配varchar(20)
变量如果不是,那么排序规则强制会怎样? 数据库或服务器与列不同吗?
如果没有,请在之前添加此内容并发布结果
Now you've added the schema, please try this. SQL Server treats length differences as different data types and will convert the
varchar(13)
column to match thevarchar(20)
variableIf not, what about collation coercien? Is the DB or server different to the column?
If not, add this before and post results