2012-10-03 28 views
2

我有兩個查詢,其中一個涉及查詢中的分區表,而另一個查詢是相同的,只是它涉及非分區等效表。原始(非分區表)查詢的性能優於分區對應部分。我不確定如何爲此隔離問題。查看執行計劃,我發現所使用的索引與兩個查詢相同,並且新查詢在其執行計劃中顯示PARTITION RANGE子句,表示正在進行分區修剪。該查詢是以下形式的: -性能調優 - 在分區表與非分區表上的查詢

Select rownum, <some columns> 
from partTabA 
inner join tabB on condition1 
inner join tabC on condition2 
where partTabA.column1=<value> and <other conditions> 
and partTabA.column2 in (select columns from tabD where conditions) 

其中partTabA是分區表和partTabA.column1是分區鍵(範圍分區)。在原始查詢中,這被替換爲同一個表的非分區等價物。我應該查看哪些參數以查明新查詢執行得不好的原因。我擁有的工具是Oracle SQL Developer。

回答

1

我相信你正在處理分區開銷,如果你有分區表,那麼oracle必須先找到要掃描的分區。

你可以在這裏粘貼兩個執行計劃嗎?桌子有多大?這裏使用的索引有多選擇性?

您是否嘗試收集統計信息?

您也可以嘗試查看跟蹤文件以查看發生了什麼。

+0

我注意到的一個區別是非分區表訪問是通過PK上的非唯一索引進行的,在分區表上,通過PK上的唯一索引(本地索引)進行訪問。 – Ajay

2

PARTITION RANGE ITERATOR並不一定意味着正在進行分區修剪。 您也可以在解釋計劃中查看PstartPstop,查看正在使用的分區。

雖然分區查詢讀取的數據相同,但分區查詢速度會比較慢,這可能有幾個原因。 (假設分配查詢不正確修剪,並且從整個表讀取。)

  1. 來自多個本地索引讀數可以低於來自單次,指數越大,讀取效率要低得多。
  2. 從大的初始段大小,大量的分區等可能有很多浪費的空間。比較段大小與此:select * from dba_segments where segment_name in ('PARTTABA', 'TABA');如果這是問題,您可能想要查看您的表空間設置,或使用延遲段創建。
+0

它是分區範圍單一。而對於Pstart和PStop來說,它們都是51.如何推斷這一點以及如何糾正這些問題? – Ajay

+0

哦,那麼我的想法都不適用。 :)這聽起來像一個棘手的問題,它可以幫助發佈儘可能多的信息,你可以;解釋計劃,DDL,樣本數據等。 –