我有一个有100个分区的表, 我有程序,它可以明智地读取数据分区。 假设
如果我执行过程
,P0是1分区 exec xyz('P0');
执行500k行需要3分钟。
但是当我创建100个会话并且并行运行时 类似于不同的会议
exec xyz('P1');
exec xyz('P2');
exec xyz('P3');
50M行需要1小时 任何人都可以解释为什么会发生这种情况。
答案 0 :(得分:1)
据我了解,您的期望是100个分区所需的时间为100 *单个分区所需的时间,即100 * 3分钟= 300分钟= 5小时。而不是那样,整个任务只需要1小时50分钟。
第一个问题是分区的大小是否相等。也许有小分区,这可以解释你刚才描述的行为。
此外,给定分区上的执行时间在很大程度上取决于存储过程实际执行的操作。例如,它可能包含大量选择,在一些分区中将大量数据填充到内存中(这需要花费大量时间),而其他分区以更快的方式执行它,因为在将内容写入之前过滤掉记录存储器中。
此外,存储过程可能包含写操作(插入,更新,删除),这非常耗时,尤其是当它们影响许多记录时。受影响的记录很可能会被记录下来。分区之间的分配不均匀,因此不同分区中的执行时间可能不同。
例如,如果每个分区中有大约500k记录,并且存储过程按条件选择记录并对符合条件的项目执行给定更新,那么找到和受影响的记录的数量很可能很高将在不同的分区中有所不同。
或者分区在具有不同滞后或不同属性的服务器之间分配,这会影响总时间。或者服务器也在做其他一些工作,这会以伪随机的方式增加执行时间。