表中有500万条记录,要求随机选择1000条,使用order by newID,结果速度非常慢,要5分钟!请高手解决!100分,在线等

时间:2021-05-08 23:20:39
由于需要,需在数据库某数据量非常大的表中(可能以后会达到千万数量级)中做是随机查询,使用语句select top 1000 from table where ... order by newID(),结果5分钟后结果才出来,求高效率的更好的办法!!在线等!

20 个解决方案

#1


用order by本來就是速度變慢的,而且你的數據量太大了,所以我覺得你的表中應該要用到的字段才列出來,不應該用*來代替

#2


插入一个索引,根据你的表要求,是聚集还就非聚集

#3


to 海洋空间:
我只选择其中的PK字段就可以了,没有用*

to陈良灯:
具体点,不明白。

#4


up,不明白

#5


没有高手?

#6


首先要在数据表中 建立 自动递增的 长整数字段 NID  并设置索引
查询时 编写一个 过程 传递 需要选取的记录个数 如1000


1.产生 1 个随机数 RND 范围 从 1 - 数据表的记录总数并不重复
2.select * into 新表 from 源表 Where NID=随机数
循环以上过程直到到达所需 记录数
3.select * from 新表  就是所需的随机记录

提升效率的关键:避免在全表中作排序操作




#7


1. order by 耗时
2. newid() 也耗时

所以加起来速度就当然慢了

#8


用 zlt982001(zhangle) 说的随机数是一个不错的办法,这样不需要排序
只是随机性差一点

#9


up

#10


MARK

#11


up

#12


newid()是起什么作用的呀

#13


zlt982001(zhangle)的办法是提高了速度,但需要新增一个字段,
楼主能不能把表结构贴出来,看看有没有什么其他办法

#14


学习

#15


用随机数的办法,在表中新增加一个字段

#16


尽量不用*

#17


给表加个递增的序列号

随机抽取序列号取数据

当然,取数据时只提取有用的字段!不用*

#18


up

#19


order by newID()
其实会先生成个中间表,再从中间表里面读取数据返回结果~~~这样的话,表记录很大时,就不适宜用 order by newid()了

#20


你表有标识列ID,可以结合rand函数来实行列ID取随机记录

#1


用order by本來就是速度變慢的,而且你的數據量太大了,所以我覺得你的表中應該要用到的字段才列出來,不應該用*來代替

#2


插入一个索引,根据你的表要求,是聚集还就非聚集

#3


to 海洋空间:
我只选择其中的PK字段就可以了,没有用*

to陈良灯:
具体点,不明白。

#4


up,不明白

#5


没有高手?

#6


首先要在数据表中 建立 自动递增的 长整数字段 NID  并设置索引
查询时 编写一个 过程 传递 需要选取的记录个数 如1000


1.产生 1 个随机数 RND 范围 从 1 - 数据表的记录总数并不重复
2.select * into 新表 from 源表 Where NID=随机数
循环以上过程直到到达所需 记录数
3.select * from 新表  就是所需的随机记录

提升效率的关键:避免在全表中作排序操作




#7


1. order by 耗时
2. newid() 也耗时

所以加起来速度就当然慢了

#8


用 zlt982001(zhangle) 说的随机数是一个不错的办法,这样不需要排序
只是随机性差一点

#9


up

#10


MARK

#11


up

#12


newid()是起什么作用的呀

#13


zlt982001(zhangle)的办法是提高了速度,但需要新增一个字段,
楼主能不能把表结构贴出来,看看有没有什么其他办法

#14


学习

#15


用随机数的办法,在表中新增加一个字段

#16


尽量不用*

#17


给表加个递增的序列号

随机抽取序列号取数据

当然,取数据时只提取有用的字段!不用*

#18


up

#19


order by newID()
其实会先生成个中间表,再从中间表里面读取数据返回结果~~~这样的话,表记录很大时,就不适宜用 order by newid()了

#20


你表有标识列ID,可以结合rand函数来实行列ID取随机记录

#21