.net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進,統計結果如下圖: 下圖接上圖後面: 原先的處理方式是,這些資料分別涉及到四五張表,前台從資料庫中查詢出需要的資料集,然後分別遍歷這些資料集拼接html字串顯示在介面上。 優化思考:
.net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進,統計結果如下圖:
下圖接上圖後面:
原先的處理方式是,這些資料分別涉及到四五張表,前台從資料庫中查詢出需要的資料集,然後分別遍歷這些資料集拼接html字串顯示在介面上。
優化思考:
由於前台需要多次呼叫資料庫,試想把改功能封裝成乙個儲存過程實現,前台負責傳輸引數,有儲存過程計算拼接之後返回html結果。
其實對於這樣統計為什麼會要通過遍歷多個資料集去拼接字串呢?為什麼不通過資料庫關連查詢出來這個結果呢?其實開始想過使用行列轉換去實現,剛好sqlserver 2005中有pivot實現行列轉換,但後面使用之後發現,實現轉換的那列需要是數字型別(int),而我們的結果備註這列都是字元型的,而且類似c3列的結果可能不唯一,比如多個值時應該出來21;22,所以使用行列轉換解決不了。
最後編寫儲存過程演算法完全跟前臺一致,原先遍歷表儲存過程使用游標去遍歷,最後測試結果讓人失望,竟然超時,比原先的呼叫方式還慢,查查原因,原來都是游標惹的禍,原來用游標遍歷大批量資料會超級慢。
解決辦法一:
用表變數方式代替游標,類似如下:
SQL Server 2005 游標跑的很慢
本人使用sql server management studio 在查詢介面中寫了兩個游標,份別跑了30分鐘和6分鐘.這兩個游標都是唯讀前進地提取.涉及數量9萬和5千條,也就是說提取次數.無論對要提取的表增加索引,還是修改cursor的型別,都無濟於事 微軟不會那麼差勁吧?後來感覺放進儲存器起跑,確...
MySQL 游標 游標
游標cursor是用來儲存查詢結果集的 資料型別 在儲存過程和函式中可以使用游標對結果集進行迴圈的處理。游標的使用包括游標的宣告 open fetch 和 close,其語法分別如下 宣告游標 declare cursor name cursor for select statement open ...
mysql游標型別 MySQL 游標
drop procedure if exists processorders create procedure processorders begin declare done boolean default 0 declare a int declare b varchar 20 定義游標遍歷時,...