單表訪問通常就是走全表掃描或者是走索引 1.若是 SQL查詢 返回表中大量數據,通常是走全表掃描 2.若是 SQL查詢 返回表中少許數據,通常走索引sql
1.兩表關聯 兩表關聯方式有,嵌套循環,hash,排序合併鏈接markdown
1.1.NL嵌套循環,通常用於兩表關聯,返回少許數據函數
1.2.HASH,通常用於處理多表關聯,返回大量數據性能
1.3.排序合併鏈接,通常用於處理兩表,非等值鏈接 根據這些理論,我會先看兩個表關聯返回多少行數據,返回少走NL,返回多走HASH優化
2.多表關聯,原理同樣spa
1.sql避免帶有標量子查詢code
2.sql避免帶有自定義函數orm
3.UPDATE後面須要跟子查詢排序
4.注意執行計劃是否走了Filter,笛卡爾積等索引
5.注意執行計劃 ,表是否是缺索引分區表有沒有作分區裁剪
6.表的統計信息是否過時,有沒有收集
1.分析業務邏輯 你所在業務SQL屬於ETL,仍是屬於報表的 ETL,SQL通常走hash居多,由於處理數據量大 BI,SQL通常走嵌套循環居多,由於返回的結果集小
1.SQL裏面不能有標量子查詢,緣由後續補充
2.SQL裏面不能有自定義函數,緣由後續補充
3.大表join大表容易產生性能問題
4.FROM後面視圖和子查詢,單獨查詢快不快,單獨查詢慢,須要要單獨優化
5.WHERE 條件要注意 會不會產生 filter(表示謂詞條件只會起到過濾做用,不會影響數據的訪問路徑),隱式轉換致使不走索引 在查看Oracle執行計劃的時候常常會遇到Access和filter Access:表示對應的謂詞條件會影響數據的訪問路徑(是按照索引仍是表) Filter:表示謂詞條件只會起到過濾做用,不會影響數據的訪問路徑。
6.看錶統計信息收集,過時沒
7.看錶有沒有時間過濾字段,有沒有對時間過濾字段建分區
8.分析執行計劃 ,嵌套循環的驅動表,E-Rows(預估的返回記錄數),A-Rows(真實返回的記錄數)條目是否正常,大表是否走索引等等
案例後續補充