最近有次在修改某段程式時,發現一段程式算法看起來簡單。
但背後因為多次查詢數據庫,導致效能問題。
這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的序號回傳
優化前的案例原碼如下
//預先檢查是否有存在的編號
string duplicateNumber = "";
for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
{
if (worksheet.Cells[row, ].Value != null)
{
var result = Conn.QueryFirst<int>(@"
SELECT 1 FROM TemplateNumber
WHERE SerialNumber = @SerialNumber ",
new
{
SerialNumber = worksheet.Cells[row, ].Value,
});
if (result == )
{
duplicateNumber += worksheet.Cells[row, ].Value;
}
}
}
從上述可以看到,對於每一行Row的資料,都進一次庫去做查詢比對
那在這種情況要怎麼修改呢? 其實仔細想一下查詢語句的轉換就行了
List<string> querySerialNum = new List<string>(); for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
{
if (worksheet.Cells[row, ].Value != null)
{
querySerialNum.Add(worksheet.Cells[row, ].Value.ToString());
}
}
var result = Conn.Query<string>(@"
SELECT SerialNumber FROM TemplateNumber
WHERE SerialNumber IN @SerialNumber ",
new
{
SerialNumber = querySerialNum
});
if (result.Any())
{
throw Exception(string.Join(";",result));
}
可以看到這次我把 Excel 的內容先放到一個陣例裡,最後改用 IN 的方式去將已存在的資料取出
這樣原本 N 次的庫查詢動作,現在只需要 1 次庫的查詢即可
看完後是不是感覺很簡單? 各位可以查看一下同事們寫的代碼裡,是否也有出現這樣的問題唷
咱們下次見!