利用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();}
這個會插入臨時表,在聯查完畢后,直接回滾,臨時表中的數據就會取消插入,會保持臨時表的潔凈,以及事務的安全。
事務生命周期
開啟事務–>插入臨時表—>根據臨時表聯查數據----->回滾事務