• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    asp.net下數據庫操作優化一例

    來源:懂視網 責編:小采 時間:2020-11-27 22:43:01
    文檔

    asp.net下數據庫操作優化一例

    asp.net下數據庫操作優化一例:下面是最初實現的代碼,其中 LargerResultProcessor 是一個基類,負責遍歷泛型參數 T 所指向的數據庫表,并以每頁 100 項的方式分頁,并對每一項調用 ProcessItem 函數,而子類只需實現 ProcessItem 函數即可: 代碼如下:public class It
    推薦度:
    導讀asp.net下數據庫操作優化一例:下面是最初實現的代碼,其中 LargerResultProcessor 是一個基類,負責遍歷泛型參數 T 所指向的數據庫表,并以每頁 100 項的方式分頁,并對每一項調用 ProcessItem 函數,而子類只需實現 ProcessItem 函數即可: 代碼如下:public class It

    下面是最初實現的代碼,其中 LargerResultProcessor 是一個基類,負責遍歷泛型參數 T 所指向的數據庫表,并以每頁 100 項的方式分頁,并對每一項調用 ProcessItem 函數,而子類只需實現 ProcessItem 函數即可:
    代碼如下:

    public class ItemRenameCompanyId : LargerResultProcessor<Item>
    {
    protected override void ProcessItem(Item item)
    {
    const string template1 = @"select top 1 shop_id from orders where Item_id = '{0}'";
    var sql1 = string.Format(template1, item.Id);
    const string template2 = @"update Items set shop_id={0} where id = {1};
    update skus set shop_id={0} where item_id = {1};";
    try
    {
    var obj = DbEntry.Context.ExecuteScalar(sql1);
    var sql2 = string.Format(template2, long.Parse(obj.ToString()), item.Id);
    DbEntry.Context.ExecuteNonQuery(sql2);
    }
    catch (Exception exception)
    {
    Logger.Default.Warn(exception + item.Id.ToString());
    }
    }
    }

    上面這段代碼,邏輯比較簡單,針對每一項,使用 Select 語句取出 Shop_Id,并且執行 Update,只是有個問題,就是執行速度比較慢,對于我們 6 萬左右 Item,4 萬左右 Sku,99 萬左右 Order 的表,需要執行約 40 分鐘,才能轉換完畢。
    這些代碼,雖然是一次性操作,但是對于運行系統,停機時間越短越好,于是進行一些優化工作,數據庫對于大量重復的語句,如果使用參數的方式,因為可以避免對于語句的重復解析工作,所以速度會快一些,按照這個思路,簡單的修改如下:
    代碼如下:

    public class ItemRenameCompanyId : LargerResultProcessor<Item>
    {
    protected override void ProcessItem(Item item)
    {
    const string template1 = @"select top 1 shop_id from orders where Item_id = @id";
    const string template2 =
    @"update Items set shop_id=@sid where id = @id;
    update skus set shop_id=@sid where item_id = @id;";
    try
    {
    var sql1 = new SqlStatement(template1, new DataParameter("@id", item.Id));
    var sid = Convert.ToInt64(DbEntry.Context.ExecuteScalar(sql1));
    var sql2 = new SqlStatement(template2, new DataParameter("@sid", sid), new DataParameter("@id", item.Id));
    DbEntry.Context.ExecuteNonQuery(sql2);
    }
    catch (Exception exception)
    {
    Logger.Default.Warn(exception + item.Id.ToString());
    }
    }
    }

    測試這個程序,大概 25 分鐘可以完成轉換。有一些提高,不過,我們真正要修改的數據量并不大,一共只有 6 萬 加 4 萬 大約 10 萬條數據,所以 25 分鐘還是有些長了。簡單分析后,Orders 是最大的表,如果整體速度慢,則導致速度慢最大的可能因素,應該是查詢 Orders,所以稍換一個思路,提前把 Item_Id 和 Shop_Id 的對應關系查找出來,放到內存里,從而避免每次 ProcessItem 都要進行 Orders 表的查詢。至于內存里的數據,本來準備用 Dictionary 的,后來一想,Id 都是 long 型的數據,而且不能算“稀疏”矩陣,基本可以稱為“稠密”矩陣,所以,直接用數組應該是速度更快,所以先查詢出 Items 的最大 Id,用于設置數組大小,再按索引賦值即可:
    代碼如下:

    public class ItemRenameCompanyId : LargerResultProcessor<Item>
    {
    private readonly long[] _dic;
    public ItemRenameCompanyId()
    {
    var count = Convert.ToInt64(DbEntry.Context.ExecuteScalar("select top 1 Id from items order by id desc")) + 10;
    _dic = new long[count];
    var sql =
    new SqlStatement(
    "select items.id as xiid,orders.shop_id as xsid from items inner join orders on orders.item_id = items.id group by items.id,orders.shop_id")
    {SqlTimeOut = 300};
    dynamic list = DbEntry.Context.ExecuteDynamicList(sql);
    foreach(dynamic row in list)
    {
    _dic[row.xiid] = row.xsid;
    }
    }
    protected override void ProcessItem(Item item)
    {
    const string template2 =
    @"update Items set shop_id=@sid where id = @id;
    update skus set shop_id=@sid where item_id = @id;";
    try
    {
    var sid = _dic[item.Id];
    var sql2 = new SqlStatement(template2, new DataParameter("@sid", sid), new DataParameter("@id", item.Id));
    DbEntry.Context.ExecuteNonQuery(sql2);
    }
    catch (Exception exception)
    {
    Logger.Default.Warn(exception + item.Id.ToString());
    }
    }
    }

    再測試這一段程序,運行 70 秒就完成了數據轉換,另外,查詢對應關系那一句 SQL,因為針對的是剛恢復的數據庫,所以用了大概 3、40 秒,實際使用查詢管理器,在運行中的數據庫執行那一句 SQL,只需要 1 秒左右就可以完成,所以,估計在實際轉換的時候,3、40 秒就可以完成轉換了。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    asp.net下數據庫操作優化一例

    asp.net下數據庫操作優化一例:下面是最初實現的代碼,其中 LargerResultProcessor 是一個基類,負責遍歷泛型參數 T 所指向的數據庫表,并以每頁 100 項的方式分頁,并對每一項調用 ProcessItem 函數,而子類只需實現 ProcessItem 函數即可: 代碼如下:public class It
    推薦度:
    標簽: 操作 數據庫 優化
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久精品国产亚洲av瑜伽| 四虎成人精品| 久久久久99精品成人片牛牛影视 | 国产精品国产三级国产潘金莲| 亚洲国产另类久久久精品小说| 在线人成精品免费视频| 国产在线精品一区二区在线观看| 欧美精品亚洲人成在线观看| 99精品人妻少妇一区二区| 日韩精品极品视频在线观看免费| 亚洲精品岛国片在线观看| 国产精品狼人久久久久影院| 18国产精品白浆在线观看免费| 一区二区国产精品| 久久五月精品中文字幕| 国产精品无码素人福利| 日韩精品在线视频| 成人国内精品久久久久影院| 精品9E精品视频在线观看| 无码精品久久久久久人妻中字| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 精品国产VA久久久久久久冰| 国产乱人伦偷精品视频| 国产精品黄网站| 国内精品久久久久久久97牛牛| 中文字幕精品无码一区二区 | 精品无码人妻一区二区免费蜜桃| 欧美日韩精品一区二区三区不卡 | 久久久91精品国产一区二区三区| 亚洲AV无码精品色午夜果冻不卡 | 精品久久久久久久无码| 人妻一区二区三区无码精品一区| 91国内揄拍国内精品对白不卡| 国产成人精品2021| 亚洲av无码成人精品国产| 精品人妻少妇一区二区三区在线 | 精品久久久久一区二区三区| 777国产盗摄偷窥精品0OOO| 99久久久精品| 99久久婷婷免费国产综合精品| 久久久一本精品99久久精品88|