oracle 索引使用 問題解答

2021-06-25 23:31:09 字數 1358 閱讀 9090

1,建立索引一定會減少查詢時間嗎?也就是提高查詢效率   2,乙個系統,你使用了一年後,系統響應突然變慢了,請分析變慢的原因   3,有乙個很大的表,建立索引一般需要注意些什麼,在什麼字段合理??  

1.建立索引的目的是為了加速查詢速度,按照b*tree索引的原理,索引樹表裡最後一級儲存的一定是記錄的唯一id,

因此我們根據索引查詢時,會先去索引表中查詢到符合條件的記錄id,然後再根據記錄id在資料表根據找到的符合條件的記錄對應的block,

因為根據唯一id查詢資料會迅速定位至相應的記錄所在的block,不需要掃瞄所有的資料表的block,因此會很快速的定位到記錄的資訊;

但如果查詢結果資料量很大(超過資料記錄的85%),則因此查詢索引表也需要消耗一定的時間,再加上查詢資料表的時間,反而會降低根據索引查詢的效能。

這也是oracle為什麼在原來基於索引規則查詢的基礎上,增加了cbo(基於成本)查詢的原因!oracle會根據提前對索引的資料記錄數進行收集,

對索引的資料值建立直方圖,直方圖用以確定索引值對應範圍在整個資料記錄值佔的比重;然後根據查詢的值所佔的所有記錄的比重來計算一下是走索引還是走全表掃瞄.

2.影響資料庫變慢的原因很多種,主要有以下幾類:

(1)硬體問題,cpu ,記憶體,磁碟等;

(2)返回的結果集過大的問題;

(3)db_area_size命中率過低的問題;

(4)索引收集的資料不準確的問題;

(5)sql使用了過多的動態sql也會影響資料查詢效能;

(1)其中硬體方面的問題, 一般都是加大記憶體的處理方頭法;

(2)而返回的結果集過大主要針對某乙個或某幾個sql的問題,將返回的結果集盡量的減小;

(3)針對db_area_size過小的問題主要還是因為結果集過大或所有的結果集過於分散,無法在記憶體中長時間儲存,這樣的話可以增加db_area_size的大小,

可以讓更多的結果集block儲存在記憶體中,而不需要去頻繁的訪問磁碟讀取資料;

(4)索引收集的問題主要原因是由於頻繁的插入、更新、刪除資料後,相應的索引收集的資料可能會有大的差別,這樣可能需要走索引的也走了全表掃瞄,或相反,這時需要對索引重新收集,生成新的直

方圖,以使查詢選擇正常的查詢路徑;

(5)不要過多的使用動態sql,或者說不允許使用動態sql,因為過多的動態sql,會頻繁的更新shared area中的sql的解析結果和執行計畫;造成需要頻繁的對

sql進行解析並生成新的執行路徑等;

3.在大表上建立索引時,不要在頻繁進行查詢的列並且返回過多結果集的列上建立索引,因為這樣的索引沒有意義,只會加重插入、更新、刪除操作的負擔;

不要在值很分散的列上建立bitmap索引,因為bitmap索引會在做更新、插入、刪除操作時,鎖住全表;這樣對查詢無意義並且會嚴重影響日常的操作效能。

oracle 索引使用面試問題解答

1,建立索引一定會減少查詢時間嗎?也就是提高查詢效率 2,乙個系統,你使用了一年後,系統響應 突然變慢了,請分析變慢的原因 3,有乙個很大的表,建立索引一般需要注意些什麼,在什麼字段合理?1.建立索引的目的是為了加速查詢速度,按照b tree索引的原理,索引樹表裡最後一級儲存的一定是記錄的唯一id,...

gridview問題解答

這樣寫 printisopen convert.toboolean datebinder.eval container.dataitem,isopen cs 是這樣的 public string printisopen bool bisopen else return strhhtml 或者說是這樣...

gridview問題解答

這樣寫 printisopen convert.toboolean datebinder.eval container.dataitem,isopen cs 是這樣的 public string printisopen bool bisopen else return strhhtml 或者說是這樣...