亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

你知道多少關于sql select top N?

2019-11-17 03:56:10
字體:
來源:轉載
供稿:網友
背景:
sql select top N 語句是一個非常重要的語句, 在實現分頁查詢中是不可或缺的. 由于分頁查詢通常涉及含有大量記錄的表, 并且是為大量用戶分享的任務,因此,對其進行優化是很有意義的。

實現sql top N 的功能有幾種變種:

1. set rowcount @n; select ... order by somefields

2. select top (@n) .... order by somefields

3. select top (xx) ....   order by somefields

        -- 其中 xx是一個常數, 比如10

在上述的查詢中引用的somefields, 如果涉及的表在其上有索引是一種情況, 沒有索引又是一種情況。
有索引的話,即使表含有很多記錄,也不會對性能造成太大問題。
沒有索引的情況也是會有實際需求的,比如實時的找出銷售最好的前100個產品。在沒有索引時的查找Top N, 如果不進行細致的優化,會對性能造成很大的影響,甚至會使得整個系統癱瘓。

如果要對top n進行優化,那么了解sql server 是如何處理上述的top n 的幾種變形就是很有必要的. 下面的文章是我在MS的論壇上發的, 我自己懶得翻譯成中文了,和大家共享一下吧。



原文(是我在http://social.msdn.microsoft.com/Forums/en/transactsql/thread/944ad896-b34c-4dea-af55-cfbae79251f6上的一個回貼)



Question:

--fast
1. select top 100 * from test where c1 < 30000 order by c2

--slow
2. select top 101 * from test where c1 < 30000 order by c2



1. is more than  two times faster than 2.



Why?



What a coinccident! I am on the same issue just at the time.
I was considering implementing an algorithm like this:
First populate the N rows to a table variable (with index on the sort column), then iterate through all left rows, adding one row to the table variable if bigger than min of the table, else discard it.  This could be either done in sql or clr aggregate function.
Then I thought maybe MS had already done it in the Top N stuff, so started to run a test against it.



CREATE TABLE [dbo].[NUM]
([n] int NOT NULL, s varchar(128) NULL, PRIMARY KEY CLUSTERED([n] ASC))
go
-- populate data
set nocount on
declare @n int, @i int
set @n=1000000
set @i = 0
while @n>0 begin
if @i = 0 begin tran
insert into dbo.NUM
select @n, convert(varchar,@n + @i * 2)
set @n=@n-1
set @i = (@i + 1) % 1000
if @i = 0 commit
end
GO
-- test 1
select  top ( XX ) cast(s as int), n from dbo.num
order by cast(s as int) desc
go
-- test 2
set rowcount XX
select cast(s as int), n from dbo.num
order by cast(s as int) desc
for test 1, duration < 1s, for any XX <= 100, and the duration is about 12s for any XX >100

for test 2, the duration is fixed at 4s for XX: 10  - 100,000.

The show-plan shows test 1 uses Top N sort op, while the test 2 uses Sort  op.
Ok I dont care about the sort op. The only thing I care is if MS has correctly implemented the Ton N Sort.
MSDN stated about "Top N sort":  
"Top N Sort is similar to the Sort iterator, except that only the first N rows are needed, and not the entire result set. For small values of N, the SQL Server query execution engine attempts to perform the entire sort Operation in memory. For large values of N, the query execution engine resorts to the more generic method of sorting to which N is not a parameter."

As you can see, this statement sound like the algorithm I was intending to write myself. But the later part mentioned a "more generic method of sorting to which N is not a parameter", that exlains why no matter how XX changes for test1 after going beyong 100, the duration is always the same.  Test 2 is also insensitive to N.
So MS seems used 3 algorithm, in which two of them are used for "top N", one is for "set rowcount".

I do not think whether to perform it in memory or not will cause such a big difference. It's mainly due to that only one (the fastest one) uses the algorithm of just keeping the top N rows and then evict low ranking items when they fall below the N window.

I am using a sql 2005.

I also tested the "select top (@n)" variation. The result shows that "select top (@n)" is similar to "set rowcount...".
The reason I tested the "select top (@n)" variation is that I was wondering if We could use plan-force to force it use the faster "Top N Sort". However it seems that "select top (@n)" is quite different from "select top (xx)" where xx is a constant,  but similar to  "set rowcount; ...". Guess it will not work,  so I will not try to test if plan-force can do the job.

Just curious why MS choose not to use the "Top N Sort" algorithm always, instead to choose this so complex arrangement (i.e. some with "Top N Sort", some with the "Sort then Top").   I think, "Top N Sort" should always be used




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成年网站在线观看| 精品电影在线观看| 亚洲bt欧美bt日本bt| 久久亚洲精品小早川怜子66| 日韩久久午夜影院| 亚洲国产精品久久久久秋霞不卡| 欧美区在线播放| 亚洲一二三在线| 一级做a爰片久久毛片美女图片| 亚洲欧洲在线播放| 国产z一区二区三区| 国产91热爆ts人妖在线| 欧美日韩国产成人| 日日狠狠久久偷偷四色综合免费| 亚洲第一区第一页| 国产精品日韩在线一区| 久久久久久国产免费| 精品中文字幕在线| 欧洲亚洲在线视频| 丝袜亚洲欧美日韩综合| 91久久久国产精品| 国产精品久久久av久久久| 久久久久久97| 精品高清美女精品国产区| 在线精品国产欧美| 精品中文字幕久久久久久| 91精品国产乱码久久久久久久久| 欧美精品福利视频| 中文字幕亚洲一区在线观看| 国产精品偷伦一区二区| 中日韩美女免费视频网站在线观看| 亚洲人成网站999久久久综合| 最近2019中文字幕第三页视频| 九九久久综合网站| 久久久噜噜噜久久中文字免| 久久男人的天堂| 欧亚精品中文字幕| 国产主播在线一区| 国产一区二区三区在线播放免费观看| 日韩欧美一区二区在线| 奇米一区二区三区四区久久| 另类视频在线观看| 欧美洲成人男女午夜视频| 日韩第一页在线| 亚洲天堂网站在线观看视频| 久久精视频免费在线久久完整在线看| 国产精品三级久久久久久电影| 啪一啪鲁一鲁2019在线视频| 日韩欧美在线国产| 亚洲精品资源美女情侣酒店| 国产va免费精品高清在线| 国产97在线|日韩| 色黄久久久久久| 亚洲自拍另类欧美丝袜| 色综合色综合网色综合| 欧美极品少妇xxxxⅹ裸体艺术| 韩国三级电影久久久久久| 国产91精品青草社区| 欧美精品在线免费| 国产国产精品人在线视| 国产精品视频专区| 国产精品电影久久久久电影网| 日韩美女激情视频| 日韩影视在线观看| 中文字幕精品国产| 午夜精品久久久久久久久久久久| 欧美大片欧美激情性色a∨久久| 欧美黑人巨大精品一区二区| 欧美在线观看网站| 欧美一级免费看| 国产91精品视频在线观看| 日韩国产中文字幕| 国产欧美一区二区三区在线看| 久久精品成人欧美大片| 精品亚洲男同gayvideo网站| 久久精品视频导航| 亚洲男人天堂2023| 日日狠狠久久偷偷四色综合免费| 精品人伦一区二区三区蜜桃网站| 国产精品久久久久久久久久| 久久久国产91| 久久噜噜噜精品国产亚洲综合| 亚洲男人av在线| 亚洲精品久久久一区二区三区| 2023亚洲男人天堂| 亚洲3p在线观看| 欧美性猛交xxxx久久久| 久久中文字幕一区| 欧美高清videos高潮hd| 91性高湖久久久久久久久_久久99| 国产精品美女av| 国产美女搞久久| 欧美日本在线视频中文字字幕| 国产欧美日韩精品专区| 欧美电影免费观看网站| 91精品国产综合久久香蕉最新版| 成人黄色在线免费| 日本不卡免费高清视频| 国产成人亚洲精品| 欧美一区二区大胆人体摄影专业网站| 精品人伦一区二区三区蜜桃网站| 国内精品久久久久久影视8| 国产91网红主播在线观看| 久久精品国产电影| 欧美大奶子在线| 久久精品国产免费观看| 91经典在线视频| 日韩欧美999| 一区二区欧美在线| 欧美激情视频在线观看| 国产91在线播放九色快色| 久热99视频在线观看| 国产精品久久久久久久久久ktv| 欧美多人乱p欧美4p久久| 国色天香2019中文字幕在线观看| 国产在线播放不卡| 国产中文字幕日韩| 2019中文字幕在线| 日韩欧美在线视频免费观看| 欧美另类暴力丝袜| 日韩视频在线一区| 久久资源免费视频| 91中文在线视频| 国产成人精品免高潮在线观看| 日韩免费黄色av| 日韩美女视频中文字幕| 日韩精品中文字幕在线| 久热国产精品视频| 精品免费在线观看| 亚洲精品中文字| 91国产高清在线| 国产精品6699| 久久视频国产精品免费视频在线| 欧美日韩国产一区二区| 亚洲精品二三区| 久久久久免费精品国产| 美女精品久久久| 一区二区日韩精品| 国产一区二区动漫| 91免费看国产| 亚洲国产成人精品久久久国产成人一区| 欧美日韩一区二区三区| 97精品国产97久久久久久春色| 欧美成人精品影院| 91中文精品字幕在线视频| 成人精品久久久| 亚洲国产精品中文| 国产最新精品视频| 国产精品视频成人| 2018国产精品视频| 亚洲欧美日韩一区二区三区在线| 91精品久久久久久| 亚洲综合在线做性| 91av成人在线| 国产91在线播放精品91| 久久亚洲综合国产精品99麻豆精品福利| 国外成人性视频| 欧美精品一二区| 亚洲国产成人久久综合| 中文字幕精品av| 欧美放荡办公室videos4k| 亚洲国产中文字幕在线观看| 欧美交受高潮1| 欧美中在线观看|