負是一組操作其中,第二個查詢的結果遠離第一個,也會刪除重複項,如果它們出現在第一個集合中。 因此,顯示的查詢將始終必須從TABLE_1構建完整的結果集,然後才能將其返回給用戶。
如果你可以肯定的是有在第一組trimemd頭/生效之日起不重複(或你不希望這樣的重複刪除),你可以嘗試
SELECT RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
FROM TABLE_1 A
WHERE A.TYPE_OF_ACTION='6'
AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
AND NOT EXISTS
(select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = RTRIM(LTRIM(a.head))
and b.effective_date = a.effective_date))
這種方式查詢可以更快地開始返回結果,特別是如果table_2非常小或者可以通過effective_date或head上的索引來訪問行。
PS。如果可以,請刪除RTRIM(LTRIM())位。
PPS。仍然不能保證它會在8秒內返回。這取決於table_1的大小,以及type_of_action和/或effective_date的索引。
補充:
你可以通過遊標
SELECT RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
FROM TABLE_1 A
WHERE A.TYPE_OF_ACTION='6'
AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
,並忽略行,如果它返回
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
但肯定會需要更長的時間來完全執行。根據每次table_2檢查需要多長時間,可能會延長數小時(即小時)。不完全確定截斷時使用的標準(調用持續時間或打開的SQL遊標的持續時間),因此它可能會關閉外部遊標。根據table_1的大小/索引/內容,外部遊標可能仍然不會返回時間範圍內的第一行。
table_1,table_2中的行數和可用的索引數?
但它不能使用遊標來完成? – Omnipresent 2010-03-23 14:07:59