posts - 262,  comments - 221,  trackbacks - 0
          【1】方法一:通過dbms_random.random
          select * from (select * from largetable order by dbms_random.random) where rownum <= 20000;

          【2】方法二:通過dbms_random.value
          select * from (select * from largetable order by dbms_random.value) where rownum <= 20000;

          【3】方法三:通過采樣表掃描
          select * from (select * from largetable sample(10)) where rownum <= 20000;

          下面我們通過實踐來比較這3種方法的效率,首先我們創(chuàng)建一個包含有10W條記錄的表用于實驗:
          create table LARGETABLE
          (
            ID       
          NUMBER not null primary key,
            BIRTHDAY DATE 
          not null
          )

          接下來我們插入10W條數(shù)據(jù)
          create or replace procedure random_insert as
            i         
          number;
            startDate date :
          = sysdate;

          begin

            
          for i in 1 .. 100000 loop
              
          insert into largetable values (i, startDate + 1);
            
          end loop commit;

          end;

          在SQL*PLUS下設置顯示SQL語句執(zhí)行時間:set timing on,讓后分別運行上述三條語句:

          第一個的執(zhí)行時間為 00: 00: 16: 04
          第二個的執(zhí)行時間為 00: 00: 54: 04
          第三個的執(zhí)行時間為 00: 00: 08: 07

          從這里我們可以看出在進行數(shù)據(jù)隨機抽取時,采用sample的方法效率是最高的。為了保證每次隨機查詢的數(shù)據(jù)盡量不重復,我們可以把sample中的百分比提高一些(例如從10%提高到20%)。

          關于Oracle Sample的介紹和用法,請參考eygle他老人家的一篇文章介紹:如何從結(jié)果集中獲得隨機結(jié)果


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-06-09 17:41 Paul Lin 閱讀(1999) 評論(3)  編輯  收藏 所屬分類: Oracle 開發(fā)


          FeedBack:
          # re: 【原】Oracle開發(fā)專題之:隨機查詢
          2009-02-23 11:36 | wxf0701@gmail.com
          俺的測試結(jié)果跟你的很不一樣哦,你多次運行下看看  回復  更多評論
            
          # re: 【原】Oracle開發(fā)專題之:隨機查詢[未登錄]
          2009-03-19 15:29 | peter
          用sample代表取樣阿,我查詢時如果戴上查詢條件,如果用sample得到的查詢結(jié)果數(shù)量可能不對啊,多次查詢的數(shù)目不同?  回復  更多評論
            
          # re: 【原】Oracle開發(fā)專題之:隨機查詢
          2009-05-17 17:13 | 初學者
          看了大俠的oracle的博文,受益頗深。現(xiàn)有一問題想求,望復:
          在一個SQL語句中,進行表連接的最合適的表的個數(shù)是多少?例如,在一個sql語句中,涉及到了4張表連接。如果,一個sql語句涉及了10張表進行連接,是不是說明數(shù)據(jù)庫的表的設計有問題?那,一個什么樣的表連接數(shù)值才是合適的數(shù)據(jù)庫表的設計呢?

          謝謝。
          祝順利,健康。  回復  更多評論
            
          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石门县| 林口县| 嘉禾县| 时尚| 东城区| 宜宾市| 大城县| 三原县| 双城市| 卓尼县| 平顺县| 陵川县| 余干县| 阿拉善右旗| 蒙阴县| 秦皇岛市| 当雄县| 桐庐县| 治县。| 榆中县| 新宁县| 南宫市| 二连浩特市| 石台县| 怀仁县| 洱源县| 衡水市| 衡阳市| 息烽县| 渑池县| 罗甸县| 尤溪县| 耒阳市| 固原市| 商城县| 龙游县| 永登县| 八宿县| 当雄县| 晋宁县| 苍溪县|