笨拙而詭異的 Oracle(之二)

2022-07-14 10:06:07 字數 1075 閱讀 8927

有一張表,很多資料:

想取某個月的資料。初始的想法很簡單,根據日期(rq)形成條件即可:

符合條件的記錄數是 129835,但耗時太長:14.515 秒(rq欄位是做過索引的)!直觀的反應是 oracle 的 to_char 函式效率不高!那有沒有其他函式呢?有,找到了乙個 months_between: 

months_between(date1, date2)  是求兩個日期之間的月數,以為就像 sql server t-sql 中的 datediff(m, date1, date2) 一樣,既然是提取某個月的資料,當然是 months_between(rq, to_date('20150301', 'yyyymmdd')) = 0!但結果是不對的,只有 4188 條記錄!仔細研究 months_between,發現與 datediff(m, date1, date2) 是不一樣的:months_between 對於兩個同月的日期,也是有 月數差的!額滴神吶!膜拜 oracle!! 把條件改成下面的形式,就對了:

但此時的查詢效率仍然不理想,還需要 8、9 秒的時間!繼續優化,改成下面的形式: 

此時的耗時只有 0.031 秒! 至此,優化已經做完了!但條件的寫法能不能再簡化些呢?結果是: 

對於 oracle,還能說什麼呢?說什麼都是多餘的,只有膜拜!!!  

笨拙而詭異的 Oracle

有這樣一段 sql 通過 c 獲取查詢結果 sql 中有兩個引數,且都是字串型別,以上的 c 是生成 oracle sql 所需要的引數。執行結果如下 居然發生這樣的錯誤!苦思冥想外加多次嘗試,均無果!該錯誤的詭異之處在於 phdlevel 的值為 時,執行正常,而為某一狀態值 平衡,欠平衡,過平衡...

Oracle 基礎之二

執行三 select 列名稱 列 列名稱 列 執行一 from 表名稱 別名 執行二 where 過濾條件 限定符號 查詢工資大於2000的人員 select from emp where sal 2000 查詢allen的資訊 secelt from emp where ename allen a...

ORACLE高階之二 LOCK

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖...