標籤:高效 use ctf 重複 ble 預存程序 個數 sql 語句 不能
一、高效 SQL 陳述式原則
- 在where 中用 = 關係運算時
- 避免用函數在關係運算中,除非你使用函數建立索引
- 盡量不要隱式轉化資料類型,資料類型一定要匹配
- 盡量將一句SQL分成多個陳述式完成
- 不能差分的請用UNION ALL 來組合
- 條件確定的子查詢 Exist 適合於外表小,內表大 in 適合於外表大,內表小
- 使用視圖的注意事項
- 複雜視圖的串連要小心,尤其有外鍵的時候
- 當查詢的是視圖中引用的部分表的時候,請不要使用視圖,或者建立新的更小的表
- 儲存中間結果
- 對查詢中可能多次調用的結果集,請儲存
- 考慮使用物化視圖
- 將複雜的不能最佳化的查詢分階段完成
- 盡量減少訪問資料的次數
- 使用 case 語句
- 使用進階分組rollup,cube
- 使用預存程序
- 使用 RETURNING 子句
二、全表掃描
- 全表掃描:將高水位線下的資料區塊都讀一遍。
- DB_FILE_MULTIBLOCK_READ_COUNT 參數決定掃描的速度,該參數的值乘以塊的
- 大小應該小於作業系統的最大io
- 因為範圍是連續的塊,所以全表掃描會連續的讀,效率很高
三、何時會使用全表掃描
1.表小
2.索引缺少,條件判定列上沒有索引
3.使用hint,強制使用全表掃描
4.讀的資料比重大。一般超過 10%的資料要讀取就會選擇全表掃描
5.並行查詢,和索引是對立的,兩者必須選擇一個
四、全表掃描的最佳化
1.回收高水位線
2.DB_FILE_MULTIBLOCK_READ_COUNT 加大
3.使每個塊裝的資料更多,減少 pctfree
4.使用並行查詢
alter system set db_file_multiblock_read_count=32;修改參數配置,預設為16 個塊
alter table t1 pctfree 0; 將每個資料區塊都裝滿
alter table t1 move tablespace users; 移動資料表空間
五、 資料庫查詢的最佳化,Hints
Hints,即提示,強制該語句以我們指定的方式運行,作用範圍是當前語句,對後面語句不影響。書寫時,一定要放在第一個單詞(select) 的後面。Hints 的寫法有兩種: /*+ 提示 */ , --+ 提示
六、SQL 查詢最佳化
1.盡量避免在一個複雜查詢裡面使用 LIKE ‘%parm1%‘ 百分比符號會導致相關列的索引無法使用,最好不要用.
-
- 在前端進行下拉框的輸入搜尋
- 在後端進行查詢範圍控制,不查詢無關資料
2. 索引
-
- 資料量大的時候,建立索引
- 避免對索引進行計算操作
- 避免在索引列上使用 not, <>, !=
- .避免在索引列上使用 is null 和 is not null
- 避免在索引列上使用資料類型轉換
- .避免在索引列上使用函數
- 避免在索引列上使用空值
3. 複雜查詢 可將複雜查詢進行拆分,分步進行
4. 盡量使用 union all union 會對資料進行排序,並去除重複的行,比較消耗資源 union all 則不進行排序,不去除重複的行
5. 在where 語句中合理使用 in , not in ,exist,not exist Exist 適合於外表小,內表大 in 適合於外表大,內表小
6. 排序 避免使用消耗資源的操作,帶有 distinct, uinon,minus,intersect,order by 的語句 會啟動 sql 引擎,distinct 需要一次排序,而其它至少需要執行2次排序。
7. 暫存資料表 謹慎使用暫存資料表,可以極大的提高效能。
Oracle 學習筆記(四)