我剛剛遇到一些奇怪的性能差異。兩個非常相似的選擇語句不同的性能
我有兩個選擇:
SELECT s.dwh_end_date,
t.*,
'-1' as PROMOTION_DROP_EMP_CODE,
trunc(sysdate +1) as PROMOTION_END_DATE,
'K01' as PROMOTION_DROP_REASON,
-1 as PROMOTION_DROP_WO_NUMBER
FROM STG_PROMO_EXPIRE_DATE t
INNER JOIN fct_customer_services s
ON(t.dwh_product_key = s.dwh_product_key)
這需要大約20秒。
這一個:
SELECT s.dwh_end_date,
s.dwh_product_key,
s.promotion_expire_date,
s.PROMOTION_DROP_EMP_CODE,
s.PROMOTION_END_DATE,
s.PROMOTION_DROP_REASON,
s.PROMOTION_DROP_WO_NUMBER
FROM STG_PROMO_EXPIRE_DATE t
INNER JOIN fct_customer_services s
ON(t.dwh_product_key = s.dwh_product_key)
這大約需要400秒
他們基本上是相同的 - 它只是,以確保我已經更新了我的數據正確(第一選擇是更新FCT表)第二選擇,以確保每件事情都正確更新。
這兩個選擇之間的唯一區別是我選擇的列。 (STG表有兩列 - dwh_p_key和prom_expire_date)?
什麼可能導致此怪異的行爲..
的FCT表建立索引UNIQUE(dwh_product_key,dwh_end_date)和按dwh_end_date(2.5億條記錄)分區,STG沒有任何索引(及其僅有的15k條記錄)
在此先感謝。
請粘貼解釋計劃,並沒有圖像 –
那些時間是返回所有行還是僅返回結果的第一頁?如果您重複運行兩個查詢,它們是否一致?或者您是否正在看到塊緩存的效果?並且這些計劃是*不相同的,再次查看底部的兩行以及字節值。索引全掃描與全表掃描是一個重要的區別。 –
@AlexPoole你是對的,沒有用我的眼睛看到它..是的,他們反覆,無論我運行多少次這些結果..爲什麼這種戲劇性的差異發生? – Yossi