學習筆記 oracle SQL優化

2022-03-17 07:03:13 字數 4039 閱讀 1332

資料庫設計

設計的原則

1、熟悉需求

2、符合開發規範

命名規範

明確實體與資料表的關係

不能即沒有主鍵也沒有外來鍵

3、審核資料庫設計

4、基本表的特徵

1、原子性:字段不能再分解

2、原始性:是對原始資料的記錄,不是拼

接出來的資訊

3、演繹行:有基本表和關係表中的

資料,可以派生出任何想要的資料

4、穩定性:相對穩定,長期儲存

5、必須滿足一二正規化,盡量滿足第三正規化

第一正規化:對屬性的原子性約束,不可再分

第二正規化:記錄的唯一性約束,即必須有主鍵

第三正規化:對欄位冗餘的約束,乙個表中的字

段不能包含其他表的非主鍵字段

6、簡潔地e-r圖

7、符合完整性約束

設計的模型

關係模型er 強調關係

物件模型or 強調的是實體的個體

設計的技巧

1、表越少越好,表中的組合主鍵的字段越少越好、欄位越少越好

2、檢查變化字段

3、避免使用資料庫保留字

4、採用刪除標記字段代替刪除

5、避免使用觸發器

6、發現在輸入時重複資料,則需要建立新的表核心的關係

7、使用資料庫設計工具

8、建立er圖表和資料字典

9、新增字段修改記錄時間、修改人、修改後的版本

10、位址和**採用多個字段

sql優化

劣質sql 對系統產生不好的影響的sql

1、執行時間超長

2、引發嚴重的等待時間

3、不能滿足壓力測試

4、消耗大量的系統資源

索引使用索引可以快速訪問資料庫表的特點資訊

問題1、占用表空間

2、影響dml效能

使用的條件

1、乙個欄位中包含大量的值

2、乙個欄位中包含多個空值

3、多個字段經常出現在where中

4、表非常大並且查詢返回的資料量低於總資料的20%

索引的建立

create index 索引名 on 表名(列名) tablespace 表空間名

索引型別

列值唯一性

唯一索引

非唯一索引

索引列個數

單列索引

復合索引,第乙個列為主導列

使用情況

當sql語句時where字句用到復合索引的主導列

當某幾個列在sql語句的where字句通常用and連在一起使用

當sql常常查詢幾個同樣的列值時

索引列物理組織方式

b樹索引 適用於列中資料較多的情況

反向鍵索引 用於大的集群系統,多使用者操作統一資料塊

create index 索引名 on 表名(列名) reverse tablespace 表空間名

基於函式的索引 基於乙個或多個列上的函式或表示式建立的索引

用於乙個表中的字段經常被函式所呼叫的情況

create index 索引名 on 表名(函式(列名)) tablespace 表空間名

位圖索引 處理資料的聚合關係,用於重複資料較多的情況

create bitmap index 索引名 on 表名(表名(列名)) tablespace 表空間名

表分割槽應用場景

為了提高資料的可用性,檔表內容或者結構非常大的時候

優點1、提高資料可用性

2、減少管理負擔

3、改善語句效能(減少併發)

分割槽方式

區間分割槽 根據乙個列值得範圍劃分

rertition by range(列名) (

partition 分割槽表名 values less then

(值) tablespace 表空間

)less then 表示小於

values less then (maxvalue)表示其他

//**********==例項******************************====

create table 表名 (

dt_draw date not null

)rertition by range(dt_draw) (

partition 分割槽表名 values less then

(to_date('31/12/2008','dd/mm/yyyy')) tablespace 表空間

)雜湊分割槽 對分區間應用乙個雜湊函式,依次確定

應放在n個分割槽的哪乙個分割槽

分割槽表的樹木間以為2的n次方

rertition by hash(列名) (

partition 分割槽表名 tablespace 表空間

)//**********==例項******************************====

create table 表名 (

dt_draw date not null

)rertition by range(dt_draw) (

partition 分割槽表名1 tablespace 表空間1,

partition 分割槽表名2 tablespace 表空間2,

partition 分割槽表名3 tablespace 表空間3

)列表分割槽 將資料按照列的值分割槽

rertition by list(列名) (

partition 分割槽表名 values (指定值1,指定值2) tablespace 表空間

)//**********==例項******************************====

create table 表名 (

dt_draw date not null

)rertition by list(dt_draw) (

partition 分割槽表名 values (指定值1,指定值2),

partition 分割槽表名 values (指定值3,指定值4),

partition 分割槽表名 values (指定值5,指定值6)

)tablespace 表空間

組合分割槽 之前分割槽方式的組合

區間雜湊組合

partition by range(列1) subpartition by hash (列2) (

partition values less than (值) tablespace 表空間 ,

)區間列表組合

partition by range(列1) subpartition by list (列2) (

partition values less than (值) tablespace 表空間 (

subpartition 子分割槽名 values (指定值1,指定值2) tablespace 表空間))

維護方式

增加分割槽

alter table 表名 add partition 分割槽表名 values less than (值)

注意,不能包含小於最大分割槽分割槽條件的分割槽

刪除分割槽

alter table 表名 drop partition 分割槽表名

截斷分割槽 刪除分割槽中的資料

alter table 表名 truncate partition 分割槽表名

合併分割槽

alter table 表名 merge partitions 要合併的分割槽 into partition 合併到的分割槽

注意,高接線不能合併到低接線

分割槽維護

sql語句的優化

1、選擇合適的oracle優化器

cbo 基於成本優化的優化器

優化模式

rule 基於規則

choose 預設,有統計資訊cbo,否則,rbo

first row 以最快的速度返回前幾行

all rows 以最快的速度返回所有行

2、選擇恰當的查詢方式

方式全表掃瞄

rowid掃瞄 單行資料

索引掃瞄 cbo下有效,索引中直接得到的資料

快速索引掃瞄

3、善於利用共享sql語句

存放在sga中,系統全域性中

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...

Oracle Sql優化筆記

基本的sql 編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自 動對sql語句 進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用 cbo cost based optimization 基於代價的 優化方式 時。我們可以 總結一下可能引起全表 掃瞄的操作 or...

Oracle Sql優化筆記

基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...