1. 程式人生 > >公司組織oracle培訓的理解

公司組織oracle培訓的理解

不一致 隱式 all oracle數據 create 轉換 -1 大小 語法檢查

oracle執行機制

技術分享

1.客戶端發送一條sql給oracle服務器,oracle會看這條sql的執行計劃是否存在緩存 如果存在則直接運行,如果不存在執行第二步。

2.如果不存在緩存 則會 進行語法檢查(比如我們的sql如果寫錯了 會報錯 就是語法檢查這一步做的操作)。然後執行下面的操作(大概是如果你語法沒問題。oracle會對你的sql進行優化,並生成執行計劃)

3.上面生成的執行計劃會保存在緩存中(是為了減少 第二次執行同樣的sql時候 再執行硬解析,消耗時間)。

4.oracle最終通過sql執行查詢。會在oracle緩存中進行查詢如果沒有就在oracle硬盤中讀取(我們知道oracle數據都是存在硬盤中的,但是每次訪問硬盤大量的io操作肯定不可取,所以會讀取在緩存中進行查詢 緩存中沒有 然後再硬盤中讀取出來保存在緩存中)。

通過上面 需要註意的 sql語句大小寫規範要一致。不然比如第一條sql select * from user 執行了硬解析並保存到了緩存 第二條sql SELECT * FROM USER 會在緩存中查不到 會重新進行硬解析

ps:以前看過sqlserver的執行流程 其實大概也是這樣的

避免全表掃描提示查詢效率

1、對於null值的查詢會進行全表掃描的。所以我們在設計數據的時候對於可能出現null值的字段定義一個默認值 比如"-1" 或者一個‘’ 那麽當你要查詢學生名為空的所有學生的時候:select * from table t.student.Name =‘-1‘

2、避免隱式轉換 比如你在設計數據庫的時候 UserId 設置的類型為number 你在客戶端進查詢的時候select * from user u where u.userid=‘1‘ 這種時候數據庫和客戶端傳遞的類型不一致 導致索引失效

3、避免查詢條件使用函數 select * from user u where u.createTime=to_date(2017-01-02,‘yyyy-mm-dd‘) 這樣也會導致索引失效 全表掃描

4、用exists 替換 in 因為in也會導致索引失效 比如查詢班級為一年級的學生 select * from student where s.calssid in(select classid from class where calssName=‘一年級‘)

替換成 select * from student s where exists(select classid from class where className=‘一年級‘ and s.classsid=s.classid)

當然這個舉例有點極端

5、用union all 替換or

比如你需要查詢年齡為13 歲 或者 15歲 或者17歲的所有學生信息

select * from student s where s.age in(13,15,17) 、

替換成

select * from student s where s.age=13

union all

select * from student s where s.age=15

unoin all

select * from student s where s.age=17

6.模糊查詢 ‘%條件%‘ 是全部掃描的 如果業務支持可以改成 ‘條件%‘ 是走索引的

7.join表不能超過3張(表與表之間的關聯字段都建立索引) 如果業務支持 可以將數據查詢到程序 程序再去取關聯數據

List<Student> students=dbhelper.query(select * from student where rownum<=10);

student.ForEach(function(c){

c.studentName=dbhelper.query(select * from class where classid=‘"+c.classId+‘).className

})

ps:這裏可能會覺得增加了數據庫的負荷。因為取關聯數據會給數據庫發起10次請求 (其實這10次請求是非常快的 第一是數據庫連接池 第二是 上面sql執行機制是直接運行的不會執行硬解析 因為這10條sql是一致的)

8、避免使用select * *會導致oracle解析這個*表裏面含有哪些列 而不是直接取。 * 會導致數據傳輸量 最好需要什麽拿什麽

總結:上面的優化操作 可能數據量小的時候感覺不到什麽 但是上千萬數據的時候 往往不規避以上的上的sql會查詢很久 而規避了的sql只需要零點幾秒

公司組織oracle培訓的理解