posts - 60,comments - 71,trackbacks - 0

              當(dāng)我們獲取數(shù)據(jù)時(shí),可能會(huì)有這樣的需求,即每次從表中獲取數(shù)據(jù)時(shí),是隨機(jī)獲取一定的記錄,而不是每次都獲取一樣的數(shù)據(jù),這時(shí)我們可以采取Oracle內(nèi)部一些函數(shù),來(lái)達(dá)到這樣的目的.

             1) select * from (select * from tablename order by sys_guid()) where rownum < N; 
             
          2) select * from (select * from tablename order by dbms_random.value) where rownum< N; 
             
          3) select *  from (select * from table_name sample(10)   order by trunc(dbms_random.value(01000)))  where rownum < N;

             說(shuō)明: sample(10)含義為檢索表中的10%數(shù)據(jù),sample值應(yīng)該在[0.000001,99.999999]之間.

             其中 sys_guid() 和 dbms_random.value都是內(nèi)部函數(shù),通過(guò)這樣的方法,就可以實(shí)現(xiàn)我們的需求了.

             注:
                  在使1)方法時(shí),即使用sys_guid() 這種方法時(shí),有時(shí)會(huì)獲取到相同的記錄,即和前一次查詢的結(jié)果集是一樣的,我查找了相關(guān)資料,有些說(shuō)是和操作系統(tǒng)有關(guān),在windows平臺(tái)下正常,獲取到的數(shù)據(jù)是隨機(jī)的,而在linux等平臺(tái)下始終是相同不變的數(shù)據(jù)集,有些說(shuō)是因?yàn)閟ys_guid()函數(shù)本身的問(wèn)題,即sys_guid()會(huì)在查詢上生成一個(gè)16字節(jié)的全局唯一標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符在絕大部分平臺(tái)上由一個(gè)宿主標(biāo)識(shí)符和進(jìn)程或進(jìn)程的線程標(biāo)識(shí)符組成,這就是說(shuō),它很可能是隨機(jī)的,但是并不表示一定是百分之百的這樣.
                
                 所以,為確保在不同的平臺(tái)每次讀取的數(shù)據(jù)都是隨機(jī)的,我們大多采用2)和3)兩種方案,其中2)方案更常用.3)方案縮小了查詢的范圍,在查詢大表,且要提取數(shù)據(jù)不是很不多的情況下,會(huì)對(duì)查詢速度上有一定的提高,

             另:在Oracle中一般獲取隨機(jī)數(shù)的方法是:

          select trunc(dbms_random.value(01000)) from dual; (0-1000的整數(shù))
          select dbms_random.value(
          01000) from dual; (0-1000的浮點(diǎn)數(shù))




          posted on 2008-09-02 18:13 henry1451 閱讀(398) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 塘沽区| 兰考县| 凌源市| 阜新| 涟水县| 蒙阴县| 金乡县| 孟村| 高雄县| 资阳市| 宁德市| 浙江省| 临江市| 惠州市| 山东| 龙井市| 大宁县| 曲阜市| 任丘市| 云林县| 交口县| 通渭县| 宁武县| 湖州市| 巫溪县| 墨江| 巩义市| 祁阳县| 同仁县| 新巴尔虎左旗| 马尔康县| 永宁县| 康马县| 阿勒泰市| 德令哈市| 泾川县| 宁明县| 昆明市| 来安县| 南投县| 洪湖市|