Oracle SQL:从表中采样大量行

时间:2017-08-14 15:46:54

标签: sql oracle oracle12c

我想从一个包含1000万到2000万行之间的表中提取粗略 500万行样本。

由于行数很多,效率很关键。因此,我试图避免在可能的情况下对行进行排序,因此我为什么要避免在类似问题中看到的dbms_random.value解决方案。

我尝试做类似以下的事情:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

但是,我似乎无法在SAMPLE子句中进行算术运算(ORA-00933:SQL命令未正确结束 - 我尝试使用简单的SAMPLE(10/2)并仍然得到相同的东西)。

这是一种合理的方法,如果是这样,我如何计算样本子句中的行数?

2 个答案:

答案 0 :(得分:4)

您可以将PL / SQL与动态SQL一起使用,如下所示:

declare
  cnt integer;
begin
  select count(*) into cnt from full_table;
  dbms_output.put_line(cnt);
  execute immediate
    'insert into target_table'
    ||' select * from full_tablesample (' || ceil(100 * 5000000/cnt) || ')';
end;

答案 1 :(得分:2)

如果您需要大致 500万行,您可以执行以下操作:

SELECT ft.*
FROM full_table ft cross join
     (SELECT COUNT(*) as cnt FROM full_table) x
WHERE dbms_random.value * cnt < 5000000;

这使用简单的算法来确定哪些行进入表中。结果应该非常接近5,000,000。