优化数据访问层

时间:2010-09-09 18:38:52

标签: java oracle optimization scalability

我有一个Web服务(JAX-RS / Spring),它生成针对Oracle中临时表运行的SQL查询。然后将数据存档到另一个表(通过3个MERGE语句)。每个“作业”(查询和合并)的执行都是在后台通过JMS代理(ActiveMQ)完成的。每个作业的操作顺序如下:

   insert/update into table Q (select from table F) -- done between 4 and 20 times
   merge into table P (select from table Q)  -- twice
   merge into table P (select from table F)
   merge into table P (select from table F)
   create a view V as select from table P

(表Q是临时表)。

当我发送两到三个这样的工作时,每个工作执行大约需要6-7分钟。但是当我同时发送最多15个运行时,持续时间延长了。

是否发生了这种情况,因为所有这些进程都试图插入/更新到临时表Q?因此争夺资源?我应该考虑哪些技术来优化它?例如,我想到对表Q进行5或6个重复,并对数据访问对象进行“负载平衡”查询。

由于

2 个答案:

答案 0 :(得分:4)

  

当我派遣两到三个工作时   这需要大约6-7分钟   每个要执行的工作。但是当我   派遣最多15人同时运行   时间,持续时间延长   更长的时间。

您的流程可以争夺任意数量的资源,而不仅仅是临时表。

对于初学者,您的数据库有多少处理器(CPU /核心)?有一个非常好的经验法则,我们不应该为每个处理器运行超过1.8个后台作业。因此,如果您没有足够的处理器来支持高度的并行性,那么担心克隆临时表是没有意义的。

调整的关键是:不要猜测。与其他一些DBMS产品不同,Oracle提供了大量的工具,我们可以使用它们来确切了解时间。它被称为等待界面。它并不完美,但它比盲目重新设计数据库模式要好得多。 Find out more.

答案 1 :(得分:2)

如果Q确实是临时表(如在GLOBAL TEMPORARY TABLE中),则每个会话将具有单独的物理对象,因此它们不会争用锁或数据级别。

您更有可能在永久表P或服务器资源(内存和磁盘)上发生争用。