利用oracle默认事务隔离级别(提交读)提升多表联查速度

利用oracle默认事务隔离级别(提交读)提升查询速度)

背景介绍:
数据量大查询缓慢,添加太多条件,使用IN走了全表查询导致查询速度缓慢。

解决方案:
版本一:
新建临时表,在查询是将数据插入到临时表中,然后内联查询:
以C# 为例

                foreach (var item in boxModel)
                {
                    SFC_QUERY_TEMP temp_label = new SFC_QUERY_TEMP();
                    temp_label.ID = Guid.NewGuid().ToString("N").ToUpper();
                    temp_label.DATETIME_CREATED = DateTime.Now;
                    temp_label.ENTERPRISE_ID = EnterpriseId;
                    temp_label.ORG_ID = OrgId;
                    temp_label.OPERATION_ID = "INSERT";
                    temp_label.QUERY_ID = item.LABEL_NO.ToUpper().Trim();
                    temp_label.USER_CREATED = UserID;
                    temp_box_List.Add(temp_label);
                }
                using (MeiCloudDb db = new MeiCloudDb())
                {
                    db.Insert(temp_box_List);
                    from t1 in db.VM_SFC_BOX_LABEL_LJ
                    from t20 in db.SFC_QUERY_TEMP.InnerJoin(t => t.ENTERPRISE_ID == t1.ENTERPRISE_ID && t.ORG_ID == t1.ORG_ID && t.QUERY_ID == t1.BOX_NO)
                    select new SFC_BOX_LABEL_MODEL
                    { WORKSHOP_ID = t1.WORKSHOP_ID
               	 }
                }
               

这种会比IN查询要快 但是要最后删除临时表中的数据,还是比较麻烦和耗时的,而且在插入临时表,联查表,删除临时表 三个事务前两个事务有问题 会导致临时表有脏数据。
事务生命周期 三个事务
①插入临时表
②联查表
③删除临时表

版本二:


```csharp
 foreach (var item in boxModel)
                {
                    SFC_QUERY_TEMP temp_label = new SFC_QUERY_TEMP();
                    temp_label.ID = Guid.NewGuid().ToString("N").ToUpper();
                    temp_label.DATETIME_CREATED = DateTime.Now;
                    temp_label.ENTERPRISE_ID = EnterpriseId;
                    temp_label.ORG_ID = OrgId;
                    temp_label.OPERATION_ID = "INSERT";
                    temp_label.QUERY_ID = item.LABEL_NO.ToUpper().Trim();
                    temp_label.USER_CREATED = UserID;
                    temp_box_List.Add(temp_label);
                }
                using (MeiCloudDb db = new MeiCloudDb())
                {
                	//开始事务
                    db.BeginTransaction();
					//插入数据
                    db.BulkCopy(temp_box_List);
                    from t1 in db.VM_SFC_BOX_LABEL_LJ
                    from t20 in db.SFC_QUERY_TEMP.InnerJoin(t => t.ENTERPRISE_ID == t1.ENTERPRISE_ID && t.ORG_ID == t1.ORG_ID && t.QUERY_ID == t1.BOX_NO)
                    select new SFC_BOX_LABEL_MODEL
                    { WORKSHOP_ID = t1.WORKSHOP_ID
               	 }
               	 //回滚数据
               	  db.RollbackTransaction();
                }

这个会插入临时表,在联查完毕后,直接回滚,临时表中的数据就会取消插入,会保持临时表的洁净,以及事务的安全。
事务生命周期
开启事务–>插入临时表—>根据临时表联查数据----->回滚事务

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值