【文章內容簡介】
ct 1 from YK_YKZKC WHERE idm=100 and kcsl50)beginupdate YK_YKZKC set kcsl=kcsl50 where idm=100EndElse beginrollback tranSelect ‘F庫存不夠’returnend改為update YK_YKZKC set kcsl=kcsl50 where idm=100 and kcsl50If @@rowcountBeginRollbakc tranSelect ‘F庫存不夠’end取未執(zhí)行的醫(yī)技項目,日表沒有數(shù)據就到年表中查找if exists(select a.* from SF_MZCFK a(nolock),SF_CFMXK b(nolock)beginselect a.* into temp1 from SF_MZCFK a(nolock),SF_CFMXK b(nolock)endelse beginselect a.* into temp1 from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)end改為Insert into temp1 select a.*from SF_MZCFK a(nolock),SF_CFMXK b(nolock)If @@rowcount=0BeginInsert into temp1 select a.*from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)end性能優(yōu)化原則12:trig最后的手段Trig(觸發(fā)器)的處理的處理機制是滿足條件時就會在源語句后面加上trig中的代碼進行執(zhí)行。它有兩個致命的弊端:(1)不清楚有trig的人會對于執(zhí)行結果感到迷惑。如常有在插入一張表如果主鍵是indentity的值常取用select @@identity。但如是有trig,tring中有表插入操作,這時的@@identity可能就不是想要的值。(2)trig會束縛選擇。如:有一套單據主表和明細表,當明細表的金額更新時,要同步主表的金額,當程序是一條條更新明細時用trig的作法是每當更新一條明細記錄時都算一處所有明細表的總金額,再去更新主表的金額。這樣有多少條明細就要算多少次,好的作法是不要trig,直接在sql語句中明細更新完明后,一次性算出總金額每條單據的總金額,再更新主表的金額。:用戶說好才是真的好1)有時sql語句性能難以優(yōu)化,但用戶對于系統(tǒng)響應速度還是不滿意。這時可以從業(yè)務分析處理。如:我們退費模塊錄入發(fā)票號原來是用fph like ‘XXX%’。用戶報怨慢,后來改為先用fph=‘XXX’來查,如查不到再fph like ‘XXX%’。這樣在絕大部情況下速度都非???,同時也滿足小部分情況下模糊查詢的需求。如:我們的程序要查日表和年表。如果通過日表union表視圖去查會非常慢,性能也難以優(yōu)化。程序改為普通情況下不查年表,用戶勾上年表標志時才查年表。(2)查詢統(tǒng)計很多數(shù)據時間比較長,就以查詢完一部分數(shù)據后可以顯示這部分數(shù)據或是用提示,這樣用戶清楚系統(tǒng)在作事情也知道大概進度。這樣情緒上會好很多。(3)查詢模塊常有一進入時也默認一個查詢,如果性能好,查詢又合用戶心意,這種設計非常好,如果性能不好,那就不是好的設計。用戶對于進入都困難的模塊是沒有好感的。(4)有戶的耐心與查詢出的記錄成正比。用戶痛恨等待很久卻沒有查詢出記錄。對于非常慢的查詢,如果有些子查詢非??炜梢韵茸鬟@樣查詢以避免查詢很久卻沒有數(shù)據出來的情況。如:按病歷號查在院病人所有費有明細,可以先查一下這個病歷是不是有對應病人。實戰(zhàn)技巧1:用exists、in代替distinctDistinct實際上是先收集再刪除這樣兩步都耗資源。Exists,in會隱式過濾掉重復的記錄例查自2009年以來有金額大于100的藥品的病人select distinct , from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock)where = and = and 39。200939。 and 100改為select , from ZY_BRXXK a where exists(select 1 from ZY_BRSYKb(nolock),ZY_BRFYMXK c(nolock)where = and = and39。200939。and 100)實戰(zhàn)技巧2:縮短unionselect …from A,B,C,D,E1where(E1的條件)and(其他表聯(lián)接條件)unionselect …from A,B,C,D,E2where(E2的條件)and(其他表接接條件)改為select …from A,B,C,D,(select...from E1where(E1條件)unionselect …from E2where(E2條件))E where(其他條件)當涉及ABCD表部分耗資源而E1,E2不耗資源時是這樣,如果反過來則改后的性能不一定好。查2009年4月后入院的在院病人在2905病區(qū)發(fā)生的所有費用明細select ,, select ,, from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YK_YPCDMLK d where = and 39。20090439。 and not in(3,8,9)and = and =39。290539。 and =union allselect ,, from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YY_SFXXMK d where = and 39。20090439。 and not in(3,8,9)and = and =39。290539。 and = and =0改為select ,, from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),(select ypmc,ypgg,ypdm,idm idm from YK_YPCDMLK union select name,xmgg,id,0 from YY_SFXXMK)dwhere = and 39。20090439。 and not in(3,8,9)and = and =39。290539。 and = and =實戰(zhàn)技巧3:合并sql、急診、專家掛號人數(shù)declare @ptghs int,@jzghs int,@zjghs intselect @ptghs=0,@jzghs=0,@zjghs=0select @ptghs=count(*)from GH_GHZDK where ghrq39