我在netezza中有12个存储过程。我使用shell脚本中的nzsql命令调用这些过程。我想并行运行这些过程以提高吞吐量。我怎么能这样做?
答案 0 :(得分: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
有关serializable isolation level的更多信息,请参阅文档。您将负责确保存储过程正在修改的数据不会以某种方式发生冲突,因为您将获得dirty reads。
答案 1 :(得分:0)
详细说明@Jeremy Fortune的答案,有三种情况下系统会中止交易以保持可串行化:
update
或delete
语句与另一个语句同时运行
同一张桌子上的update
或delete
声明。SELECT FROM
和。{
INSERT INTO
同一张桌子。这可以作为自插入语句或任何顺序的多个语句发生。请注意,支持同一个表中最多31个并发插入,前提是这些表中只有一个也可以从同一个表中进行选择。 selects
来自table2的updates
,inserts
或deletes
,而来自table2和selects
,updates
或inserts
的第二个事务deletes
来自
表1 您可以详细了解here。
然而,序列化事务可以在失败之前处于队列中,并且系统会自动重试,直到X分钟后所有时间超时,X由serialization_queue_timeout
系统变量定义。
但是这仅适用于隐式事务(没有BEGIN
和COMMIT
块的事务),并且大多数存储过程事务都是显式事务(它也是使用存储过程的优势,一切如果某些内容失败,则会回滚,除非您在商店过程中使用了AUTOCOMMIT ON
选项,这不会让您利用序列化队列。