Sql Server 隨機抽取資料效率優化

2022-08-19 05:21:11 字數 2692 閱讀 4575

山人我最近遇到一件很糾結的事情,就是如何快速的從資料表裡隨機抽取一條資料。

我生成了乙個簡單的資料表,並且匯入了500w條資料進行測試。

下圖為第一次採用的sql語句:

declare

@ddatetime

set@d

=getdate

()select

top1

[activityid],

[cardno],

[password],

[state],

[createtime],

[gettime

]from

[tgbus_card].

[dbo].

[ka_card

]where

activityid

=501

andstate =0

order

bynewid

()select

[語句執行花費時間(毫秒)]=

datediff

(ms,@d,

getdate

())

這是我優先會想到的解決方案,newid()

每次都要檢索整個資料表

,為每一行資料產生乙個uniqueidentifier型別的唯一值,所以它的執行效率肯定不高 ,每次執行都要在4秒左右。

還有沒有更好的辦法那?!

山人我在想,因為select是在order by之前執行的,所以能不能在select的時候產生newid()後在order by使用那?

於是有了第二個版本:

declare

@ddatetime

set@d

=getdate

()select

top1

[activityid],

[cardno],

[password],

[state],

[createtime],

newid

() as

random

from

[tgbus_card].

[dbo].

[ka_card

]where

activityid

=501

andstate =0

order

byrandom

select

[語句執行花費時間(毫秒)]=

datediff

(ms,@d,

getdate

())

確實有所提高!!但太不明顯了。。。。。

還有沒有更好的辦法?!

於是我又想到了2005的新特性tablesample,馬上試試!

這是第三版的**:

declare

@ddatetime

set@d

=getdate

()select

top1

[activityid],

[cardno],

[password],

[state],

[createtime],

[gettime

]from

[tgbus_card].

[dbo].

[ka_card

]tablesample (

1000

rows)

where

activityid

=501

andstate =0

select

[語句執行花費時間(毫秒)]=

datediff

(ms,@d,

getdate

())

速度太快了!!!10幾毫秒就顯示了!

到這裡山人我本以為事情搞定了!心裡還美滋滋的!於是小研究了一下tablesample,不看不知道,原來tablesample隨機選取的單位是資料頁!!我靠!!也就是說如果資料量很小的話很可能有取不到資料的可能,試一下果然如此!這個不靠譜的傢伙!

問題又回到了起點。。。難道真的就要用newid了嗎?正當山人我感慨的時候在msdn上無意中看到了這段文字:

感覺有戲!!

於是又寫了這第四版**:

declare

@ddatetime

set@d

=getdate

()select

top1

*from

[tgbus_card].

[dbo].

[ka_card

]where

0.01

>=

cast

(checksum(

newid

(), cardno)

&0x7fffffff

asfloat) /

cast

(0x7fffffff

asint

)and

activityid

=501

andstate =0

select

[語句執行花費時間(毫秒)]=

datediff

(ms,@d,

getdate

())

這也是我最終採用的方法,sql執行速度在1毫秒左右。

sql server 隨機抽取N條資料

select top 5 from 表名 order by newid newid 產生的新的值是不固定的 在select表裡的資料的newid 函式時候 隨即選出n條記錄 回答人的補充 2011 04 21 22 50 newid 函式會隨即產生乙個不重複的數值 你可以把它理解成乙個簡單的數字 例...

隨機抽取資料庫記錄

mysql select from tablename order by rand limit 10 sql server select top 5 from tablename order by newid access select top 5 from tablename order by r...

sql隨機抽取記錄

我們經常想在乙個資料表中隨機地選取出資料來,比如隨機生成考試試卷等。利用 sql server 的 newid 方法就可以很輕鬆地達到這個目的。newid 方法返回乙個 guid,如 ee95a489 b721 4e8a 8171 3ca8cb6ad9e4 在 select 表的時候,再增加一列為 ...