zoukankan      html  css  js  c++  java
  • 一次 C# 查詢數據庫 算法優化的案例

    最近有次在修改某段程式時,發現一段程式算法看起來簡單。

    但背後因為多次查詢數據庫,導致效能問題。

    這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的序號回傳

    優化前的案例原碼如下

     //預先檢查是否有存在的編號
                    string duplicateNumber = "";
                    for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
                    {
                        if (worksheet.Cells[row, 1].Value != null)
                        {
                            var result = Conn.QueryFirst<int>(@"
                        SELECT 1 FROM TemplateNumber 
                        WHERE SerialNumber = @SerialNumber ",
                                new
                                {
                                    SerialNumber = worksheet.Cells[row, 1].Value,
                                });
                            if (result == 1)
                            {
                                duplicateNumber += worksheet.Cells[row, 1].Value;
                            }
                        }
                    }

    從上述可以看到,對於每一行Row的資料,都進一次庫去做查詢比對

    那在這種情況要怎麼修改呢? 其實仔細想一下查詢語句的轉換就行了

    List<string> querySerialNum = new List<string>();
    
                    for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
                    {
                        if (worksheet.Cells[row, 1].Value != null)
                        {
                            querySerialNum.Add(worksheet.Cells[row, 1].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 次庫的查詢即可

    看完後是不是感覺很簡單? 各位可以查看一下同事們寫的代碼裡,是否也有出現這樣的問題唷

    咱們下次見!

  • 相关阅读:
    RAID
    js 网页右下角提示框
    程序方式301
    c# ListView 虚拟模式 相关操作
    asp显示出错信息
    servu 9.3.0.1破解
    Linux下红色闪烁文件问题
    服务器实现定时开关机
    php进主页出现:HTTP 错误 500(Internal Server Error):服务器尝试执行请求时遇到了意外情况。
    怎样使用yum只下载一个包而不安装呢?
  • 原文地址:https://www.cnblogs.com/KingJaja/p/8810880.html
Copyright © 2011-2022 走看看