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

发布于 2024-07-29 23:36:10 字数 688 浏览 3 评论 0原文

运行以下查询 (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

榆西 2024-08-05 23:36:12

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

declare @p nvarchar(20)
select @p = N'0010000546163'
select top 1 id from table where name = @p order by id desc

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.

declare @p nvarchar(20)
select @p = N'0010000546163'
select top 1 id from table where name = @p order by id desc
℡寂寞咖啡 2024-08-05 23:36:12

现在您已添加架构,请尝试此操作。 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

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 the varchar(20) variable

declare @p varchar(13)

If not, what about collation coercien? Is the DB or server different to the column?

declare @p varchar(13) COLLATE Latin1_General_CI_AS NOT NULL

If not, add this before and post results

SET SHOWPLAN_TEXT ON
GO
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文