SQL Server SQL 随机排序查询前 10 条记录

admin · 2016年08月26日 · 67 次阅读

随机排序查询前 10 条记录,每次排序结果都不一样。

SELECT TOP 10 Employee_Name FROM T_Employee ORDER BY NEWID()

此方法适用于百万级以下数据的表,因为在筛选记录之前会首先进行表扫描并生成 Guid,对于车间库存明细账等记录多冗余大或无聚集索引的大数据量表,性能可能会低很多,不建议使用。当然如果只是几十万条以内的数,你当我没说

SQL Server 随机取数
鉴于楼上发现的例外情况,于是搜索查阅资料,进行情况了解、研究后,发现:
1.表的数据量越大时,查询的性能会降低、耗时增加;
2.与聚集、非聚集索引的关系不大,但查询的列数越多,查询的性能会降低、耗时增加;

基于这两点发现,认为:
1.当表的数据量不是很大、且查询列数较少(即查询性能较优)时,可使用 order by newid(),支持点:写法简捷等;
例:(其中表来源于 [10.200.0.90].[LTERPCST_Normal].[dbo].[CST_ProdItemizeAccount])

select top 10 Guid from CST_ProdItemizeAccount order by newid()

2.而当性能影响较大时,推荐使用 tablesample(number [rows|percent]) 方式,该方式的更多资料请上网查阅;
例:

create table #temp(Guid varchar(50),PtnField datetime,ProdSort varchar(50),ProdGuid varchar(50),ProdBatch varchar(100),CostItemSort varchar(50),CostItemName varchar(50));

declare @i int;
set @i=0;
while @i<10
begin
    insert #temp (Guid, PtnField, ProdSort, ProdGuid, ProdBatch, CostItemSort, CostItemName)
    (select top 1 Guid, PtnField, ProdSort, ProdGuid, ProdBatch, CostItemSort, CostItemName
    from CST_ProdItemizeAccount
    tablesample(1000 rows))--或写为:tablesample(0.001 percent),其中1000不宜较小、0.001不宜较大
    select @i=count(*) from #temp
end

select * from #temp

drop table #temp

PS:若还有其他的疑点、或技术知识点,请多多提出、让我们大家一起探讨交流!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册