2014年8月22日 星期五

用 union 取代 exists解決 performance issue

目前碰到的情況是,我有一個 table用來儲存 GL drill-down的資料,會儲存約一年的資料,約1千3百萬筆。 有一個應用就是每個部門會查詢該部門的費用,在 hr那邊會有資訊記錄登錄的使用者具有那一個部門會科,但有可能一個人員會有需求看多個部門費用,所以會有另一個 table來記錄使用可以看那些部門的部門會科值,原本的寫法為是用 exists,大約如下:

    select * from gl_drill_down_data d
    where d.dept_id = (user_dept_id)
         or (exists (select 'ex' from user_depts ud
                         where ud.user_id = p_user_id
                             and d.user_dept_id = ud.dept_id
                        )
             )

這樣的寫法在資料筆數只有百萬筆的時候沒什麼效率問題,但更多資料時就會出現很慢的情況,就算作了很好的 index也一樣,後來的解法就是用 union如下:


select d.* from gl_drill_down_data d
where d.dept_id = (user_dept_id)
union
select d.* from gl_drill_down_data d, user_depts ud
where ud.user_id = p_user_id
and d.user_dept_id = ud.dept_id

這樣效率真的差很多,可以參考看看。
                 

2014年8月6日 星期三

TechDays Taiwan 2014 - Microsoft

可以開始報名囉,希望今年我可以去~~

GV有兩筆重複的憑證號碼存在

這個發生的情況為憑證類別為海關代徵營業稅,使用者在不同發票上輸入相同的憑證號碼,資通的顧問說畫面上會提示,但允許存檔。 如果發現相同的話,如果 ap invoice 作刪除,也要順便把 GV的那一作刪除才行。