这条查询语句 oracle 是如何分析执行的?
日期:2007-01-28 荐:
这条查询语句 oracle 是如何分析执行的?Oracle 9iselect rid, mb_name from(select rownum rid,mb_name from tb_manbase) where mod(rid, mod(abs(dbms_random.random()),200))=0 ^^^请问返回的结果集中, 前后两行记录其字段rid的值差会否大于200?注: 本人只是想从千万行级的表中随机取出一些样本数据而已 (数据需要具有一定的离散性), 又懒得手动写程序, 就想了这么个用法. 写完后, 在小规模表中运行一下, 发现结果似乎很理想, 只是不明白Oracle内部是如何分析处理这种嵌套关联子 查询的. 类似的这种查询, 在不同的DBMS实现上, 会否 出现完全不同的逻辑解释.Oracle 9iselect rid, mb_name from(select rownum rid,mb_name from tb_manbase) where mod(rid, mod(abs(dbms_random.random()),200))=0 ^^^请问返回的结果集中, 前后两行记录其字段rid的值差会否大于200?Answer:1.你想看执行步骤,用explain plan2.前后两行记录其字段rid的值差完全可能大于200mod(abs(dbms_random.random()),200)--这步你取了一个随机数的绝对值,然后让绝对值对200取余,结果得到数X是>0 && <200的(rid不可能为0,因为rownum > 0)mod(rid, mod(abs(dbms_random.random()),200))=0 --然后你又让rid(也就是行号)对前面得到的结果X取余,要求结果为0,也就是说rid为X的自然数倍,所以你无法保证得到你要的结果
标签: