天天看點

ORACLE

ORACLE

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