前幾天去客戶那裡做效能檢查優化,發現有這樣一大段sql語句,每天會執行幾千次,
--一共36條相似語句,只是每條語句中的條件 病案大類 不同
select @一般醫療服務費=sum(isnull(金額,0)) from 流水帳 with (nolock)
where 住院號=@zyh and 專案** in (select 專案** from 收費專案表 where 病案大類='一般醫療服務費')
select @一般**操作費=sum(isnull(金額,0)) from 流水帳 with (nolock)
where 住院號=@zyh and 專案** in (select 專案** from 收費專案表 where 病案大類='一般**操作費')
......
......
......
select @檢查用一次性醫用材料費=sum(isnull(金額,0)) from 流水帳 with (nolock)
where 住院號=@zyh and 專案** in (select 專案** from 收費專案表 where 病案大類='檢查用一次性醫用材料費')
select @**用一次性醫用材料費=sum(isnull(金額,0)) from 流水帳 with (nolock)
where 住院號=@zyh and 專案** in (select 專案** from 收費專案表 where 病案大類='**用一次性醫用材料費')
看到這段語句,腦海中不禁浮現出這樣乙個情景。過年的時候,所有的親戚,一共36個人,聚在一起吃年夜飯。一桌子的菜都上齊了,大家圍坐在一起,正準備開吃,發現桌上還沒筷子。這時候你媽讓你去拿筷子。你去一趟廚房,拿了一雙筷子遞給太爺爺;再回一趟廚房,拿一雙筷子遞給太奶奶;再回一趟廚房,拿一雙給爺爺...等筷子都拿齊了,菜涼了,你也累癱了,大家看著你跑來跑去,都會輕聲嘆氣,這孩子啊。。。
這種查詢寫法的效率實在是不高,原因有以下幾點
如果是面向結果的你會怎麼拿筷子?不用問,去一趟廚房,數好72根筷子,一起拿過來放桌上,大家一分,立馬開吃。兩種處理方式的成本和效率的區別顯而易見。
那該怎麼優化呢,參考的語句如下。這樣只要訪問一次表,一鍋端,就可以得到所有專案的費用,再交由應用程式處理展現吧。
select sum(isnull(a.金額,0))
,b.病案大類
from 住院_病人費用流水帳 a with (nolock)
join **_收費專案表 b
on a.專案**=b.專案**
where a.住院號=@zyh
group by b.病案大類
演算法優化一例
本文將以排序演算法中的插入排序為例,介紹優化演算法,編制高效程式的方法。人們通常用於排序手中橋牌的方法是一次考慮一張牌,將它插入到已經排序過的牌的適當位置中 時刻讓它們保持有序 在計算機實現中,我們需要將較大的元素移到右邊,為插入的元素準備空間,然後再在空位置上插入該元素。該演算法的通常的乙個實現如...
sql優化一例
原sql,查詢總數300,每頁15資料也要8秒 select a from table where date format my time,y m d 2012 08 15 limit 0,15 優化後的sql,查詢總數18000,每頁15的資料只要1秒 select a from table wh...
Sql查詢利用表變數優化一例
最近做的乙個小專案,出租管理,需要計算租金,有點複雜,如下圖 經過研究,寫出 如下 set ansi nulls on set quoted identifier on goalter proc dbo expensedetails pid int,pne nvarchar 64 as declar...