1
避免無計畫的全表掃瞄
如下情況進行全表掃瞄: -
該錶無索引 -
對返回的行無任何限制條件(無
where
子句)
-對於索引主列(索引的第一列)無限制條件 -
對索引主列的條件含在表示式中 -
對索引主列的限制條件是
is (not) null或!=
-對索引主列的限制條件是
like
操作且值是乙個
bind variable或%
打頭的值
2
只使用選擇性索引
索引的選擇性是指索引列中不同值得數目和標誌中記錄數的比,選擇性最好的是非空列的唯一索引為
1.0。
復合索引中列的次序的問題: 1
在限定條件裡最頻繁使用的列應該是主列 2
最具有選擇性的列(即最清晰的列)應該是主列 如果
1和2 不一致,可以考慮建立多個索引。
在復合索引和多個單個索引中作選擇:
考慮選擇性
考慮讀取索引的次數
考慮and-equal操作
3
管理多表連線(
nested loops, merge joins
和hash joins
)優化聯接操作
merge joins
是集合操作
nested loops
和hash joins
是記錄操作返回第一批記錄迅速
merge joins
的操作適用於批處理操作,巨大表
和遠端查詢 1
全表掃瞄--〉
2排序--〉
3比較和合併
效能開銷主要在前兩步
適用全表掃瞄的情形,都適用
merge joins
操作(比
nested loops
有效)。 改善
1的效率:
優化i/o
,提高使用
oracle
多塊讀的能力,
使用並行查詢的選項 改善
1的效率:提高
sort_area_size
的值,使用
sort direct writes
,為臨時段提供專用表空間
4
管理包含檢視的
sql語句
優化器執行包含檢視的
sql語句有兩種方法: -
先執行檢視,完成全部的結果集,然後用其餘的查詢條件作過濾器執行查詢 -
將視**本整合到查詢裡去 含有
group by
子句的檢視不能被整合到乙個大的查詢中去。
在檢視中使用
union
,不阻止檢視的
sql整合到查詢的語法中去。
5
優化子查詢
6
使用復合
keys/star
查詢
7
恰當地索引
connect by
操作
8
限制對遠端表的訪問
9
管理非常巨大的表的訪問
-管理資料接近
(proximity)
記錄在表中的存放按對錶的範圍掃瞄中最長使用的列排序
按次序儲存資料有助於範圍掃瞄,尤其是對大表。 -
避免沒有幫助的索引掃瞄
當返回的資料集合較大時,使用索引對
sga的資料塊快取占用較大,影響其他使用者;全表掃瞄還能從
oracle
的多塊讀取機制和「一致性獲取
/每塊」特性中受益。 -
建立充分索引的表
使訪問索引能夠讀取較全面的資料
建立僅主列不同的多個索引 -
建立hash簇
-建立分割表和檢視 -
使用並行選項
10
使用union all
而不是union
union all
操作不包括
sort unique
操作,第一行檢索的響應速度快,多數情況下不用臨時段完成操作,
union all
建立的檢視用在查詢裡可以整合到查詢的語法中去,提高效率
11
避免在sql
裡使用pl/sql
功能呼叫
12
繫結變數
(bind variable)
的使用管理
使用bind variable
和execute using方式
將like :name ||』%』
改寫成between :name and :name || char(225),
已避免進行全表掃瞄,而是使用索引。
13
回訪優化程序
資料變化後,重新考察優化情況
13個SQL優化技巧
1 避免無計畫的全表掃瞄如下情況進行全表掃瞄 該錶無索引 對返回的行無人和限制條件 無where子句 對於索引主列 索引的第一列 無限制條件 對索引主列的條件含在表示式中 對索引主列的限制條件是is not null或 對索引主列的限制條件是like操作且值是乙個bind variable或 打頭的...
sql優化技巧
1.比較運算子能用 就不用 增加了索引的使用機率 2.事先知道只有一條查詢結果時,使用 limit 1 limit 1 可以避免全表掃瞄,找到對應結果就不會再繼續掃瞄了 3.選擇合適的資料型別很重要 能用tinyint就不用smallint,能用smallint就不用int,磁碟和記憶體消耗越小越好...
8個SQL語句常用優化技巧
要提高sql語句的執行效率,最常見的方法就是建立索引,以及盡量避免全表掃瞄。在本章mysql教程中,uncletoo給大家整理一些常見的sql優化技巧,避免全表掃瞄。乙個簡單的優化,也許能讓你的sql執行效率提高幾倍,甚至幾十倍。1 避免在where子句中使用 is null 或 is not nu...