我在 netezza 中有 12 个存储过程。我使用 shell 脚本中的 nzsql 命令调用这些过程。我想并行运行这些过程以增加吞吐量。我怎样才能做到这一点?
问问题
1551 次
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 的回答,系统在三种情况下中止事务以保持可序列化性:
update
or语句与同一个表上的delete
另一个update
or语句同时运行。delete
- 两个并发事务,每个事务执行一个
SELECT FROM
和一个INSERT INTO
同一个表。这可以作为一个自插入语句或以任何顺序的多个语句出现。请注意,最多支持 31 个并发插入到同一个表中,前提是不超过其中一个同时从同一个表中选择。 - 两个并发事务,第一个
selects
来自 table1 和updates
,inserts
或deletes
来自 table2,而第二个事务selects
来自 table2 和updates
,inserts
或deletes
来自 table1。
你可以在这里阅读更多关于它的信息。
但是,序列化事务在失败之前可以在队列中,并且系统会自动重试,直到 X 分钟后全部超时,X 由serialization_queue_timeout
系统变量定义。
但是,这仅适用于隐式事务(没有BEGIN
和COMMIT
块的事务),并且大多数存储过程事务都是显式事务(这也是使用存储过程的优势,如果出现故障,一切都会回滚,除非您使用AUTOCOMMIT ON
了放置在存储内某处的选项过程),它不会让你利用序列化队列。
于 2017-03-13T17:09:38.900 回答