<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Bulkdelete 高效,穩(wěn)定刪除上億條數(shù)據(jù)。

      以下是一個基于 Entity Framework Extensions 的 BulkDelete 高效刪除海量數(shù)據(jù)的方案,包含性能優(yōu)化、穩(wěn)定性保障和錯誤處理機(jī)制:

      csharp
      using System;
      using System.Linq;
      using Z.EntityFramework.Plus;

      public class BulkDeleteService
      {
      private const int BatchSize = 50000; // 根據(jù)服務(wù)器內(nèi)存和網(wǎng)絡(luò)調(diào)整
      private const int MaxRetryAttempts = 3;
      private readonly TimeSpan RetryDelay = TimeSpan.FromSeconds(5);

      public void BulkDeleteRecords(MyDbContext context, DateTime deleteBefore)
      {
          var query = context.YourEntities
              .Where(x => x.CreatedDate < deleteBefore)
              .OrderBy(x => x.Id); // 按主鍵排序確保分頁穩(wěn)定
      
          int totalDeleted = 0;
          bool hasMoreData = true;
          
          var deleteOptions = new BulkDeleteOptions
          {
              BatchSize = BatchSize,
              UseTransaction = false, // 關(guān)閉事務(wù)提升性能
              CommandTimeout = 600,    // 適當(dāng)延長超時時間
              ExecuteHook = (x) => 
              {
                  // 內(nèi)存優(yōu)化配置
                  x.BatchTimeout = 60;
                  x.TrackingEntities = false;
              }
          };
      
          while (hasMoreData)
          {
              try
              {
                  // 分頁刪除(使用子查詢確保分頁準(zhǔn)確)
                  var subQuery = query.Take(BatchSize);
                  int deletedCount = RetryPolicy(() => subQuery.DeleteFromQuery(deleteOptions));
      
                  totalDeleted += deletedCount;
                  hasMoreData = deletedCount == BatchSize;
      
                  Console.WriteLine($"Deleted {totalDeleted:N0} records, LastID: {GetLastProcessedId(context)}");
                  
                  // 定期釋放資源
                  if (totalDeleted % (BatchSize * 10) == 0)
                  {
                      context.Dispose();
                      context = new MyDbContext();
                      query = context.YourEntities.Where(...); // 重建查詢
                  }
              }
              catch (Exception ex)
              {
                  LogError(ex, totalDeleted);
                  throw; // 根據(jù)業(yè)務(wù)需求決定是否終止
              }
          }
      }
      
      private int RetryPolicy(Func<int> action)
      {
          int attempts = 0;
          while (true)
          {
              try
              {
                  return action();
              }
              catch (SqlException ex) when (attempts < MaxRetryAttempts)
              {
                  if (IsTransientError(ex.Number))
                  {
                      attempts++;
                      Thread.Sleep(RetryDelay);
                      continue;
                  }
                  throw;
              }
          }
      }
      
      private bool IsTransientError(int errorNumber)
      {
          // SQL Server 瞬態(tài)錯誤代碼列表
          int transientErrors = { 4060, 40197, 40501, 40613, 49918, 49919, 49920, 4221 };
          return transientErrors.Contains(errorNumber);
      }
      
      private long GetLastProcessedId(MyDbContext context)
      {
          return context.YourEntities
              .OrderByDescending(x => x.Id)
              .Select(x => x.Id)
              .FirstOrDefault();
      }
      
      private void LogError(Exception ex, int processedCount)
      {
          // 記錄錯誤和當(dāng)前進(jìn)度到持久化存儲
          File.AppendAllText("delete_log.txt", 
              $"{DateTime.UtcNow:u} Error after {processedCount} records: {ex}\n");
      }
      

      }

      關(guān)鍵優(yōu)化點(diǎn):

      1. 分頁策略優(yōu)化:
      • 使用 Take(BatchSize).DeleteFromQuery() 確保準(zhǔn)確分頁
      • 按主鍵排序避免數(shù)據(jù)重復(fù)或遺漏
      • 通過子查詢實(shí)現(xiàn)穩(wěn)定分頁
      1. 性能增強(qiáng):
      • 禁用實(shí)體跟蹤 (TrackingEntities = false)
      • 批量提交而非事務(wù)包裹整個操作
      • 定期重建 DbContext 釋放內(nèi)存
      • 調(diào)整批量大小(建議5萬-10萬/批)
      1. 穩(wěn)定性保障:
      • 瞬態(tài)錯誤重試機(jī)制(支持SQL超時、連接中斷等)
      • 進(jìn)度記錄到文件(支持?jǐn)帱c(diǎn)續(xù)刪)
      • 獨(dú)立的錯誤日志記錄
      • 內(nèi)存泄漏預(yù)防(定期釋放上下文)
      1. 數(shù)據(jù)庫優(yōu)化建議:
        sql
        -- 執(zhí)行前建議操作
        ALTER DATABASE YourDB SET RECOVERY SIMPLE;
        EXEC sp_configure 'max server memory', '4096'; -- 根據(jù)服務(wù)器調(diào)整
        ALTER DATABASE YourDB SET DELAYED_DURABILITY = FORCED;

      -- 執(zhí)行后建議
      UPDATE STATISTICS YourTable WITH FULLSCAN;
      ALTER INDEX ALL ON YourTable REBUILD;

      1. 執(zhí)行策略:
      • 建議在低峰時段執(zhí)行
      • 提前備份目標(biāo)數(shù)據(jù)
      • 使用數(shù)據(jù)庫鏡像/AlwaysOn在從庫執(zhí)行
      • 監(jiān)控鎖狀態(tài)(sp_who2, sys.dm_tran_locks)
      1. 高級方案:
        csharp
        // 分區(qū)并行刪除(需要物理分區(qū))
        Parallel.ForEach(GetPartitionRanges(), range =>
        {
        using var ctx = new MyDbContext();
        ctx.YourEntities
        .Where(x => x.Id > range.Start && x.Id <= range.End)
        .DeleteFromQuery();
        });

      // 時間范圍分段刪除
      var dateRanges = GenerateDateChunks(deleteBefore);
      foreach (var range in dateRanges)
      {
      context.YourEntities
      .Where(x => x.CreatedDate >= range.Start && x.CreatedDate < range.End)
      .DeleteFromQuery();
      }

      注意事項(xiàng):

      1. 建議先在測試環(huán)境驗(yàn)證刪除邏輯
      2. 確保刪除條件字段有合適的索引(CreatedDate或ID)
      3. 監(jiān)控事務(wù)日志增長(特別是FULL恢復(fù)模式)
      4. 考慮使用Table Partitioning處理持續(xù)的大數(shù)據(jù)刪除

      對于超大規(guī)模數(shù)據(jù)(超過1億條),建議結(jié)合數(shù)據(jù)庫原生工具(如SQL Server的Partition Switching)實(shí)現(xiàn)秒級數(shù)據(jù)刪除。

      posted @ 2025-04-30 09:25  今天昔水  閱讀(246)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品一区精品二区制服| 胸大美女又黄的网站| 99RE6在线视频精品免费下载| 免费一本色道久久一区| 国产精品国产三级国产专i| 日本高清久久一区二区三区| 欧美日韩精品一区二区三区高清视频| 孝义市| 亚洲午夜亚洲精品国产成人| 国产成人精品午夜2022| 航空| 在线天堂中文新版www| 欧美成人午夜在线观看视频| 国产色婷婷精品综合在线 | 亚洲精品成人一二三专区| 国产不卡在线一区二区| 人人做人人妻人人精| 国产清纯在线一区二区| 亚洲另类欧美综合久久图片区| 午夜夜福利一区二区三区| 强奷乱码欧妇女中文字幕熟女| 日韩成人无码影院| 逊克县| 国产精品视频白浆免费视频| 一区二区三区国产不卡| 成人亚洲欧美成αⅴ人在线观看| 韩国精品福利视频一区二区| 日本国产精品第一页久久| 亚洲无线码一区在线观看| 亚洲偷自拍国综合| 伊人色综合久久天天| 亚洲成人av综合一区| 国产精品人妻一区二区高| 中文字幕午夜福利片午夜福利片97| 污网站在线观看视频| 亚洲av无码精品色午夜蛋壳| 国产精品无码av不卡| 亚洲人妻精品中文字幕| 亚洲日韩一区二区| 免费无码午夜福利片| 国产伦码精品一区二区|