我有一個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列中創建了一個索引。這似乎解決了一般問題。即使我原來的查詢現在也很快完成。
這兩個查詢之間唯一的區別似乎很可能是:TO_TIMESTAMP()函數。不熟悉數據庫鏈接,但我不明白你爲什麼需要這個? – 2016-08-17 14:49:33
我沒有要測試的DB2實例,但看起來數據類型不同,可能導致DB2數據和/或全表掃描的隱式轉換。是否使用'TO_DATE('2016-08-01 10:00:00','YYYY-MM-DD HH24:MI:SS')'而不是幫助? –
添加鏈接版本的執行計劃可能很有用;特別是謂詞信息,以查看它是否正在調用針對DB2表列的函數。 –