oracle實體體系結構圖如上:
pga——>sga+程序——>資料庫
一、select object_name from t where object_id=29(執行過程分析)
1、在pga(發起使用者使用的私有記憶體空間)中檢查是否有該查詢的使用者連接配接和權限資訊,如果有,則直接使用,不用去硬碟中讀取。此外若能放下排序規則,此處也可以進行排序
2、在共享池查詢什麼地方有存儲過這個sql指令的***(唯一的hash值),如果沒有,先檢查該語句的文法語義等,如果沒問題,生成它的唯一hash值,存儲下來
3、解析:eg:用全表掃描還是索引,哪個更高效,決定後該執行計劃存儲下來,并和生成的hash值組成一對
4、去資料緩沖區拿資料,如果沒拿到,去資料庫的資料檔案中拿數,傳回給資料緩沖區
二、執行計劃
結果中出現的主要屬性:recurslve calls:遞歸調用 consistent gets:邏輯讀 physical reads:實體讀。但看性能主要還是得看cost和時間
三、update t set objec_id=92 where object_id=29
1、2、3、4和上面一樣,
5、先做好鏡像到復原檔案,以便rollcack,在緩沖區修改資料,commit後不一定及時寫到資料庫,是通過dbwr程序寫入資料庫(ckpt适時調 用dbwr程序)
6、日志緩沖區儲存了資料庫相關操作的日志,在commit時,lgwr程序先把日志緩沖區記錄的日志寫入磁盤的日志檔案,以便redo
7、日志檔案循環寫入,如果滿了,先備份成歸檔檔案arch再去寫,此外,arch檔案也需要定時轉移到新的存儲媒體
四、一緻性讀
scn:system change number
oracle在做一緻讀時,首先看發起的scn是否大于目前查詢塊的scn,如果小于,毫無疑問從復原段擷取鏡像資料,如果scn大于目前查詢塊的scn,還要確定該塊沒有活動事務,否則還要去鏡像查找。
五、提升速度
1、綁定變量:eg:循環插入資料時,共享池編譯一次即可
六、邏輯體系結構
資料庫(database)包含多個表空間(tablespace),一個表空間包含多個段(segment),一個段包含多個區(extent),一個區包含多個塊(block).
eg:在一片草原上,财主出租土地給老黃、老劉、老李等用于養動物,比如豬羊兔子等。
一般而言,一張表是一個段,但并不是絕對的,例如表包含lob類型列,那麼lob至少會有兩個段,資料段和索引段,如表有分區,則每個分區又都獨立成段。
表空間大概分類:系統表空間、臨時表空間、復原表空間、資料表空間。
pctfree:block屬性,調整pctfree設定block預留白間大小,eg:男生宿舍住人的問題
七、表分類
普通表、全局臨時表、分區表(獨立的邏輯表,但是底層由多個實體子表實作。分庫分表是在應用層做的,而分區表是資料庫自身做的,原理一樣)、索引組織表、簇表
普通表的缺陷:
1、無論删除、插入還是修改,都會産生日志(用于redo,但在不需要日志的情況下是缺陷)
2、delete開銷大,無法釋放空間
3、表記錄太大檢索較慢:一張表其實是一個段,一般情況下,需要周遊段的所有block完成,如何提升呢?縮短通路路徑即通路的block個數越少越好。兩種技術:索引技術、分區表。
分區表:eg:原本一個表根據年月拆成12個小表即小段。
索引技術:當建立一張表時,産生一個表segment,在表列上建索引,産生一個索引segment。
八、索引和全表掃描(可以一次掃多個block)
1、索引樹的高度一般比較低(根、莖、葉子),根和莖存儲的是葉子的引用
2、索引(葉子)由索引列存儲的值及rowid組成,而且值不能是null,否則有函數用不上索引(eg:count)
3、索引本身是有序的,可以用來消除order by 帶來的性能問題
4、索引上存儲的值列可以重複(自己總結)
當查詢出的資料量很大時,效率有可能不如全表掃描。因為查詢出結果需要讀取block,讀取一次是一次io,結果過多就會有過多io
eg:select * from t where t.id=1 (假設查詢出很多結果)
4、count(*),sum、avg、max、min、upper等函數的索引問題
九、排序問題(能否通過索引降低排序帶來的性能問題)
1、distinct
2、union all
十、索引個數問題
1、如果表建了索引,在插入的時候,因為要維護一份索引,是以插入會很慢。可以考慮插入完全後,再建立索引
十一、位圖索引
适宜場景:索引列重複值比較多,并且不經常更新
十二、hint:強制執行
十三、連接配接
select * from t1,t2 where t1.id = t2.t1_id(前提條件,它倆之間存在這個關系)
執行順序,先通路一次t1,查出所有資料,然後用第一條資料,通路t2關聯,用第二條資料,通路t2關聯...........
(另外,資料最少的表做驅動表,效率更高)
十四:awr
是oracle 10g下提供的一種性能收集和分析工具,它能提供一個時間段内整個系統資源使用情況的報告,通過這個報告,我們就可以了解一個系統的整個運作情況,這就像一個人全面的體檢報告。
十五:exp/imp:導入導出小型資料
expdp/impdp:導入導出大型資料
十六、同義詞
十七、
1、set autotrace on:跟蹤sql的執行計劃和執行的統計資訊
2、set timing on:設定打開sql執行所用時間
十八、表建索引是會産生鎖,直到建完後才釋放,因為隻有加上鎖,排序動作才可以完成。但是最好不要在業務高峰期去建索引,因為有可能會産生鎖等待
十九、
parallel 強行啟用并行度來執行目前sql