如何将简单的SELECT查询进行并行化?

4

假设我有如下经典的 SQL 语句:

select * from employees where dob < to_date('10/10/1985', 'DD/MM/YYYY');

由于表非常大,所以我想并行化此查询。

根据我在这里看到的内容:

http://docs.oracle.com/cd/B10500_01/server.920/a96524/c20paral.htm#13255

我们希望将表任意地分成 n 个部分,在不同的线程上运行每个部分的 select 语句,最后将它们合并在一起。

  1. 在此处适用并行化吗?
  2. 如何编写查询语句?

2
你只需在 dob 上创建一个索引,让数据库引擎自行决定如何运行查询。 - Gordon Linoff
@GordonLinoff 并行处理是否需要索引? - dwjohnston
不是。但这是提高性能最合理的方法。 - Gordon Linoff
@GordonLinoff 当然。但是考虑到我没有管理员权限,这个选项不可行。 - dwjohnston
只是一个小问题,长时间运行的并行查询可能会消耗大量资源,使数据库变慢。 - Maheswaran Ravisankar
1个回答

4

试试这个:

select /*+ PARALLEL(4) */ * from employees 
where dob < to_date('10/10/1985', 'DD/MM/YYYY');

更多信息请参考Oracle Hint

此外,可以查看此答案以了解为什么在您的SQL语句中未应用PARALLEL。


谢谢Minh。这正是我认为的正确解决方案。我目前遇到的问题是确定它是否真的给我带来了改进。 - dwjohnston
这意味着当你EXPLAIN_PLAN SQL时,你会得到一个"TABLE ACCESS FULL"计划。这很容易尝试,只需运行SQL并查看是否有改进即可。 - MinhD
1
你可以在SQL中查看执行计划:运行EXPLAIN PLAN select /*+ PARALLEL(4) */ * from employees ....... - MinhD
1
select * from table(dbms_xplan.display) 将查询计划表,运行 EXPLAIN PLAN 后... 在 sqlplus 中使用 set pages 0set linesize 4000 可以使其更易读。 - Maheswaran Ravisankar
你引用的手册部分几乎完全是错误的 - 请参阅我对一个非常相似的问题的回答这里 - Jon Heller
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接