2017-02-24 72 views
1

我有一个表有100个分区, 我有明智地读取数据分区的过程。 假设Oracle分区

P0是1个分区,如果我执行过程

exec xyz('P0'); 

需要3分钟为50万行执行。

但是,当我创建100个会话,并在不同的不同的会话

exec xyz('P1'); 
exec xyz('P2'); 
exec xyz('P3'); 

需要1个小时的50M行 任何人都可以解释为什么它的发生平行运行 类似。

+0

没有关于您的实际情况的具体信息,所以不可能知道答案。但是,我仍然喜欢这个问题,因为它一般会进行修改,它会在比实际问题更广泛的范围内寻找真相。 –

回答

1

据我所知,您的期望是100分钟所需的时间为100 *单个分区所需的时间,即100 * 3分钟= 300分钟= 5小时。相反,整个任务只需要1小时50分钟。

第一个问题是分区的大小是否相等。也许有一些小分区,这可以解释你刚刚描述的行为。

此外,给定分区上的执行时间很大程度上取决于您的存储过程实际执行的操作。例如,它可能包含大量选择,在一些分区中将大量数据填充到内存中(这需要花费很多时间),而其他分区则以更快的方式执行它,因为记录在写入内容之前被过滤掉记忆。

此外,存储过程可能包含写入操作(插入,更新,删除),这些操作非常耗时,特别是如果它们影响很多记录。受影响的记录在分区间的分布很不均匀,因此不同分区中的执行时间可能会有所不同。

例如,如果您在每个分区中有大约500k条记录,并且您的存储过程通过条件选择记录并针对符合条件的条目执行给定更新,那么很有可能发现和受影响的数量记录将在不同的分区中有所不同。

或者分区分布在具有不同滞后或不同属性的服务器上,这会影响总时间。或者服务器也在做一些其他的工作,这会以伪随机的方式增加执行时间。

+0

我的期望是,这必须在3分钟内完成,因为1需要3分钟才能完成一个分区,并且我通过并行不同的会话运行全部100个分区。所有的分区几乎都是相同的大小。 – Sparsh

+0

@Sparsh运行100个线程期望性能提高100倍是不现实的。我不确定最终数字应该是多少,但是不要期望X线程能够提供X倍的性能。你如何运行平行工作?如果您使用的是DBMS_SCHEDULER,那么您可能受到JOB_QUEUE_PROCESSES参数的限制,或者Oracle会根据负载频繁减少预定作业的方式。如果性能是最高优先级,那么您通常希望使用Oracle并行语句,并让Oracle执行并行操作,而不是创建自己的作业。 –

+0

@Sparsh我误解了这个问题。我以为你出于某种原因顺序运行存储过程。如果您并行运行作业而不是按顺序运行,您可以获得更好的性能,但是,同时运行的许多线程会大大增加服务器负担。如果这将在100台不同的计算机上执行,则您的假设或多或少都有效。由于你的情况很可能不同,因此你所经历的行为很有可能。 –