2015-12-30 125 views
0

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

回答

1

序列化

如果存储过程不影响相同的表,那么你可以从叉猛砸电话:

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

0

为了详细说明@Jeremy财富的回答,有三种情况,其中系统中止交易,以保持串行化:

  • 一个updatedelete语句与在另一 updatedelete声明同时运行同一张桌子。
  • 两个并发事务,每个执行一个SELECT FROM和一个 INSERT INTO相同的表。这可以以任何顺序作为自插入语句或多个语句来发生。请注意,支持多达31个同时插入同一个表,只要其中不超过一个同时从同一个表中选择。
  • 两个并发事务,其中第一个selects从表1和 updatesinsertsdeletes从表2的同时从表2和updates,从表1 或insertsdeletes第二事务selects

您可以阅读更多关于它here

但是,序列化事务可以在发生故障前排队,系统会自动重试,直到X分钟后所有超时为止,X由系统变量serialization_queue_timeout定义。

然而,这仅适用于隐性交易(不BEGINCOMMIT块交易),而且大多数存储过程的交易是明确的交易(这也是优势,使用存储过程中,一切都被回滚如果事情失败,除非您使用AUTOCOMMIT ON选项置于存储过程中的某个位置),这将不会让您利用序列化队列