利用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_LJfrom 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查询要快 但是要最后删除临时表中的数据,还是比较麻烦和耗时的,而且在插入临时表,联查表,删除临时表 三个事务前两个事务有问题 会导致临时表有脏数据。
事务生命周期 三个事务
①插入临时表
②联查表
③删除临时表
版本二:
```csharpforeach (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_LJfrom 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();}
这个会插入临时表,在联查完毕后,直接回滚,临时表中的数据就会取消插入,会保持临时表的洁净,以及事务的安全。
事务生命周期
开启事务–>插入临时表—>根据临时表联查数据----->回滚事务