2017-08-05 78 views
0
使用PROC SQL拉動從倉庫(甲骨文引擎)數據

我需要提取數據的堆積如山的金額,說從不同的表600-700變量在數據倉庫......現在在其原始數據集表單將很容易地觸及150個演示--79 MM行,並且爲了我的分析目的,我只需要一百萬行......如何通過對行進行簡單的隨機採樣,直接從倉庫使用proc sql獲取數據。簡單隨機抽樣,而在SAS

下面的代碼不會工作作爲ranuni不受Oracle

proc sql outobs =1000000; 
    select * from connection to oracle(
    select * from tbl1 order by ranuni(12345); 
    quit; 

支持你怎麼建議我做

+0

Oracle提供一些可靠的工具來進行採樣。你看過示例sql子句(https://blogs.oracle.com/datamining/to-sample-or-not-to-sample-part-2)。 –

+0

順便說一句,你的問題是非常類似於這個問題,https:// stackoverflow。com/questions/9868409/how-to-get-records-randomly-from-the-oracle-database –

+0

你需要一百萬行還是大約一百萬行? – APC

回答

2

使用DBMS_RANDOM包來排序記錄,然後使用一個行限制子句限制到期望的樣本大小

dbms_random.value函數爲表中的所有行獲取介於0和1之間的隨機數,並按隨機值的升序排序。

這裏是如何產生的,你確定的樣本集:

SELECT 
    * 
FROM 
    (
     SELECT 
      * 
     FROM 
      tbl1 
     ORDER BY dbms_random.value 
    ) 
FETCH FIRST 1000000 ROWS ONLY; 

與樣品架構表,emp演示,我們品嚐4個記錄:

[email protected]> SELECT 
    2  empno, 
    3  rnd_val 
    4 FROM 
    5  (
    6   SELECT 
    7    empno, 
    8    dbms_random.value rnd_val 
    9   FROM 
10    emp 
11   ORDER BY rnd_val 
12  ) 
13 FETCH FIRST 4 ROWS ONLY; 
EMPNO RND_VAL 
7698 0.06857749035643605682648168347885993709 
7934 0.07529612360785920635181751566833986766 
7902 0.13618520865865754766175030040204331697 
7654 0.14056380246495282237607922497308953768 


[email protected]> SELECT 
    2  empno, 
    3  rnd_val 
    4 FROM 
    5  (
    6   SELECT 
    7    empno, 
    8    dbms_random.value rnd_val 
    9   FROM 
10    emp 
11   ORDER BY rnd_val 
12  ) 
13 FETCH FIRST 4 ROWS ONLY; 
EMPNO RND_VAL 
7839 0.00430658806761508024693197916281775492 
7499 0.02188116061148367312927392115186317884 
7782 0.10606515700372416131060633064729870016 
7788 0.27865276349549877512032787966777990909 

通過上面的例子中,通知在執行SQL * Plus命令期間empno發生顯着變化。

與行數你所描述的性能可能是一個問題。


編輯:

隨着在150場演出的順序表的大小 - 79 MM,任何排序將是痛苦的。

如果表有基於加1序列的代理鍵,我們可以採取選擇基於密鑰的每個第n個記錄的方法。

例如

--scenario n = 3000 

FROM 
    tbl1 
WHERE 
    mod(table_id, 3000) = 0; 

這一做法將不會使用索引(除非創建函數的索引),但至少我們沒有這種規模的數據集進行排序。

我有接近80萬條記錄的表進行解釋計劃,它並執行全表掃描(條件勢力這個沒有功能的索引),但是這看起來站不住腳的。

+0

這是真的隨機?我懷疑 – Rohan

+0

看到我的補充。 –

+0

這涉及到排序一個巨大的數據集。 –

0

發佈或評論的答案都不對幫助過我的事業,它可以,但我們有87個MM行

現在我想要的答案與SAS的幫助:這裏是我做的是:它的工作原理。謝謝大家!

libname dwh path username pwd; 
    proc sql; 
    create table sample as 
    (select 
    <all the variables>, ranuni(any arbitrary seed) 
    from dwh.<all the tables> 
    <bunch of where conditions goes here>); 
    quit);