我有一个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个重复,并对数据访问对象进行“负载平衡”查询。
由于
答案 0 :(得分:4)
当我派遣两到三个工作时 这需要大约6-7分钟 每个要执行的工作。但是当我 派遣最多15人同时运行 时间,持续时间延长 更长的时间。
您的流程可以争夺任意数量的资源,而不仅仅是临时表。
对于初学者,您的数据库有多少处理器(CPU /核心)?有一个非常好的经验法则,我们不应该为每个处理器运行超过1.8个后台作业。因此,如果您没有足够的处理器来支持高度的并行性,那么担心克隆临时表是没有意义的。
调整的关键是:不要猜测。与其他一些DBMS产品不同,Oracle提供了大量的工具,我们可以使用它们来确切了解时间。它被称为等待界面。它并不完美,但它比盲目重新设计数据库模式要好得多。 Find out more.
答案 1 :(得分:2)
如果Q确实是临时表(如在GLOBAL TEMPORARY TABLE中),则每个会话将具有单独的物理对象,因此它们不会争用锁或数据级别。
您更有可能在永久表P或服务器资源(内存和磁盘)上发生争用。