我有Oracle查詢如下這是正常工作:最有效的方法,以檢查是否存在特定的行數從表
INSERT /*+APPEND*/ INTO historical
SELECT a.* FROM TEMP_DATA a WHERE NOT EXISTS(SELECT 1 FROM historical WHERE KEY=a.KEY)
與查詢,當我運行解釋計劃,我注意到,優化程序選擇一個HASH JOIN
計劃和成本是相當低的
但是有地指出,在歷史表中存在可以檢查對TEMP_DATA
表中有多少行一個新的請求,因此該查詢更改爲:
INSERT /*+APPEND*/ INTO historical
SELECT a.* FROM TEMP_DATA a WHERE (SELECT COUNT(1) FROM historical WHERE KEY=a.KEY) < 2
這意味着如果給定鍵(不是主鍵)的歷史數據中存在1行記錄,仍然可以插入數據。
但是用這種方法,查詢速度變慢了很多,成本是原始成本的10倍以上。我也注意到,優化器現在選擇一個NESTED LOOP
計劃。
請注意,歷史表是包含索引的分區表。
有反正我可以優化這個嗎?
謝謝。
你有'歷史(關鍵)'的索引嗎? –
如果歷史表是分區的並且有索引,則解釋計劃應該顯示分區和索引掃描的使用。 –
是的,歷史表上的索引很少,包括關鍵字。分區是使用日期列完成的。 – ipohfly