我有以下代码块,我试图在优化部分进行优化
DataSet dsLastWeighing = null; DataSet ds = null; DataSet dsWeight = null; string strQuery = string.Empty; string strWhere = string.Empty; Database db = null; #region Original Code Block try { db = DatabaseFactory.CreateDatabase(); strWhere = "WHERE SESSION_ID = '"+pSessionID+"'"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("DeleteWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); strWhere = "WHERE LAB_ID = 0"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("InsertWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); strWhere = strWhere = "WHERE SESSION_ID = '"+pSessionID+"'"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("GetPatientID",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); ds = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strQuery); foreach(DataRow dr in ds.Tables[0].Rows) { if (db.ToString() == "Microsoft.Practices.EnterpriseLibrary.Data.SqlBase.SqlBaseDatabase") { strWhere = "WHERE LAB_ID=0 AND PAT_ID ="+ int.Parse(dr["PAT_ID"].ToString())+" AND WHEN IN(SELECT MAX(WHEN) FROM PATIENT_LAB WHERE LAB_ID=0 AND PAT_ID="+ int.Parse(dr["PAT_ID"].ToString())+")"; } else if (db.ToString() == "Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase") { strWhere = "WHERE LAB_ID=0 AND PAT_ID ="+ int.Parse(dr["PAT_ID"].ToString())+" AND [WHEN] IN(SELECT MAX([WHEN]) FROM PATIENT_LAB WHERE LAB_ID=0 AND PAT_ID="+ int.Parse(dr["PAT_ID"].ToString())+")"; } strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("GetWeight",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); strMain.append(strQuery+" "); dsWeight = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strQuery); foreach(DataRow drWeight in dsWeight.Tables[0].Rows) { strWhere = "WHERE PAT_ID = "+int.Parse(dr["PAT_ID"].ToString())+" AND SESSION_ID ='"+pSessionID+"'"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("UpdateWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,decimal.Parse(drWeight["LEVEL"].ToString()),DateTime.Parse(drWeight["WHEN"].ToString()).ToUniversalTime(),int.Parse(drWeight["IS_BAD"].ToString()),drWeight["NOTE"].ToString()); db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); } } strWhere = " ORDER BY W.IS_BAD DESC, P.LASTNAME ASC, P.FIRSTNAME ASC,P.MIDDLENAME ASC"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("GetPatientLastWeight",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); dsLastWeighing = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strQuery); } catch(Exception ex) { throw ex; } finally { db = null; ds= null; dsWeight= null; } return dsLastWeighing; #endregion --Optimized Section-- #region Optimized Code Block try { StringBuilder strMain=new StringBuilder(); db = DatabaseFactory.CreateDatabase(); //StartTime=DateTime.Now.ToLongTimeString(); strWhere = "WHERE SESSION_ID = '"+pSessionID+"'"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("DeleteWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); //EndTime=DateTime.Now.ToLongTimeString(); //db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); strMain.append(strQuery+" "); strWhere = "WHERE LAB_ID = 0"; //StartTime=DateTime.Now.ToLongTimeString(); strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("InsertWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); //EndTime=DateTime.Now.ToLongTimeString(); //db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); strMain.append(strQuery+" "); strWhere = strWhere = "WHERE SESSION_ID = '"+pSessionID+"'"; //StartTime=DateTime.Now.ToLongTimeString(); strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("GetPatientID",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); //EndTime=DateTime.Now.ToLongTimeString(); //ds = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strQuery); strMain.append(strQuery+" "); //StartTime=DateTime.Now.ToLongTimeString(); ds = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strMain.ToString()); //EndTime=DateTime.Now.ToLongTimeString(); strMain=null; foreach(DataRow dr in ds.Tables[0].Rows) { //StartTime=DateTime.Now.ToLongTimeString(); if (db.ToString() == "Microsoft.Practices.EnterpriseLibrary.Data.SqlBase.SqlBaseDatabase") { strWhere = "WHERE LAB_ID=0 AND PAT_ID ="+ int.Parse(dr["PAT_ID"].ToString())+" AND WHEN IN(SELECT MAX(WHEN) FROM PATIENT_LAB WHERE LAB_ID=0 AND PAT_ID="+ int.Parse(dr["PAT_ID"].ToString())+")"; } else if (db.ToString() == "Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase") { strWhere = "WHERE LAB_ID=0 AND PAT_ID ="+ int.Parse(dr["PAT_ID"].ToString())+" AND [WHEN] IN(SELECT MAX([WHEN]) FROM PATIENT_LAB WHERE LAB_ID=0 AND PAT_ID="+ int.Parse(dr["PAT_ID"].ToString())+")"; } strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("GetWeight",db.ToString(),pFacilityID,pSessionID,strWhere,0,DateTime.Now.ToUniversalTime(),0,""); strMain.append(strQuery+" "); //EndTime=DateTime.Now.ToLongTimeString(); //dsWeight = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strQuery); /* foreach(DataRow drWeight in dsWeight.Tables[0].Rows) { strWhere = "WHERE PAT_ID = "+int.Parse(dr["PAT_ID"].ToString())+" AND SESSION_ID ='"+pSessionID+"'"; strQuery = SQ.BusinessLogic.SQLQueryFactory.GetPatientLastWeighing("UpdateWeightRecent",db.ToString(),pFacilityID,pSessionID,strWhere,decimal.Parse(drWeight["LEVEL"].ToString()),DateTime.Parse(drWeight["WHEN"].ToString()).ToUniversalTime(),int.Parse(drWeight["IS_BAD"].ToString()),drWeight["NOTE"].ToString()); db.ExecuteNonQuery(System.Data.CommandType.Text, strQuery); } */ } dsWeight = (DataSet) db.ExecuteDataSet(System.Data.CommandType.Text, strMain.ToString()); strMain=null; //StartTime=DateTime.Now.ToLongTimeString(); for(int i=0;i可以进一步优化..只需专注于最小化循环..我没有得到任何进一步的想法..任何帮助将不胜感激
1> Jon Skeet..:我会建议:
使用参数化SQL
摆脱catch块,或者至少使用"throw"而不是"throw ex",这样你就不会丢失信息
摆脱最后一块 - 它没有帮助你
在首次需要时声明变量,而不是在方法的顶部
将方法分解为更易于管理的部分
完成所有这些后,您将在一个更好的位置来调整性能.此时,分析应用程序并查看痛点实际上是在.NET代码中还是在与数据库的交互中.根据我的经验,数据库应用程序通常通过以
改进SQL查询
减少往返次数
优化数据库(应用索引等)