我在netezza中有12个存储过程。我使用shell脚本中的nzsql命令调用这些过程。我想要并行运行这些程序以提高吞吐量。我怎样才能做到这一点?Netezza存储过程运行
0
A
回答
1
序列化
如果存储过程不影响相同的表,那么你可以从叉猛砸电话:
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。
0
为了详细说明@Jeremy财富的回答,有三种情况,其中系统中止交易,以保持串行化:
- 一个
update
或delete
语句与在另一update
或delete
声明同时运行同一张桌子。 - 两个并发事务,每个执行一个
SELECT FROM
和一个INSERT INTO
相同的表。这可以以任何顺序作为自插入语句或多个语句来发生。请注意,支持多达31个同时插入同一个表,只要其中不超过一个同时从同一个表中选择。 - 两个并发事务,其中第一个
selects
从表1和updates
,inserts
或deletes
从表2的同时从表2和updates
,从表1 或inserts
deletes
第二事务selects
。
您可以阅读更多关于它here。
但是,序列化事务可以在发生故障前排队,系统会自动重试,直到X分钟后所有超时为止,X由系统变量serialization_queue_timeout
定义。
然而,这仅适用于隐性交易(不BEGIN
和COMMIT
块交易),而且大多数存储过程的交易是明确的交易(这也是优势,使用存储过程中,一切都被回滚如果事情失败,除非您使用AUTOCOMMIT ON
选项置于存储过程中的某个位置),这将不会让您利用序列化队列。
相关问题
- 1. Netezza存储过程错误
- 2. 从SAS调用Netezza存储过程
- 3. 运行存储过程
- 4. 安排存储过程定期运行?
- 5. 为什么存储过程不运行?
- 6. SQL存储过程自动运行
- 7. SSIS包 - 运行存储过程
- 8. 获得当运行存储过程
- 9. 从SQL Server运行PostgreSQL存储过程
- 10. 在SQL Developer中运行存储过程?
- 11. 运行SQL Server存储过程(更新)
- 12. oracle - 运行存储过程从脚本
- 13. 运行存储过程在阵列
- 14. 运行时,这个存储过程
- 15. 从Excel运行存储过程
- 16. 运行查询Oracle存储过程
- 17. 运行存储过程从访问VBA
- 18. 如何访问Netezza存储过程中的参数?
- 19. 当在SSMS上运行存储过程但在SQLCMD上运行存储过程时出现“列无效”错误
- 20. 从SQL Server存储过程执行Oracle存储过程
- 21. 在另一个存储过程中未执行存储过程
- 22. 在存储过程中执行存储过程
- 23. 执行另一个存储过程的存储过程
- 24. 执行SQL存储过程
- 25. 当执行存储过程
- 26. 存储过程和银行
- 27. 在多线程进程中运行存储过程
- 28. 即使存在错误,也要保持存储过程运行
- 29. 每次运行报告时如何执行存储过程?
- 30. PostgreSQL是否允许并行运行存储过程?