2016-08-17 74 views
2

我有一個DB2數據源和一個Oracle 12c目標。 Oracle有一個指向正在工作的DB2的DB鏈接。Oracle DB鏈接 - where子句評估

現在我在DB2中有一個巨大的表,其中有一個用於更改行的時間戳列(讓我們稱之爲ROW_CHANGED)。我想要檢索在特定時間後更改的行。

上的DB2運行

SELECT * FROM lib.tbl WHERE ROW_CHANGED >'2016-08-01 10:00:00'

約1小時後正好返回1行90秒,這很好。

現在,我嘗試從Oracle相同的查詢通過數據庫鏈接:

SELECT * FROM [email protected]_name WHERE ROW_CHANGED >TO_TIMESTAMP('2016-08-01 10:00:00')

這會運行小時,超時結束。 我閱讀了一些Oracle文檔,發現了分佈式查詢優化技巧,但其中大多數提到將本地連接到遠程表,這不是我的情況。

在我的絕望中,我嘗試過DRIVING_SITE提示,但沒有效果。

現在我想知道WHERE部分的查詢將被評估。由於我必須使用Oracle語法而不是查詢的DB2語法,是否有可能Oracle會嘗試先複製整個表並在之後應用where子句?我做了一些研究,但沒有找到任何有助於我朝這個方向發展的事情。

ROW_CHANGED是DB2中的一個隱藏列,如果這很重要的話。

Thx任何提示提前。

更新

感謝@所有的幫助。我會分享一下我的訣竅。

首先,我使用了TO_TIMESTAMP,因爲DB2列也是Timestamp(不是日期),而且我期望通過這個來避開隱式轉換。 沒有明確的轉換,我碰到了ORA-28534: Heterogeneous Services preprocessing error,我沒有希望在合理的時間內觸摸數據庫配置。

解釋計劃btw並沒有帶來太多。它顯示了一個完整的提示,並且沒有對謂詞進行轉換。事實上,它顯示ROW_CHANGED列爲Date,我不知道爲什麼。

我試過賈斯汀建議使用綁定變量,但是我又得到了ORA-28534。接下來我做的是將它包裝到一個pl/sql塊(稍後將在SP中運行)。

declare 
v_tmstmp TIMESTAMP := 01.08.16 10:00:00; 
begin 

INSERT INTO ORAUSER.TMP_TBL (SRC_PK,ROW_CHANGED) 
SELECT SRC_PK,ROW_CHANGED 
FROM [email protected]_name 
WHERE ROW_CHANGED > v_tmstmp; 
end; 

這與DB2本身的執行時間相同。日期格式爲DD.MM.YY,因爲它是不幸的默認值。 將變量賦值更改爲

v_tmstmp TIMESTAMP := TO_TIMESTAMP('01.08.16 10:00:00','DD.MM.YY HH24:MI:SS'); 

我得到了和以前一樣的問題。

與此同時,DB2操作員在當天早些時候請求的ROW_CHANGED列中創建了一個索引。這似乎解決了一般問題。即使我原來的查詢現在也很快完成。

+0

這兩個查詢之間唯一的區別似乎很可能是:TO_TIMESTAMP()函數。不熟悉數據庫鏈接,但我不明白你爲什麼需要這個? – 2016-08-17 14:49:33

+0

我沒有要測試的DB2實例,但看起來數據類型不同,可能導致DB2數據和/或全表掃描的隱式轉換。是否使用'TO_DATE('2016-08-01 10:00:00','YYYY-MM-DD HH24:MI:SS')'而不是幫助? –

+1

添加鏈接版本的執行計劃可能很有用;特別是謂詞信息,以查看它是否正在調用針對DB2表列的函數。 –

回答

1

如果您實際使用特定於Oracle的轉換函數(如to_timestamp),則會強制在Oracle端評估謂詞。 Oracle不會知道如何將諸如to_timestamp之類的內置函數轉換爲DB2中完全等效的函數調用。

如果您使用了一個綁定變量,那麼在DB2端更有可能進行評估。但是,這可能因不同數據庫之間的數據類型映射而變得複雜 - 在一個引擎的date與另一個引擎的timestamp數據類型之間可能沒有完美的映射。如果這是一個數字列,綁定變量幾乎肯定會被推送。在這種情況下,可能需要花費一點時間才能找出適用於您的框架,Oracle和DB2的變量的確切數據類型。

如果使用綁定變量不起作用,則可以使用dbms_hs_passthrough package強制在遠程服務器上評估謂詞。這使您可以逐字地向遠程服務器發送查詢,從而允許您執行DB2數據庫中定義的使用函數等功能。希望這種情況有點矯枉過正,但如果簡單的解決方案不能很快地工作,那麼將錘子作爲備份是很好的。

+0

這讓我走上了正軌,所以我將它標記爲答案。似乎綁定變量將工作,但可能需要在連接器配置中調整(在我的情況下,ODBC) –