sqlserver 订单迁移的优化

场景 每天 数十万的的订单的迁移 随着基表的不断扩大 导致迁移越来越慢作了以下更改

 方案利用 sqlserver 函数@@rowcount 返回印象的函数 代替select count 返回的数量 优化 全表查询的次数哦

修改前的sql
DECLARE @count INT
SELECT @count = count(0) FROM  T_ORDER_TEMP h WHERE EXISTS (SELECT 1  FROM ##temp_order_history_insert WHERE id=h.ID)
and NOT EXISTS(SELECT 1 FROM T_ORDER ho WHERE ho.id=h.id)
while(0<@count)
BEGIN
Insert Into ##temp_order_history_insert_loop 
 SELECT top  5000  *
 FROM T_ORDER_TEMP h   WITH(NOLOCK)   WHERE EXISTS (SELECT 1  FROM ##temp_order_history_insert t WHERE t.id=h.ID) and NOT EXISTS(SELECT 1 FROM T_ORDER ho  WITH(NOLOCK)  WHERE ho.id=h.id) 
;
-- 创建分页的表
 BEGIN TRAN
update h set h.HISTORY_STATUS='1' FROM T_ORDER_TEMP h with(nolock) WHERE EXISTS (SELECT 1 from ##temp_order_history_insert_loop ih where h.id=ih.id);
INSERT into T_ORDER
SELECT  *
FROM ##temp_order_history_insert_loop;
COMMIT tran;
TRUNCATE TABLE ##temp_order_history_insert_loop;
SELECT @count = count(0) FROM  T_ORDER_TEMP h WHERE EXISTS (SELECT 1  FROM ##temp_order_history_insert WHERE id=h.ID)
and NOT EXISTS(SELECT 1 FROM T_ORDER ho WHERE ho.id=h.id)
END;
修改后的sql
while(1=1)
 BEGIN
 SELECT * Into #temp_order_history_insert_loop
  FROM (SELECT top  5000 *
  FROM T_ORDER_TEMP h   WITH(NOLOCK)   WHERE EXISTS (SELECT 1  FROM #temp_order_history_insert t WHERE t.id=h.ID) and NOT EXISTS(SELECT 1 FROM T_ORDER ho  WITH(NOLOCK)  WHERE ho.id=h.id))T;
 IF(@@ROWCOUNT<=0)
 BEGIN
  BREAK;
 END 
 -- 创建分页的表
 BEGIN TRAN
  update h set h.HISTORY_STATUS='1' FROM T_ORDER_TEMP h with(nolock) WHERE EXISTS (SELECT 1 from #temp_order_history_insert_loop ih where h.id=ih.id);
  INSERT into T_ORDER 
  SELECT  *
  FROM #temp_order_history_insert_loop;
 COMMIT tran;
 DROP TABLE #temp_order_history_insert_loop;
 --SELECT @count = count(0) FROM  T_ORDER_TEMP h WHERE EXISTS (SELECT 1  FROM #temp_order_history_insert WHERE id=h.ID)
 --and NOT EXISTS(SELECT 1 FROM T_ORDER ho WHERE ho.id=h.id)
 END;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值