2017-08-05 86 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);