2014-09-02 234 views
0

我正在使用大型机Db2。它是一个患者数据库。我的要求是从3个表中获取不同的信息,TABACC,TABPAY和TABINS。 TABACC将始终有一排病人,但TABPAY和TABINS可能会或可能不会在系统中为病人排队。左外连接与个别查询DB2

哪一个会更有效率,TABACC上的查询可以通过左外连接来选择TABPAY和TABINS 或三个不同的查询,每个TABACC,TABPAY和TABINS一个。

+0

你是否意识到病人意味着不止一件事?除非您可以从TABACC得知没有关于TABPAY和TABINS的数据,否则JOIN可能会更有效。设置一个小程序并对其进行测试。 – 2014-09-02 12:31:00

+1

我需要从商店买到牛奶,鸡蛋和面包。购买包包,去商店,一次购买所有三件物品,或者分三次到商店,每件物品都取回一件物品,会更有效率吗? – 2014-09-02 15:03:45

回答

0

这取决于。

如果您所做的只是从三个表中拉回1行数据,那么很难击败COBOL的随机读取。只有更少的开销。 SQL并不神奇。

但你提到写出一个文件。因此,我们假设您从这些文件中拉出100个,1000个甚至数百万行并将它们输出到一个新文件。

而不是逐行工作,这是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解决方案如何实现它。

+0

我想OP是询问关于一个SQL查询与两个连接vs单独的sql问题。根本没有原生COBOL io。 – 2014-09-02 14:22:08

+0

是的,你可能是对的。但是如果最初有一个纯粹的COBOL进程和三个本地I/O,它并不会让我感到惊讶。所以我会在那里留下我的答案。 – Charles 2014-09-02 14:48:42

+0

谢谢@Charles。这是我正在寻找的。 – user3104950 2014-09-04 07:39:46

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; 
+0

是的,我知道我可以像你提到的那样写一个查询。但是我的问题是,在速度方面它会比编写3个不同的查询并将它们的输出结合在一起更有效。由于在COBOL中,我可以获取并保存变量中的数据,然后将它们一起写入文件中。 – user3104950 2014-09-02 09:58:41

+1

我会为连接而不是三个SQL – SriniV 2014-09-02 10:13:45

0

如果要在其上加入被索引则认为是更有效的方法列。

+1

即使它们没有编入索引,然后加入最有可能更有效。 – 2014-09-02 11:59:07