oracle大資料表 如何建立索引

2021-04-02 20:24:06 字數 2430 閱讀 8645

大資料表,按某欄位t(varchar型的時間字段)分割槽,乙個月乙個分割槽。有常用業務欄位a和b(其它欄位並不重要),欄位a值的重複率不高,b的重複率稍高。建有索引1:a,組合索引2:t,b。

對該錶的常用查詢有兩種:通過條件t、a查詢,通過條件t、b查詢。

原來應用一直正常,近期由於其它分割槽表查詢索引選擇策略不優化的問題,對所有大資料表的分割槽表進行資料分析(1%抽樣,對資料和索引進行分析),促使oracle選用正確的更合適的索引。分析後,其它表的問題解決,但這個表分析後查詢速度反面大幅下降。

檢視資料庫查詢的計畫,對條件t、a進行查詢時(select * from talbe where t between someday and anotherday and a=something order by t desc),當t的範圍在乙個月分割槽時,選用索引1,速度在一秒以內,在t範圍跨月時,系統選擇索引2,速度很慢,要10幾秒甚至更多,通過sql語句強制使用索引1,速度很快,在一秒以內。

問題處理及疑問:

1、以為索引1沒帶時間資訊,造成跨分割槽查詢時選擇了不夠優化的索引,於是增加一索引3(t, a),重新進行資料分析,但資料庫仍沒有選擇更優的索引,強制使用索引3,發現還沒有原索引1快(4秒多)(這是個疑問1,理論上更快的索引反而速度慢,而且慢好幾秒)。

2、把索引1修改為全域性索引(原為分割槽索引),問題仍未解決。

3、經過一番折騰,發現有索引3時,把where條件中的order by t desc的desc去掉,資料庫就能選擇索引3的索引。(這是疑問2,desc對索引選擇策略有什麼影響,在這裡的影響是偶然還是必然?)

4、乙個類似的表,有類似的t/a/b欄位以及類似的索引2、索引3,當時速度慢,選擇的是不優化的索引,就是通過對錶進行資料分析,讓資料庫選擇了較優化的索引,但同樣的方法使用到這個表反而引起了問題,情況正相反(這是疑問3,資料分析的後果不確定嘛?)

5、這個表資料分析後發生了慢的問題,於是採用delete分析結果的方法進行回退,但回退後資料庫仍選擇「錯誤」的索引(這是疑問4,為什麼回退失敗?資料庫的查詢計畫和分析結果到底有什麼關係?)

6、應用的sql語句是個組合查詢,條件語句是拼出來的,如果在sql中直接指定索引,一來應用實現起來很麻煩(要根據不同的組合條件拼前面的指定索引語句),二來應用的資料庫依賴性增強。除了改應用,到底可不可以通過對分割槽資料表進行定時分析的方法確保資料庫選擇更優的索引?資料庫對分割槽表的索引選擇策略到底有沒有固定可循的原則?(這是疑問5)

為什麼oracle不自動做analyze?

如果analyze的利大於弊的話,為什麼oracle不自己做?它完全可以做到實時的/定時的(排程表)/策略的(系統非繁忙時/資料量變化到一定程度時)。我認為oracle不自動去做是與設計思想有關的,它追求盡量的穩妥,同時也讓使用者自己去承擔analyze的風險(有點不負責任吧,它在文件中也幾乎沒有提及作analyze的風險)。

analyze 的風險:

先來看兩個極端的例子:

例1,假設現有系統已經是最優系統,那麼在作了analyze後,最好的情況是系統效率沒有變化,即收益為0。正常的情況是某些原本最佳化的sql, 在analyze後由於cost的變化,oracle內部優化器選擇了乙個不同原先最佳的執行計畫的新執行計畫,效能反而下降了,或者說收益<0。

結論:對於最佳系統,作analyze後的總體收益<=0。

例2,假設現有系統為最差系統,那麼在作了analyze後,最壞的情況是系統效率沒有變化,即收益為0。正常的情況是某些原本最差的sql,在analyze後由於cost的變化,oracle內部優化器選擇了乙個不同原先最差的執行計畫的新執行計畫,效能上公升了,或者說收益》0。

結論:對於最差系統,作analyze後的總體收益》=0。

那麼對於正常的系統--介於最佳和最差系統之間的系統,作analyze後的情況會是什麼樣呢?收益:a.原先效能很差的sql效能提高了。b.一部分效能不錯的sql,效能又再一步提高了(少數)。損失:a.一部分效能很差的sql,效能更差了(少數)。b.一部分效能不錯的sql,效能下降了--------注意這一點。

結論:對於正常系統,作analyze後的收益不可知!!!!!!!!!!!!!

正是這個不可知產生了風險。對於乙個生產系統,在作analyze前,你可以明確的知道瓶頸在那裡(雖然系統效能在逐漸下降中),但在analyze後,你只能祈求上帝了,因為你根本不知道什麼地方性能會下降,什麼地方性能會上公升(系統效能產生了不可預知的急劇變化)。假設只有一條sql的效能下降了,999條效能提高了,那麼你的系統的效能提高了嗎?未必,下降的那條可能每天需要執行幾千萬次:),整體效能可能還是下降了。想看效能下降的例子?請看 http://www.itpub.net/showthread.php?s=&threadid=27994

總結:作analyze的風險在於你不知道analyze後,那一部分的效能會提高,那一部分的效能會下降,也不知道整體的效能會下降還是提高。或者說作analyze會把系統效能推入乙個不可預知的狀態。

現在你知道為什麼oracle不自動作analyze了吧:)

建立資料表

語法 create table 表名 欄位名稱 字段型別 字段特徵 是否為null,預設值 標識列 主鍵 唯一鍵 外來鍵 check約束 欄位名稱 字段型別 字段特徵 是否為null,預設值 標識列 主鍵 唯一鍵 外來鍵 check約束 建立老師表teacher id name gender age...

建立資料表

class users models.model uphone models.charfield max length 20,verbose name 號碼 upwd models.charfield max length 20,verbose name 密碼 uemail models.email...

建立資料表

一 資料表 1 資料表 或表 是資料庫最重要的組成部分之一,是其他物件的基礎 2 表是乙個二維表,行稱為 記錄 列稱為 字段 二 建立資料表 1 首先開啟資料庫 資料庫要存在 show databases 檢視當前所有的資料庫 use 資料庫名稱 開啟指定資料庫 select databases 顯...