我有一个web服务(JAX-RS/Spring),它生成针对Oracle中的临时表运行的SQL查询。然后将数据归档到另一个表中(通过3条MERGE语句)。每个“作业”的执行(查询和合并)都是通过JMS broker (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?从而为资源而战?我应该使用什么技术来优化它呢?例如,我想制作5到6个表Q的副本,并针对它们对数据访问对象查询进行“负载平衡”。
谢谢
发布于 2010-09-10 03:23:22
当我分派两到三个这样的作业时,每个作业大约需要6-7分钟来执行。但是当我同时发送多达15次运行时,持续时间会延长很多。
您的进程可能会争用任意数量的资源,而不仅仅是临时表。
对于初学者,您的数据库有多少个处理器(CPU/核心)?有一个非常好的经验法则,我们不应该在每个处理器上运行超过1.8个后台作业。因此,如果您没有足够的处理器来支持高度并行,那么就没有必要担心克隆临时表。
调优的关键是:不要猜测。与其他一些DBMS产品不同,Oracle有许多工具,我们可以使用它们来准确地找出时间的去向。它被称为等待接口。它不是完美的,但它比盲目地重新设计数据库模式要好得多。Find out more.
发布于 2010-09-10 07:36:50
如果Q真的是一个临时表(就像在全局临时表中一样),那么每个会话都将有一个单独的物理对象,因此它们不会争用锁或在数据级别。
您更有可能在永久表P或服务器资源(内存和磁盘)上获得争用。
https://stackoverflow.com/questions/3679546
复制相似问题