【发布时间】:2014-03-02 22:39:34
【问题描述】:
我有一张有 2 亿行的表。
让我们调用表employee_internet_history。
行:employee_fullname || website || date || more data.
该表在employee_fullname 列上有一个索引。
我还有另一张桌子eu_employees。
100行;每行:employee_fullname || more data。
我想创建一个查询来选择每位员工浏览的前 3 个网站。
我正在使用Oracle Database,所以我考虑使用PL/SQL 来实现这一点。
目前我正在使用
declare
cursor top100workers is
select * from eu_employees
where rownum < 100;
begin
for worker in top100workers
LOOP
DBMS_OUTPUT.PUT_LINE(worker.employee_fullname ||' top 3 webpages:');
for TOP3 in (
SELECT /*+ parallel*/ website,
COUNT(website) AS num
from employee_internet_history
WHERE employee_internet_history.employee_fullname = worker.employee_fullname
group by website
order by num desc
)
LOOP
DBMS_OUTPUT.PUT_LINE('website = ' || TOP3.website || ' ,times surferd: '||top3.num);
end loop;
end LOOP;
end;
/
对于每位员工,此查询大约需要 200 秒。
而我真正的 eu_employee 表有超过 8000 条记录。
这意味着使用我的方式计算需要 19 天。
1) 我怎样才能加快速度?
2) 为什么需要这么长时间?
如果一个员工的所有记录都被索引,它应该需要 O(1) 才能找到它们,并计算它们。
查询也不相互依赖, 3)我可以并行运行几个查询吗?
4) 我看到有几个提示可以在并行模式下运行,哪一个最适合我的需要?
5) 有没有不使用pl/sql的解决方案?
【问题讨论】: