山人我最近遇到一件很糾結的事情,就是如何快速的從資料表裡隨機抽取一條資料。
我生成了乙個簡單的資料表,並且匯入了500w條資料進行測試。
下圖為第一次採用的sql語句:
declare這是我優先會想到的解決方案,newid()@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
())
每次都要檢索整個資料表
,為每一行資料產生乙個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速度太快了!!!10幾毫秒就顯示了!@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
())
到這裡山人我本以為事情搞定了!心裡還美滋滋的!於是小研究了一下tablesample,不看不知道,原來tablesample隨機選取的單位是資料頁!!我靠!!也就是說如果資料量很小的話很可能有取不到資料的可能,試一下果然如此!這個不靠譜的傢伙!
問題又回到了起點。。。難道真的就要用newid了嗎?正當山人我感慨的時候在msdn上無意中看到了這段文字:
感覺有戲!!
於是又寫了這第四版**:
declare這也是我最終採用的方法,sql執行速度在1毫秒左右。@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 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 表的時候,再增加一列為 ...