【问题标题】:Netezza stored procedure runNetezza 存储过程运行
【发布时间】:2016-04-04 04:59:12
【问题描述】:

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

【问题讨论】:

    标签: stored-procedures parallel-processing netezza nzsql


    【解决方案1】:

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

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

    您可以阅读更多关于它的信息here。

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

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

    【讨论】:

      【解决方案2】:

      可序列化

      如果存储过程不影响相同的表,那么您可以从 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        相关资源
        最近更新 更多