Netezza存储过程运行

时间:2015-12-30 08:35:04

标签: stored-procedures parallel-processing netezza nzsql

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

2 个答案:

答案 0 :(得分:1)

序列化

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

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

other answers about forking

不可序列化

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

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

有关serializable isolation level的更多信息,请参阅文档。您将负责确保存储过程正在修改的数据不会以某种方式发生冲突,因为您将获得dirty reads

答案 1 :(得分:0)

详细说明@Jeremy Fortune的答案,有三种情况下系统会中止交易以保持可串行化:

  • updatedelete语句与另一个语句同时运行 同一张桌子上的updatedelete声明。
  • 两个并发事务,每个事务执行SELECT FROM和。{ INSERT INTO同一张桌子。这可以作为自插入语句或任何顺序的多个语句发生。请注意,支持同一个表中最多31个并发插入,前提是这些表中只有一个也可以从同一个表中进行选择。
  • 两个并发事务,第一个来自table1 selects 来自table2的updatesinsertsdeletes,而来自table2和selectsupdatesinserts的第二个事务deletes来自 表1

您可以详细了解here

然而,序列化事务可以在失败之前处于队列中,并且系统会自动重试,直到X分钟后所有时间超时,X由serialization_queue_timeout系统变量定义。

但是这仅适用于隐式事务(没有BEGINCOMMIT块的事务),并且大多数存储过程事务都是显式事务(它也是使用存储过程的优势,一切如果某些内容失败,则会回滚,除非您在商店过程中使用了AUTOCOMMIT ON选项,这不会让您利用序列化队列