首页 / 知识
如何在SQL中请求随机行?
2023-04-12 17:11:00

How to request a random row in SQL?如何在纯SQL中请求随机行(或尽可能接近真正的随机行)? 参见这篇文章:SQL从数据库表中选择一个随机行。它介绍了在MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle中执行此操作的方法(以下内容从该链接复制): 使用MySQL选择一个随机行:
使用PostgreSQL选择一个随机行:
使用Microsoft SQL Server选择一个随机行:
使用IBM DB2选择随机行
使用Oracle选择一个随机记录:
杰里米(Jeremies)等解决方案:
可以,但是它们需要对所有表进行顺序扫描(因为需要计算与每一行关联的随机值-这样才能确定最小的行),即使对于中等大小的表也可能相当慢。我的建议是使用某种索引数字列(许多表将它们作为主键),然后编写类似以下内容的内容:
如果对 我不知道这有多有效,但是我以前用过:
由于GUID非常随机,因此排序意味着您将获得随机行。
需要
需要 我绝对会选择后一种方法。 您没有说要使用哪个服务器。在旧版本的SQL Server中,可以使用以下命令:
在SQL Server 2005及更高版本中,可以使用
对于SQL Server newid()/ order by可以工作,但是对于大型结果集来说非常昂贵,因为它必须为每一行生成一个id,然后对其进行排序。 从性能的角度来看,TABLESAMPLE()很好,但是您会得到成堆的结果(将返回页面上的所有行)。 为了获得性能更好的真实随机样本,最好的方法是随机过滤出行。我在SQL Server联机丛书文章"使用TABLESAMPLE限制结果集"中找到以下代码示例:
当对具有1,000,000行的表运行时,这是我的结果:
如果您可以避免使用TABLESAMPLE,它将为您提供最佳性能。否则,请使用newid()/ filter方法。如果结果集较大,则newid()/ order by应该是最后的选择。 如果可能,请使用存储的语句来避免RND()上的两个索引都无效,并创建记录号字段。
由于不鼓励使用RAND(),因此您可以简单地获得最大ID(= Max):
获得1..Max(= My_Generated_Random)之间的随机数
然后运行以下SQL:
请注意,它将检查ID等于或大于所选值的任何行。
最好的方法是为此目的在新列中放入一个随机值,并使用如下代码(伪代码+ SQL):
这是MediaWiki代码采用的解决方案。当然,对于较小的值存在一些偏差,但是他们发现,在没有获取任何行的情况下,将随机值包装为零就足够了。 newid()解决方案可能需要全表扫描,以便可以为每行分配一个新的guid,这将大大降低性能。 rand()解决方案可能根本无法工作(例如,使用MSSQL),因为该函数只会被评估一次,并且每一行都将被分配相同的"随机"数字。 对于SQL Server 2005和2008,如果我们要随机获取单个行的样本(来自联机丛书):
正如@BillKarwin对@??cnu的答案的评论所指出的...
当与LIMIT结合使用时,我发现以随机顺序加入JOIN的效果要好得多(至少在PostgreSQL 9.1中),而不是直接对实际行进行排序: 只要确保" r"会为复杂查询中与之相连的每个可能的键值生成一个" rand"值,但仍然在可能的情况下限制" r"的行数。 作为整数的CAST对PostgreSQL 9.2特别有用,它对整数和单精度浮点类型进行了特定的排序优化。 在SQL Server中,可以将TABLESAMPLE与NEWID()结合使用以获得很好的随机性,并且仍然具有速度。如果您确实只需要1行或少量行,则此功能特别有用。
最近,但是是通过Google到达的,因此为了后代,我将添加一个替代解决方案。 另一种方法是两次交替使用TOP。我不知道它是否是"纯SQL",因为它在TOP中使用了变量,但是它在SQL Server 2008中有效。如果想要一个随机单词,这是我对字典单词表使用的示例。
当然,@ idx是目标表上包含1到COUNT(*)在内的一些随机生成的整数。如果您的列已建立索引,您也会从中受益。另一个优点是您可以在函数中使用它,因为不允许使用NEWID()。 最后,以上查询在同一张表上运行的时间是NEWID()类型查询的执行时间的大约1/10。 YYMV。 在MSSQL中(在11.0.5569上测试)使用
明显比
您也可以尝试使用
只需编写查询并使用 让MySQL获得随机记录
更多细节http://jan.kneschke.de/projects/mysql/order-by-rand/ 还没有在答案中看到这种变化。我有一个额外的约束,需要给定初始种子,每次选择相同的行集。 对于MS SQL: 最小示例:
标准化执行时间:1.00 NewId()示例:
标准化执行时间:1.02
选择初始种子:
如果需要给定种子选择同一组,这似乎可行。 这里的大多数解决方案旨在避免排序,但是它们仍然需要对表进行顺序扫描。 还有一种方法可以通过切换到索引扫描来避免顺序扫描。如果您知道随机行的索引值,则几乎可以立即获得结果。问题是-如何猜测索引值。 以下解决方案适用于PostgreSQL 8.4:
我在上面的解决方案中,您猜测范围为0 .. [id的最后值]的10个各种随机索引值。 数字10是任意的-您可以使用100或1000,因为(令人惊奇地)它对响应时间没有太大的影响。 还有一个问题-如果您的ID稀疏,则可能会错过。解决方案是有一个备份计划:)在这种情况下,可以通过random()查询获得纯旧订单。当组合的ID如下所示:
不是union ALL子句。在这种情况下,如果第一部分返回任何数据,则永远不会执行第二部分! 对于火鸟:
对于Oracle,有一个更好的解决方案,而不是使用dbms_random.value,尽管它需要对dbms_random.value进行完全扫描以对行进行排序,并且对于大型表而言它的速度相当慢。 使用此代替:
似乎列出的许多想法仍然使用排序 但是,如果使用临时表,则可以分配一个随机索引(如许多解决方案所建议的那样),然后获取第一个大于0到1之间任意数字的索引。 例如(对于DB2):
注意,因为TableSample实际上不会返回行的随机样本。它指示您的查询查看构成行的8KB页面的随机样本。然后,针对这些页面中包含的数据执行查询。由于在这些页面上数据的分组方式(插入顺序等),这可能导致数据实际上不是随机样本。 请参阅:http://www.mssqltips.com/tip.asp?tip=1308 这个用于TableSample的MSDN页面包括一个如何生成实际随机数据样本的示例。 http://msdn.microsoft.com/en-us/library/ms189108.aspx 我必须同意CD-MaN:使用" ORDER BY RAND()"对于小型表或仅执行几次SELECT时将很好地工作。 我还使用" num_value> = RAND()* ..."技术,如果我真的想获得随机结果,则在表中有一个特殊的"随机"列,该列每天大约更新一次。一次UPDATE运行将花费一些时间(特别是因为您必须在该列上有一个索引),但是它比每次运行选择为每行创建随机数要快得多。 来自http://akinas.com/pages/en/blog/mysql_random_row/的一种简单有效的方法
使用SQL Server 2012+,您可以使用OFFSET FETCH查询对单个随机行执行此操作
其中id是一个标识列,n是您想要的行-计算为介于0和表的count()-1之间的随机数(偏移量0毕竟是第一行) 只要您有一个用于ORDER BY子句的索引,它就可以处理表数据中的孔。这对于随机性也非常好-当您努力使自己通过时,却没有其他方法的麻烦。此外,性能还不错,在较小的数据集上,它可以很好地保持性能,尽管我没有尝试对几百万行进行严格的性能测试。
对于SQL Server 2005及更高版本,对于
来自sql的随机函数可能会有所帮助。另外,如果您只想限制一行,那么只需在最后添加一行即可。
|
最新内容
相关内容
python循环执行语句怎么写
python循环执行语句怎么写,培训,项目,语句,条件,序列,双数,括号,后跟,字符串,语法,python编程中while语句用于循环执行程序,即在某条件下,循环python列表操作的函数和方法
python列表操作的函数和方法,培训,位置,列表,元素,操作,函数,末尾,方法,对象,以下,1列表操作包含以下函数:21、cmp(list1,list2):比较两个列表python如何选择python版本?
python如何选择python版本?,项目,代码,培训,名字,地方,系统,里面,版本,问题,变量,Python3.7已经发布了,目前Python的用户,主要使用的版本应该是python如何操作mysql数据库
python如何操作mysql数据库,培训,标准,项目,密码,数据库,接口,表字,操作,用户,机子,Python标准数据库接口为PythonDB-API,PythonDB-API为开发python如何执行python文件
python如何执行python文件,代码,培训,文件,程序,命令,模式,事半功倍,后缀,文本,以上,用文本编辑器写Python程序,然后保存为后缀为.py的文件,就python怎么执行.py文件
python怎么执行.py文件,培训,位置,代码,文件,空格,路径,文件名,时候,右侧,单击,要运行一个已经编写好的.py文件,可以单击开始菜单,在“搜索程序python选择python2还是python3?
python选择python2还是python3?,电脑,培训,时间,项目,动力,公司,官方,理由,答案,建议,看到很多新同学在学习Python的过程中,犹豫学习Python2还pythonfinal作用域的代码一定会被
pythonfinal作用域的代码一定会被执行吗?,代码,培训,异常,流程,作用,函数,上面,以上,需求,发生,python在正常的情况下,finally作用域的代码一pythonos.system执行cmd指令
pythonos.system执行cmd指令,培训,状态,高位,号码,低位,指令,脚本,内容,控制台,实例,pythonos.system执行cmd指令1、执行cmd指令,在cmd输出的python网页中下拉框的操作
python网页中下拉框的操作,信息,培训,选项,元素,操作,标签,对象,下标,属性,表示,python网页中下拉框的操作1、只要是第一次打开页面可以加载python集合的并集操作
python集合的并集操作,培训,操作,参数,更多,语法,符号,实例,元素,以上,两个,python集合的并集操作说明1、可以使用|符号来计算两个或更多集合python如何创建操作页面
python如何创建操作页面,培训,方法,操作,页面,组件,实例,模块,按钮,界面,初始化,python如何创建操作页面说明Python自带tkinter模块,本质上是G