我想从一个包含1000万到2000万行之间的表中提取粗略 500万行样本。
由于行数很多,效率很关键。因此,我试图避免在可能的情况下对行进行排序,因此我为什么要避免在类似问题中看到的dbms_random.value解决方案。
我尝试做类似以下的事情:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
但是,我似乎无法在SAMPLE子句中进行算术运算(ORA-00933:SQL命令未正确结束 - 我尝试使用简单的SAMPLE(10/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。