for迴圈注意事項:
1.for迴圈內部盡量少做資料庫查詢之類的io代價大的操作
2.盡量控制for迴圈的次數,不多做無用功
3.能一次載入在記憶體中的,就不要通過迴圈來多次查詢資料庫,除非資料量過大。
4.for迴圈內部盡可能少建立物件,會耗費大量記憶體資源
起因:前兩天優化乙個統計功能的頁面,客戶反映說,點選頁面的查詢按鈕要等快十秒中資料才載入出來,然後點選匯出按鈕後,載入時間快翻一倍了。讓我查一下看看能不能優化。
仔細看了一下**,才發現**問題太大了。
發現問題:
描述一下優化前大致結構:
1.從相關主表中獲取所有工單資訊,儲存到dataset,然後通過for迴圈讀取資料到乙個工單物件的list中。
2.獲取用來修理工單所用的材料資訊,放在乙個dataset中,然後外迴圈dataset,內迴圈工單物件list。根據關聯id值相等來判斷,把相關材料資訊賦值給工單物件的材料資訊屬性。
3.for迴圈工單物件的list來生成拼接統計html,迴圈中放了乙個查詢sql,生成乙個dataset,用dataset中第一行第一列的值來和工單物件的乙個屬性來做比較,然後生成不同內容
4.在for迴圈結束處放了乙個判斷,如果小於200行,那就繼續新增拼接的html。
/// /// 查詢所有符合條件的工單物件///
///
protected arraylist searchrecord()}}
catch (exception ex)
finally
sql = "select t1.id,t2.xlhycl from tz_main t1,v_tz_xiaowxiuanddaxiu_cailiao t2, tz_main_clinfo tz where t1.id=tz.main_id(+) and t1.id=t2.mainid and t1.reporttype in ('套室表','水管裝置','水管問題') and tz.executivepeople!=' ' and tz.executivepeople is not null and acceptstation in (" + session["depname"].tostring() + ") ";
//相關過濾判斷條件已刪除
sql += " order by t1.accepttime asc ";
ds = odb.getdataset(sql);
if (ds != null && ds.tables.count > 0 && ds.tables[0].rows.count > 0)
else}}
}}
}return xlgctjarr;
}/// /// 通過xlgctjarr 拼接html
///
/// 0,表示查詢,只用顯示200條資料即可,1表示匯出功能,匯出所有資料
/// 工單物件列表
///
protected string showtable(string isall, arraylist xlgctjarr)
else
html += "";
html += "" + (s + 1) + "";
if (((xlgctjbean)xlgctjarr[i]).reporttype != null && ((xlgctjbean)xlgctjarr[i]).reporttype != "")
else
//統計型別
oracledatabase odb1 = new oracledatabase();
string sql = string.format(@"select * from statisticaltyep");
dataset dtstatisticaltype = odb1.getdataset(sql);
if (dtstatisticaltype != null && dtstatisticaltype.tables.count > 0)
else if (dtstatisticaltype.tables[0].rows[0]["type"].tostring() == "開工日期")
else if (dtstatisticaltype.tables[0].rows[0]["type"].tostring() == "修復日期")
}else
html += "";
if (isall == "")
}htmlstr += html;
htmlexportstr += html;//用於匯出儲存
}htmlstr += "";
htmlexportstr += "";
return htmlstr;
}
優化後:
由於時間緊,差不多修改優化了一下,等有時間的時候把業務了解清楚,準備再次進行優化。貼上優化後部分**
/// /// 查詢所有符合條件的工單物件///
///
protected arraylist searchrecord()}}
catch (exception ex)
finally
sql = "select t1.id,t2.xlhycl from tz_main t1,v_tz_xiaowxiuanddaxiu_cailiao t2 ,tz_main_clinfo tz where t1.id=tz.main_id(+) and t1.id=t2.mainid and t1.reporttype in ('套室表','水管裝置','水管問題') and tz.executivepeople is not null and acceptstation in (" + session["depname"].tostring() + ") ";
sql += " order by t1.accepttime asc ";
ds = odb.getdataset(sql);
if (ds != null && ds.tables.count > 0 && ds.tables[0].rows.count > 0)
else}}
}}
}session.add("xlgctjarr", xlgctjarr);
return xlgctjarr;
}/// /// 通過xlgctjarr 拼接html
///
/// 0,表示查詢,只用顯示200條資料即可,1表示匯出功能,匯出所有資料
/// 工單物件列表
///
protected string showtable(string isall, arraylist xlgctjarr)
else
}for (int i = 0; i < allcount; i++, s++)
html += "" + (s + 1) + "";
if (((xlgctjbean)xlgctjarr[i]).reporttype != null && ((xlgctjbean)xlgctjarr[i]).reporttype != "")
else
//統計型別
if (dtstatisticaltype.rows.count > 0)
else if (dtstatisticaltyperesult == "開工日期")
else if (dtstatisticaltyperesult == "修復日期")
}else
html += "";
//if (isall == "")
////}
htmlstr += html;
htmlexportstr += html;//用於匯出儲存
}htmlstr += "";
htmlexportstr += "";
//}return htmlstr;
}
本次主要優化地方:
1.for迴圈工單物件的list來生成拼接統計html,迴圈中放了乙個查詢sql,生成乙個dataset,用dataset中第一行第一列的值來和工單物件的乙個屬性來做比較,然後生成不同內容.*****==>資料庫io代價太大,在for迴圈內做資料庫讀取操作的話,最好能放在for迴圈外面,多花一點記憶體比每次讀取資料庫的開銷小很多
2.在for迴圈結束處放了乙個判斷,如果小於200行,那就繼續新增拼接的html。*****》直接判斷好數量,盡量少做迴圈。
3.關於匯出的優化,由於業務規則是先查詢然後匯出。所以我把查詢時封裝的工單物件列表和生成的html字串都儲存在session中,等匯出的時候。判斷工單物件列表count小於等於200的話,直接把session中的html匯出就好。如果大於200,把超過200的list呼叫生成html的方法showtable()直接生成剩下的html,然後和session中的html拼接後匯出即可
注:下週有時間的話,去了解一下關於這個統計的業務,如果可能的話,把生成工單物件列表的三個for迴圈優化的只剩乙個,這樣效能才能翻翻!
關於SQL效能優化及注意事項
possible keys 表示查詢時,可能使用的索引 key 表示實際使用的索引 key len 索引欄位的長度,在組合索引中判斷索引被使用的情況尤為重要 ref 列與索引的比較 rows 掃瞄出的行數 filtered 按表條件過濾的行百分比 extra 執 況的描述與說明 關於索引的劃分 雜湊...
關於xp cmdshell的注意事項
一 mssql2000的master本身沒有擴充套件儲存過程xp cmdshell,所以要建立一下,然後就看直接使用了 sqlcommand.commandtext use master if not exists select from dbo.sysobjects where id object...
關於Textarea的注意事項
為什麼要特別提textarea?因為其實textarea這個節點很特殊。而因為這個節點特殊,所以在ie和其它瀏覽器下,對它的解釋不一樣。賣一下關子,哈哈!其實主要原因是今天幫乙個師兄修乙個bug,具體是因為從伺服器拉資料下來插進textarea的時候失敗,這個情況只在ie出現。其它瀏覽器一切正常!首...