資料庫索引:
索引有單列索引
復合索引之說
如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。
建設原則:
1、索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行查詢,並且檢索行數小於總表行數的5%。則應該考慮。
2、對於兩表連線的字段,應該建立索引。如果經常在某錶的乙個字段進行order by 則也經過進行索引。
3、不應該在小表上建設索引。
優缺點:
1、索引主要進行提高資料的查詢速度。 當進行dml時,會更新索引。因此索引越多,則dml越慢,其需要維護索引。 因此在建立索引及dml
需要權衡。
建立索引:
單一索引:create index on (column_name);
復合索引: create index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。
select * from emp where deptno=66 and job='sals' ->走索引。
select * from emp where deptno=66 or job='sals' ->將進行全表掃瞄。不走索引
select * from emp where deptno=66 ->走索引。
select * from emp where job='sals' ->進行全表掃瞄、不走索引。
如果在where 子句中有or 操作符或單獨引用job 列(索引列的後面列) 則將不會走索引,將會進行全表掃瞄。
sql 優化:
當oracle資料庫拿到sql語句時,其會根據查詢優化器分析該語句,並根據分析結果生成查詢執行計畫。
也就是說,資料庫是執行的查詢計畫,而不是sql語句。
查詢優化器有rule-based-optimizer(基於規則的查詢優化器) 和cost-based-optimizer(基於成本的查詢優化器)。
其中基於規則的查詢優化器在10g版本中消失。
對於規則查詢,其最後查詢的是全表掃瞄。而cbo則會根據統計資訊進行最後的選擇。
1、先執行from ->where ->group by->order by
2、執行from 字句是從右往左進行執行。因此必須選擇記錄條數最少的表放在右邊。這是為什麼呢?
3、對於where字句其執行順序是從後向前執行、因此可以過濾最大數量記錄的條件必須寫在where子句的末尾,而對於多表之間的連線,則寫在之前。
因為這樣進行連線時,可以去掉大多不重複的項。
4、 select子句中避免使用(*)oracle在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間
5、索引失效的情況:
① not null/null 如果某列建立索引,當進行select * from emp where depto is not null/is null。 則會是索引失效。
② 索引列上不要使用函式,select col from tbl where substr(name ,1 ,3 ) = 'abc'
或者select col from tbl where name like '%abc%' 而select col from tbl where name like 'abc%' 會使用索引。
③ 索引列上不能進行計算select col from tbl where col / 10 > 10 則會使索引失效,應該改成
select col from tbl where col > 10 * 10
④ 索引列上不要使用not ( != 、 <> )如:select col from tbl where col ! = 10
應該 改成:select col from tbl where col > 10 or col < 10 。
6、用union替換or(適用於索引列)
union:是將兩個查詢的結果集進行追加在一起,它不會引起列的變化。 由於是追加操作,需要兩個結果集的列數應該是相關的,
並且相應列的資料型別也應該相當的。union 返回兩個結果集,同時將兩個結果集重複的項進行消除。 如果不進行消除,用unoin all.
通常情況下, 用union替換where子句中的or將會起到較好的效果. 對索引列使用or將造成全表掃瞄. 注意, 以上規則只針對多個索引列有效.
如果有column沒有被索引, 查詢效率可能會因為你沒有選擇or而降低. 在下面的例子中, loc_id 和region上都建有索引.
高效:select loc_id , loc_desc , region
from location
where loc_id = 10
union
select loc_id , loc_desc , region
from location
where region = 「melbourne」
低效:select loc_id , loc_desc , region
from location
where loc_id = 10 or region = 「melbourne」
如果你堅持要用or, 那就需要返回記錄最少的索引列寫在最前面.
7. 用exists替代in、用not exists替代not in
在許多基於基礎表的查詢中, 為了滿足乙個條件, 往往需要對另乙個表進行聯接. 在這種情況下, 使用exists(或not exists)通常將提高查詢的效率.
在子查詢中, not in子句將執行乙個內部的排序和合併. 無論在哪種情況下, not in都是最低效的(因為它對子查詢中的表執行了乙個全表遍歷).
為了避免使用not in, 我們可以把它改寫成外連線(outer joins)或not exists.
例子:高效: select * from emp (基礎表) where empno > 0 and exists (select 『x』 from dept where dept.deptno = emp.deptno and loc = 『melb』)
低效: select * from emp (基礎表) where empno > 0 and deptno in(select deptno from dept where loc = 『melb』)
Oracle 建立索引及SQL優化
oracle 建立索引及sql優化 資料庫索引 索引有單列索引 復合索引之說 如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。建設原則 1 索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行...
Oracle 索引建立及管理
oracle索引建立及管理 1.oracle 索引簡介 在 oracle 資料庫中,儲存的每一行資料都有乙個 rowid 來標識。當 oracle 中儲存著大量的資料時,意味著有大量的 rowid,此時想要快速定位指定的 rowid 就需要使用索引物件。當對 oracle 表執行指定條件的查詢時,常...
SQL調優(索引)
索引 主鍵索引,唯一索引,組合索引,全文索引等 sql優化步驟 首先定位慢查詢 mqsql預設是響應超過十秒鐘的才是慢查詢 定位到了慢查詢才根據語句看採用什麼調優方式 索引的實現原理其實就是二叉樹 b 樹 主鍵索引 當我們在習慣性的生成primiry key的時候,就是生成了主鍵索引,採用二叉樹的形...