亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

TOP 1比不加TOP慢的疑惑

系統(tǒng) 2004 0

問題描述:

有一個查詢?nèi)缦拢サ? TOP 1 的時候,很快就出來結(jié)果了,但加上 TOP 1 的時候,一般要 2~3 秒才出數(shù)據(jù),何解?

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 的記錄,這就導(dǎo)致它采用了與不加 TOP 時不一致的掃描算法, SQL Server 查詢優(yōu)化器始終認(rèn)為,應(yīng)該可以比較快的找到匹配的第 1 條記錄,所以一般是使用嵌套循環(huán)的聯(lián)接,則不加 TOP 1 時, SQL Server 會根據(jù)結(jié)構(gòu)和數(shù)據(jù)的統(tǒng)計(jì)信息決策出聯(lián)接策略。 嵌套循環(huán)一般適用于聯(lián)系的兩個表,一個表的數(shù)據(jù)較大,而另一個表的數(shù)據(jù)較小的情況 ,如果查詢匹配的值出現(xiàn)在掃描的前端,則在取 TOP 1 的情況下,是符合嵌套循環(huán)聯(lián)系的使用條件的,但當(dāng)匹配的數(shù)據(jù)出現(xiàn)在掃描的后端,或者是基本上沒有匹配的數(shù)據(jù)時,則嵌套循環(huán)要掃描完成兩個大表,這顯然是不適宜的,也正是因?yàn)檫@種情況,導(dǎo)致了 TOP 1 比不加 TOP 1 的效率慢很多

關(guān)于此問題的模擬環(huán)境:

USE tempdb

GO

SET NOCOUNT ON

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

-- 創(chuàng)建測試環(huán)境

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

RAISERROR ( ' 創(chuàng)建測試環(huán)境 ' , 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 ( [INVNO] )

CREATE INDEX [indexOnitem] ON [dbo] . A ( [ITEM] )

CREATE INDEX [indexONiteminnvo] ON [dbo] . A ( [INVNO] , [ITEM] )

GO

-- Table B

CREATE TABLE [dbo] . B (

[ItemNumber] [char] ( 15 ) NOT NULL DEFAULT ( '' ),

[CompanyCode] [char] ( 4 ) NOT NULL,

[OwnerCompanyCode] [char] ( 4 ) NULL,

PRIMARY KEY ( [ItemNumber] , [CompanyCode] )

)

CREATE INDEX [ItemNumber] ON [dbo] . B ( [ItemNumber] )

CREATE INDEX [CompanyCode] ON [dbo] . B ( [CompanyCode] )

CREATE INDEX [OwnerCompanyCode] ON [dbo] . B ( [OwnerCompanyCode] )

GO

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

-- 生成測試數(shù)據(jù)

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

RAISERROR ( ' 生成測試數(shù)據(jù) ' , 10 , 1 ) WITH NOWAIT

INSERT [dbo] . A ( [INVNO] , [ITEM] )

SELECT LEFT( NEWID (), 8 ), RIGHT( NEWID (), 15 )

FROM syscolumns A , syscolumns B

INSERT [dbo] . B ( [ItemNumber] , [CompanyCode] , [OwnerCompanyCode] )

SELECT RIGHT( NEWID (), 15 ), LEFT( NEWID (), 4 ), LEFT( NEWID (), 4 )

FROM syscolumns A , syscolumns B

GO

速度測試腳本:

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

-- 進(jìn)行查詢測試

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

RAISERROR ( ' 進(jìn)行查詢測試 ' , 10 , 1 ) WITH NOWAIT

DECLARE @dt DATETIME , @id int , @loop int

DECLARE @ TABLE (

id int IDENTITY ,

[TOP 1] int ,

[WITHOUT TOP] int )

SET @loop = 0

WHILE @loop < 10

BEGIN

SET @loop = @loop + 1

RAISERROR ( 'test %d' , 10 , 1 , @loop ) WITH NOWAIT

SET @dt = GETDATE ()

SELECT TOP 1

A . INVNO

FROM A , B

WHERE A . Item = B . ItemNumber

AND B . OwnerCompanyCode IS NOT NULL

INSERT @([TOP 1] ) VALUES ( DATEDIFF ( ms , @dt , GETDATE ()))

SELECT @id = SCOPE_IDENTITY (), @dt = GETDATE ()

SELECT --TOP 1

A . INVNO

FROM A , B

WHERE A . Item = B . ItemNumber

AND B . OwnerCompanyCode IS NOT NULL

UPDATE @ SET [WITHOUT TOP] = DATEDIFF ( ms , @dt , GETDATE ())

WHERE id = @id

END

SELECT * FROM @

UNION ALL

SELECT NULL, SUM ( [TOP 1] ), SUM ( [WITHOUT TOP] ) FROM @

GO

測試數(shù)據(jù)的變更腳本:

DECLARE @value char ( 15 ), @value1 char ( 15 )

SELECT

@value = LEFT( NEWID (), 15 ),

@value1 = LEFT( NEWID (), 15 )

UPDATE A

SET Item = @value

FROM A

INNER JOIN(

SELECT TOP 1

[TranNumber]

FROM (

SELECT TOP 20 PERCENT

[TranNumber]

FROM A

ORDER BY [TranNumber]

) AA

ORDER BY [TranNumber] DESC

) B

ON A . [TranNumber] = B . [TranNumber]

UPDATE B

SET ItemNumber = @value

FROM B

INNER JOIN(

border-right: medium none; padding-right: 0

分享到:
評論

TOP 1比不加TOP慢的疑惑


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美在线成人免费国产 | 狠狠干图片| 一本伊大人香蕉高清在线观看 | 91国语精品自产拍在线观看一 | 末成年娇小性色xxxxx视频 | 欧美爱爱视频网站 | 伊人365影院 | 另类重口性色老妇 | 青草视频在线观看免费资源 | 欧美日韩中文字幕 | 精品国产日韩亚洲一区91 | 牛牛影视午夜免费福利 | 国产一区二区三区在线视频 | 亚洲成人免费在线视频 | 欧美久草视频 | 欧美一级视频在线 | 日韩欧美视频一区二区在线观看 | 亚洲国产精品综合久久久 | 337p欧美超大胆日本人术艺术 | 亚洲精品久久午夜香蕉 | swag国产精品 | www.久久.com| 欧美成人精品高清在线播放 | 99re热线精品视频 | 久久91精品久久91综合 | 亚洲va天堂va国产va久 | 九九精品视频在线播放 | 五月天国产精品 | 成人免费毛片一区二区三区 | 久久综合九色综合欧美狠狠 | 国产女人又爽又大 | 涩涩综合 | 性欧美极品xxxx欧美一区二区 | 日本中文在线三级在线播放 | 国产九色 | 亚洲a区视频 | 91视频免费看 | 欧美精品亚洲精品日韩一区 | www.色午夜| 欧美大片国产在线永久播放 | 欧美19p |