一道简单的面试题,SELECT TOP 1 * FORM TABLE ORDER BY NEWID()

mengnnou 2010-11-26 05:52:06
1 原理是什么,SQL SERVER如何执行这条语句?
2 对于数据量很大的表,该语句性能高么?
3 还有其他方式随机获取表中的一行么?
...全文
531 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
duanxn 2010-11-27
  • 打赏
  • 举报
回复
很多网站的随机广告显示都是用

SELECT TOP XXX * FORM AD_Table ORDER BY NEWID()
w568412 2010-11-27
  • 打赏
  • 举报
回复
学习了,还真不知道有这个用法哦
claro 2010-11-27
  • 打赏
  • 举报
回复
学习。
dawugui 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 mengnnou 的回复:]
1 原理是什么,SQL SERVER如何执行这条语句?
2 对于数据量很大的表,该语句性能高么?
3 还有其他方式随机获取表中的一行么?
[/Quote]
1 原理是什么,SQL SERVER如何执行这条语句?
原理就是每次随机对表数据进行排序,然后取第一条。

2 对于数据量很大的表,该语句性能高么?
不高。

3 还有其他方式随机获取表中的一行么?
目前来说,其他的语句还不如用这句:order by newid()
abuying 2010-11-27
  • 打赏
  • 举报
回复
NEWID ( )

创建 uniqueidentifier 类型的唯一值。

如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个 4 字节的 uniqueifier 列。必要时,数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
heyi10012 2010-11-27
  • 打赏
  • 举报
回复
学习。。。。
hello926 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
引用楼主 mengnnou 的回复:
1 原理是什么,SQL SERVER如何执行这条语句?
2 对于数据量很大的表,该语句性能高么?
3 还有其他方式随机获取表中的一行么?

1 原理是什么,SQL SERVER如何执行这条语句?
原理就是每次随机对表数据进行排序,然后取第一条。

2 对于数据量很大的表,该语句性能高么?
不高。

3 还有其他方式随机获取表中的一行么?
……
[/Quote]

MARK
duanxn 2010-11-27
  • 打赏
  • 举报
回复
如果是SQL2005 以上可以用【row_number over 关键字段】和【Random函数】合用,效果会好得多。
  • 打赏
  • 举报
回复
来学习的
mengnnou 2010-11-27
  • 打赏
  • 举报
回复
谢谢,结贴
haoxuea 2010-11-27
  • 打赏
  • 举报
回复
来学习的
guguda2008 2010-11-27
  • 打赏
  • 举报
回复
TABLESAMPLE
用个WHILE循环多判断几次,大表的执行效率肯定是好过NEWID的,另外ORDER BY NEWID也有更好的写法,这种简单的写法是最慢的。
guguda2008 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 mengnnou 的回复:]
主要是,newid()执行次数,理解上应该是每行一次,但是如何在执行计划里验证这一说法?
[/Quote]
你自己看计划啊,最初扫表的时候只会取所有列,下一个标量计算迭代器里最后会多出一个EX什么的列,那个就是生成的GUID列,然后会按照那个列排序

mengnnou 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 guguda2008 的回复:]
引用楼主 mengnnou 的回复:
1 原理是什么,SQL SERVER如何执行这条语句?
2 对于数据量很大的表,该语句性能高么?
3 还有其他方式随机获取表中的一行么?

1.在扫描基表时,每一行生成一个GUID列,列名随机,然后按生成的列进行排序取第一行输出。
2.不怎么样
3.如果是数据量超大的表,可以考虑用TABLESAMPLE+逻辑判断

SQL code
IF ……
[/Quote]
TABLESAMPLE方案最好,当然对于数据量小的得判断一下,可能不准确


主要是,newid()执行次数,理解上应该是每行一次,但是如何在执行计划里验证这一说法?
s_111111 2010-11-27
  • 打赏
  • 举报
回复
sql是处理数据用的,如果只是随机这种跟他关系不大的要求,建议:
自己生成一个随机数,然后where条件取这个随机数就好了。
dgzcl 2010-11-27
  • 打赏
  • 举报
回复
菜鸟,不太懂!
fengxiaohan211 2010-11-27
  • 打赏
  • 举报
回复
学习了···
sdyttb 2010-11-27
  • 打赏
  • 举报
回复
9楼的回答12楼的补充就是答案了……
mengnnou 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 abuying 的回复:]
NEWID ( )

创建 uniqueidentifier 类型的唯一值。

如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个 4 字节的 uniqueifier 列。必要时,数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
[/Quote]
答非所问
mengnnou 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 duanxn 的回复:]
如果是SQL2005 以上可以用【row_number over 关键字段】和【Random函数】合用,效果会好得多。
[/Quote]
这样差不多,也要排序的
加载更多回复(11)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧