oracle内的存储过程是通过游标返回结果集的
DataTable dt = new DataTable(); OracleParameter[] paras = new OracleParameter[5]; paras[0] = new OracleParameter("p_StartTime", OracleType.Char); paras[0].Value = StartTime; paras[1] = new OracleParameter("p_EndTime", OracleType.Char); paras[1].Value = EndTime; paras[2] = new OracleParameter("P_SelectStr", OracleType.VarChar); paras[2].Value = SelectStr; paras[3] = new OracleParameter("p_SubStation", OracleType.Char); paras[3].Value = SubID; paras[4] = new OracleParameter("io_cursor", OracleType.Cursor); paras[4].Direction = ParameterDirection.Output; dt = DBHelper.ExecuteTable("datacheck_handcheck.dc_handcheck_apsel", CommandType.StoredProcedure, paras); return dt;
var dr = cmd.ExecuteReader(); //指定FetchSize,每次讀取2000筆 dr.FetchSize = dr.RowSize * 2000; var count = 0; while (dr.Read()) count++;
我驚呆了!快了10倍,這麼多年來,居然不知道有這招?而FetchSize在單筆資料量大、筆數龐大的場合,最能展現威力。在本例中,RowSize約1K,1萬筆資料量約10MB,原本128KB要讀78次,修改FetchSize後只需讀6次,產生10倍的速度差異。
未來大家使用ODP.NET讀取大量資料如遇效能不佳,加入一行FetchSize設定就可能脫胎換骨,可多加利用。