我正在使用大型機Db2。它是一個患者數據庫。我的要求是從3個表中獲取不同的信息,TABACC,TABPAY和TABINS。 TABACC將始終有一排病人,但TABPAY和TABINS可能會或可能不會在系統中爲病人排隊。左外連接與個別查詢DB2
哪一個會更有效率,TABACC上的查詢可以通過左外連接來選擇TABPAY和TABINS 或三個不同的查詢,每個TABACC,TABPAY和TABINS一個。
我正在使用大型機Db2。它是一個患者數據庫。我的要求是從3個表中獲取不同的信息,TABACC,TABPAY和TABINS。 TABACC將始終有一排病人,但TABPAY和TABINS可能會或可能不會在系統中爲病人排隊。左外連接與個別查詢DB2
哪一個會更有效率,TABACC上的查詢可以通過左外連接來選擇TABPAY和TABINS 或三個不同的查詢,每個TABACC,TABPAY和TABINS一個。
這取決於。
如果您所做的只是從三個表中拉回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解決方案如何實現它。
我想OP是詢問關於一個SQL查詢與兩個連接vs單獨的sql問題。根本沒有原生COBOL io。 – 2014-09-02 14:22:08
是的,你可能是對的。但是如果最初有一個純粹的COBOL進程和三個本地I/O,它並不會讓我感到驚訝。所以我會在那裏留下我的答案。 – Charles 2014-09-02 14:48:42
謝謝@Charles。這是我正在尋找的。 – user3104950 2014-09-04 07:39:46
你可以簡單地放在一起。 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;
是的,我知道我可以像你提到的那樣寫一個查詢。但是我的問題是,在速度方面它會比編寫3個不同的查詢並將它們的輸出結合在一起更有效。由於在COBOL中,我可以獲取並保存變量中的數據,然後將它們一起寫入文件中。 – user3104950 2014-09-02 09:58:41
我會爲連接而不是三個SQL – SriniV 2014-09-02 10:13:45
如果要在其上加入被索引則認爲是更有效的方法列。
即使它們沒有編入索引,然後加入最有可能更有效。 – 2014-09-02 11:59:07
你是否意識到病人意味着不止一件事?除非您可以從TABACC得知沒有關於TABPAY和TABINS的數據,否則JOIN可能會更有效。設置一個小程序並對其進行測試。 – 2014-09-02 12:31:00
我需要從商店買到牛奶,雞蛋和麪包。購買包包,去商店,一次購買所有三件物品,或者分三次到商店,每件物品都取回一件物品,會更有效率嗎? – 2014-09-02 15:03:45