亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:25:38
字體:
來源:轉載
供稿:網友
下面是最初實現的代碼,其中 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 秒就可以完成轉換了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品日本在线| 国产精品盗摄久久久| 成人黄色午夜影院| 日韩精品一区二区三区第95| 亚洲国产精品小视频| 亚洲自拍小视频| 97超碰国产精品女人人人爽| 91国产美女视频| 国产精品欧美激情在线播放| 久久香蕉频线观| 久久久女女女女999久久| 久久婷婷国产麻豆91天堂| 国产精品久久在线观看| 久久乐国产精品| 亚洲成人亚洲激情| 国产黑人绿帽在线第一区| 中文字幕亚洲一区二区三区五十路| 成人精品一区二区三区| 欧美精品在线看| 欧美午夜女人视频在线| 日韩精品视频在线观看免费| 日韩电影在线观看永久视频免费网站| 中文字幕av一区二区三区谷原希美| 中文字幕日韩av| 日韩免费在线观看视频| 久久久久久久久久亚洲| 九九九热精品免费视频观看网站| 亚洲综合大片69999| 91九色蝌蚪国产| 91精品国产亚洲| 国产成人精品av在线| 欧美日韩激情视频8区| 日本欧美黄网站| 久久天天躁狠狠躁夜夜躁2014| 久久亚洲精品毛片| 国产69精品久久久久9| 色婷婷综合久久久久| 亚洲夜晚福利在线观看| 久久综合久中文字幕青草| 欧美日韩国产黄| 国产精品视频久| 国语自产精品视频在线看抢先版图片| 国产精品aaa| 久久精品国产69国产精品亚洲| 亚洲第一区在线观看| 日韩免费观看视频| 日韩av一区二区在线观看| 欧洲亚洲免费在线| 91在线观看免费高清完整版在线观看| 欧美日韩精品国产| 日本三级韩国三级久久| 成人写真福利网| 午夜精品久久久久久久白皮肤| 日韩一区av在线| 国产精品日韩在线一区| 国产成人精品国内自产拍免费看| 久久人人爽人人| 亚洲精品美女在线观看播放| 亚洲人成免费电影| 亚洲成人精品视频| 亚洲一区亚洲二区亚洲三区| 久久久久久久av| 久久综合色88| 日本a级片电影一区二区| 色樱桃影院亚洲精品影院| 欧美成人精品在线视频| 国产精自产拍久久久久久| 国产亚洲精品一区二555| 亚洲第一网站男人都懂| 久久久免费观看视频| 欧美色另类天堂2015| 国产精品久久久久高潮| 国产精品对白刺激| 91亚洲精品一区二区| 亚洲片在线观看| 国模精品视频一区二区三区| 91精品在线播放| 久久精品国产欧美激情| 亚洲欧洲一区二区三区在线观看| 欧美有码在线视频| 精品国偷自产在线视频| 日韩av免费在线看| 青青在线视频一区二区三区| 亚洲色图校园春色| 亚洲色图狂野欧美| 九九热精品视频在线播放| 热99在线视频| 亚洲国产成人精品久久| 亚洲www视频| 国产精品久久9| 日韩av黄色在线观看| 91精品视频在线看| 日韩视频中文字幕| 欧美午夜片在线免费观看| 亚洲精品中文字| 夜夜狂射影院欧美极品| 欧美激情视频播放| 日本一区二区不卡| 久久久爽爽爽美女图片| 欧美激情第三页| 日韩免费av片在线观看| 国产精品美女网站| 岛国av午夜精品| 久久精品99久久香蕉国产色戒| 久久久久一本一区二区青青蜜月| 成人黄色在线免费| 国产精品精品一区二区三区午夜版| 久久精品国产视频| 成人信息集中地欧美| 在线视频精品一| 日韩福利在线播放| 55夜色66夜色国产精品视频| 精品久久久久国产| 久久久这里只有精品视频| 一区二区欧美在线| 亚洲xxxx在线| 亚洲美女在线看| 亚洲va欧美va国产综合久久| 国产亚洲精品久久久久久| 成人黄色片在线| 亚洲成色www8888| 日本不卡免费高清视频| 中文字幕亚洲情99在线| 日韩欧美在线视频| 国产精品视频免费在线观看| 成人免费午夜电影| 国内揄拍国内精品少妇国语| 国产美女精品视频免费观看| 精品国内自产拍在线观看| 欧美在线一区二区视频| 91精品久久久久久综合乱菊| 精品视频在线观看日韩| 这里精品视频免费| 日韩精品欧美国产精品忘忧草| 日本高清久久天堂| 色吧影院999| 精品视频在线播放| 国内精品久久久久久久久| 在线观看久久久久久| 九九久久综合网站| 懂色av中文一区二区三区天美| 亚洲精品动漫100p| 亚洲欧美成人网| 中文字幕精品av| 国产精品尤物福利片在线观看| 国产精品99久久久久久www| 久久久久久网址| 亚洲福利在线播放| 日韩在线观看视频免费| 亚洲一区二区久久久久久| 亚洲黄色av女优在线观看| 欧美亚洲另类在线| 97免费视频在线| 国产一区二区三区在线免费观看| 国产不卡在线观看| 亚洲视频在线视频| 欧美亚洲午夜视频在线观看| 久久久国产精彩视频美女艺术照福利| 国产精品美女久久久久av超清| 久久久亚洲欧洲日产国码aⅴ| zzjj国产精品一区二区| 国内精品久久久久久| 国产成人精品视频在线观看| 91在线免费观看网站|