我正在使用Mainframe Db2。它是一个患者数据库。我的要求是从3个表,TABACC,TABPAY和TABINS中获取不同的信息。 TABACC将始终为患者排队,但TABPAY和TABINS可能会或可能没有系统中的患者。
哪个效率更高,TABACC上的QUERY,LEFT OUTER JOIN到TABPAY和TABINS 或三个不同的查询,每个TABACC,TABPAY和TABINS一个。
答案 0 :(得分:0)
你可以简单地说。如果没有找到行,TB3,TB4将返回NULL
SELECT TB1.COL1,
TB2.COL4,
TB3.COL5,
TB4.COL6
FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY
LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY
LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY;
答案 1 :(得分:0)
如果您要加入的列被编入索引,那么这是更有效的方法。
答案 2 :(得分:0)
取决于。
如果您所做的只是从三个表中撤回1行数据,那么很难击败COBOL的随机读取。只需要更少的开销。 SQL并不神奇。
但你提到写出一个文件。因此,假设您从这些文件中撤回100,1,000或甚至数百万行并将其输出到新文件。
而不是逐行工作,这是COBOL唯一的选项,在使用SQL时经常使用。您可以使用SQL
中的整个集合insert into newtable
(SELECT TB1.COL1,
TB2.COL4,
TB3.COL5,
TB4.COL6
FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY
LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY
LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY)
现在SQL解决方案应该更快,更快。
SQL的关键是集合思考。如果你是逐行做某事(也就是使用光标),你可能(但并不总是)做错了。
您不能简单地从COBOL的本机I / O更改为SQL,并期望获得更好的性能。实际上会更糟。
最后,考虑输出文件的用途。如果您要将数据导出到外部系统,那么您已经完成了很多工作。但如果您正在为另一个COBOL程序编写工作文件来处理......那么您可能有机会获得更多改进。查看整个过程,考虑整体上做了什么以及基于集合的SQL解决方案如何做到这一点。