mysql top 1效率_TOP 1比不加TOP慢的疑惑

问题描述: 有一个查询如下,去掉 TOP 1 的时候,很快就出来结果了,但加上 TOP 1 的时候,一般要 2~3 秒才出数据,何解? SELECT TOP 1 ??? A . INVNO FROM A , B WHERE A . Item = B . ItemNumber ??? AND B . OwnerCompanyCode IS NOT NULL ? 问题原因分

问题描述:

有一个查询如下,去掉

TOP 1

的时候,很快就出来结果了,但加上

TOP 1

的时候,一般要

2~3

秒才出数据,何解?

SELECT

TOP

1

???

A.

INVNO

FROM

A,

B

WHERE

A.

Item =

B.

ItemNumber

???

AND

B.

OwnerCompanyCode IS

NOT

NULL

?

问题原因分析:

在使用

TOP 1

的时候,

SQL Server

会尽力先找出这条

TOP 1

的记录,这就导致它采用了与不加

TOP

时不一致的扫描算法,

SQL Server

查询优化器始终认为,应该可以比较快的找到匹配的第

1

条记录,所以一般是使用嵌套循环的联接,则不加

TOP 1

时,

SQL Server

会根据结构和数据的统计信息决策出联接策略。

嵌套循环一般适用于联系的两个表,一个表的数据较大,而另一个表的数据较小的情况

,如果查询匹配的值出现在扫描的前端,则在取

TOP 1

的情况下,是符合嵌套循环联系的使用条件的,但当匹配的数据出现在扫描的后端,或者是基本上没有匹配的数据时,则嵌套循环要扫描完成两个大表,这显然是不适宜的,也正是因为这种情况,导致了

TOP 1

比不加

TOP 1

的效率慢很多

?

关于此问题的模拟环境:

USE

tempdb

GO

?

SET

NOCOUNT

ON

--======================================

--

创建测试环境

--======================================

RAISERROR

(

'

创建测试环境

'

,

10,

1)

WITH

NOWAIT

-- Table A

CREATE

TABLE

[dbo].

A(

???

[TranNumber] [int] IDENTITY

(

1,

1)

NOT

NULL,

???

[INVNO] [char](

8)

NOT

NULL,

???

[ITEM] [char](

15)

NULL

DEFAULT

(

''

),

???

PRIMARY

KEY

(

[TranNumber])

)

?

CREATE

INDEX

[indexONinvno] ON

[dbo].

A(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值