首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 效能優化實戰:減少資料庫連線,善用記憶體與 LINQ

     編輯:ASP.NET 基礎

問題現場

  • 資料庫在國外,網站在內網,延遲高
  • 初始化 3000 筆資料,每筆再查詢其他表單一欄位 → 3000+ 次 DB 連線
  • 網路不穩時頁面載入極慢,甚至逾時

核心原則

盡量減少資料庫連線操作 —— 如同前端優化「減少 HTTP 請求」同理。

優化前(N+1 查詢)

foreach (var item in mainList) // 3000 筆
{
    string sql = "SELECT Col FROM OtherTable WHERE Id = " + item.Id;
    string val = DbHelper.ExecuteScalar(sql); // 每次開啟/關閉連線
    item.Extra = val;
}

優化後:一次撈回記憶體,LINQ 關聯

// 1. 一次查詢取得所有必要資料
var mainList = DbHelper.Query<MainEntity>("SELECT * FROM MainTable");
var extraList = DbHelper.Query<ExtraEntity>("SELECT Id, Col FROM OtherTable WHERE Id IN (...)");

// 2. 建立查找字典
var extraDict = extraList.ToDictionary(x => x.Id, x => x.Col);

// 3. 記憶體中關聯
foreach (var item in mainList)
{
    if (extraDict.TryGetValue(item.Id, out string val))
        item.Extra = val;
}

或直接用 LINQ Join:

var result = from m in mainList
             join e in extraList on m.Id equals e.Id
             select new { m.Id, m.Name, e.Col };

權衡取捨

  • 原則:「避免單一 SQL Join 超過 3 張表」
  • 實況:為解決效能災難,接受單次 SQL Join 4~5 張表
  • 結論:能跑起來、使用者能接受,優於完美架構但跑不動

延伸建議

  1. 使用 SqlDataAdapter.Fill(DataSet) 一次取回多張表
  2. 啟用連線池(預設開啟),確保連線字串一致
  3. 考慮 Redis/記憶體快取熱門查詢結果
  4. 大量寫入用 SqlBulkCopy 或 Table-Valued Parameters
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved