0

我在 netezza 中有 12 个存储过程。我使用 shell 脚本中的 nzsql 命令调用这些过程。我想并行运行这些过程以增加吞吐量。我怎样才能做到这一点?

4

2 回答 2

1

可序列化

如果存储过程不影响相同的表,那么您可以只从 bash 派生调用:

nzsql -Atc "call sp1();" &
nzsql -Atc "call sp2();" &
nzsql -Atc "call sp3();" &
...
wait

请参阅有关分叉的其他答案

不可序列化

如果存储过程影响相同的表,则需要在受影响的连接或事务中设置可串行化。我没有在存储过程中做到这一点(你可能无法做到),但这应该可以:

nzsql -Atc "set serializable = false; call sp1();" &
nzsql -Atc "set serializable = false; call sp2();" &
nzsql -Atc "set serializable = false; call sp3();" &
...
wait

有关可序列化隔离级别的更多信息,请参阅文档。您将负责确保存储过程正在修改的数据不会以某种方式发生冲突,因为您会得到脏读

于 2016-01-01T18:17:53.060 回答
0

为了详细说明@Jeremy Fortune 的回答,系统在三种情况下中止事务以保持可序列化性:

  • updateor语句与同一个表上的delete另一个 updateor语句同时运行。delete
  • 两个并发事务,每个事务执行一个SELECT FROM和一个 INSERT INTO同一个表。这可以作为一个自插入语句或以任何顺序的多个语句出现。请注意,最多支持 31 个并发插入到同一个表中,前提是不超过其中一个同时从同一个表中选择。
  • 两个并发事务,第一个selects来自 table1 和updatesinsertsdeletes来自 table2,而第二个事务selects来自 table2 和updatesinsertsdeletes来自 table1。

你可以在这里阅读更多关于它的信息。

但是,序列化事务在失败之前可以在队列中,并且系统会自动重试,直到 X 分钟后全部超时,X 由serialization_queue_timeout系统变量定义。

但是,这仅适用于隐式事务(没有BEGINCOMMIT块的事务),并且大多数存储过程事务都是显式事务(这也是使用存储过程的优势,如果出现故障,一切都会回滚,除非您使用AUTOCOMMIT ON了放置在存储内某处的选项过程),它不会让你利用序列化队列

于 2017-03-13T17:09:38.900 回答