這個問題來自論壇提問。很多人都知道類似下面的語句
select top 2000 * from tb order by newid()
但是在海量數據下,它的性能是無法忍受的。這裡我用一個變通的辦法來實現性能的提升,思路為:表必須存在一個guid類型的主鍵或者索引列,然後用這個列去like一個隨機字符串,隨機字符串必須為guid規定的字符集合(數字+A到Z)。下面例子只用到了數字,並且只用了4個數字來匹配,你可以更改like後面的語句來調整這個策略。
--生成測試環境
use master
go
create table test(id uniqueidentifIEr,name varchar(100))
insert into test select newid(),name from syscolumns
--隨機提取
select top 10 * from test where id like
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+'%'
--刪除測試環境
drop table test
我測試了300萬數據提取2000條,耗時大約1秒左右。另外提醒一點,索引對like語句是有效的。