多线程提升由多组只作条件查询速度(oracle数据库)原创
金蝶云社区-云社区用户26064194
云社区用户26064194
2人赞赏了该文章 367次浏览 未经作者许可,禁止转载编辑于2021年10月29日 10:40:29
using Kingdee.BOS;
using Kingdee.BOS.Log;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.FIN.App.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace HANS.SupplierSupplyRatio
{
    internal class MutiThreadQry
    {
    static volatile object lockor = new object();

        public static void MTQry(Context context)
        {
            Monitor.Enter(lockor);
            string targetTableName = CommonFunction.GetTempTableName(context);
            DBServiceHelper.Execute(context, string.Format(@"/*dialect*/ create table {0} as  SELECT t0.FBILLNO FBILLNOKEY, t0.FID FBILLIDKEY, t1.FSeq FBILLSEQKEY, t1.FENTRYID FENTRYIDKEY, 1 FID, '16' FENTRYID, 'PRD_PickMtrl' FBILLFROMID, 'GENERAL' FTRANSFERDIRECT, '2' FADJCOSTBILLTYPE, '0' FISOTHERACCTG, '0' FINOUTINDEX, '8' FOUTINSTOCKTYPE, t1.FMATERIALID FMATERIALFIELD, t0.FDATE FBILLDATEFIELD, t1_A.FPARENTOWNERTYPEID FCARGOOWNERTYPE, t1_A.FPARENTOWNERID FCARGOOWNERID, t0.FSTOCKORGID FSTOCKORGFIELD, t0.FDOCUMENTSTATUS FBILLSTATE, ' ' FAUXPROPNAME, ' ' FSTOCKLOCNAME, ' ' FSPECIALNAME, ' ' FCUSTOMIZATION, ' ' FVOUCHERNO, t0.FCREATORID FCREATORID, t0.FAPPROVERID FAUDITORID, N' ' FSERIALNUM, 0 FLOCALAMOUNT, t0_L.FDESCRIPTION FMEMO, N' ' FSRCBILLNO, N' ' FSRCBILLSEQ, t1.FSTOCKID FSTOCKFIELD, t1.FSTOCKLOCID FSTOCKLOCFIELD, t1.FBASEUNITID FBASICUNITFIELD, t1.FLOT FBATCHFIELD, t1.FAUXPROPID FAIDPROPERTYFIELD, t1_A.FBASESTOCKACTUALQTY FQTYFIELD, NVL(s2_c.FPRICE, t1.FPRICE) FPRICEFIELD, NVL(s2_c.FAMOUNT_LC, 0) FAMOUNTFIELD, t1.FWORKSHOPID FDEPTFIELD, t0.FBILLTYPE FBILLTYPEID, N' ' CREATORID_ID, N' ' STOCKORGID_ID FROM T_PRD_PICKMTRL T0 INNER JOIN T_PRD_PICKMTRLDATA T1 ON t0.FID = t1.FID INNER JOIN T_PRD_PICKMTRLDATA_A T1_A ON t1.FENTRYID = t1_A.FENTRYID LEFT OUTER JOIN T_PRD_PICKMTRL_L T0_L ON (t0.FID = t0_L.FID AND t0_L.FLocaleId = 2052) LEFT OUTER JOIN t_BD_StockStatus ST128 ON t1.FSTOCKSTATUSID = st128.FStockStatusId LEFT OUTER JOIN T_PRD_PICKMTRLDATA_C S2_C ON (s2_c.FENTRYID = t1.FENTRYID AND (s2_c.FDIMENSIONID IN (1, 120, 15, 5, 139, 121, 140, 141, 142, 148, 149, 155, 156))) WHERE 1=2 and (((((((((((t1_A.FENTRYVMIBUSINESS = '0' AND t1_A.FOWNERTYPEID = 'BD_OwnerOrg') AND t1_A.FPARENTOWNERTYPEID = 'BD_OwnerOrg') AND (t0.FDOCUMENTSTATUS <> 'Z')) AND t0.FCANCELSTATUS = 'A') AND (t1_A.FBASESTOCKACTUALQTY > 0)) AND (st128.FTYPE <> '8')) AND 1 = 1) AND (t0.FDATE >= sysdate-450)) AND (t0.FDATE < sysdate-360)) AND (t1_A.FPARENTOWNERID IN (1))) AND t0.FFORMID = 'PRD_PickMtrl')", targetTableName));

            string strOrg = "1, 298255, 298256, 298257, 298258, 298259, 298260, 298261, 298262, 298263, 298264, 298265, 298266, 298267, 298268, 298269, 298270, 298271, 298272, 298273, 298274, 298275, 298276, 298277, 298278, 298279, 298280, 298281, 298282, 298283, 298284, 298285, 298286, 298287, 298288, 298289, 298290, 298291, 298292, 298293, 298294, 298296, 298297, 245008, 298299, 298300, 298301, 298302, 298303, 298304, 298305, 298306, 298307, 298308, 298309, 298310, 298311, 298312, 298313, 298314, 298315, 298316, 298317, 298318, 298319, 298320, 298321, 298322, 298323, 298324, 298325, 298326, 298327, 298328, 298329, 298330, 298331, 298333, 298334, 298335, 298336, 298337, 298338, 298339, 298340, 298341, 298342, 298343, 298344, 298345, 298346, 298347, 298348, 298349, 298350, 298351, 298352, 298353, 298354, 298355, 298356, 298357, 298358, 298359, 298360, 298361, 298362, 298363, 298364, 298365, 298369, 298370, 298371, 298372, 298373, 298374, 298375, 298376, 298377, 298378, 298379, 298380, 298381, 298382, 70698386, 76777400, 70243721, 70243724, 70243727, 90984089, 90984091, 98595165, 98595158, 86878528, 86879012";
            string[] arrOrg = strOrg.Split(',');
            //任务集合
            List<Task> mTask = new List<Task>();
            //总记录数
            long totalRecord = arrOrg.Length;
            //每页大小
            long pageSize = 10000L;
            //一共有多少页
            long totalPage = (totalRecord + pageSize - 1L) / pageSize;
            //当前页
            long currentPageIndex = 1L;

            while (currentPageIndex <= totalPage)
            {
                var arrCurrentOrg = arrOrg.Skip(Convert.ToInt32((currentPageIndex - 1L) * pageSize)).Take(Convert.ToInt32(pageSize));
                var strCurrentOrg = string.Join(",", arrCurrentOrg);
                var task = Task.Factory.StartNew(() =>
                {
                    Write(context, targetTableName, strCurrentOrg);
                });
                mTask.Add(task);
                currentPageIndex = currentPageIndex + 1;
            }
            Monitor.Exit(lockor);

            try
            {
                Task.WaitAll(mTask.ToArray());
            }
            catch (AggregateException ex)
            {
                Logger.Error("HANS.SupplierSupplyRatio.MTQry", "多线程运行产生异常!", ex);
            }

            CommonFunction.DropTempTable(context, targetTableName, true);
        }


        static void Write(Context context, string targetTableName, string orgIds)
        {
            var strInsertSQL = string.Format(strFields, targetTableName, orgIds);
            DBServiceHelper.Execute(context, strInsertSQL);
        }


        const string strFields = @"/*dialect*/ INSERT /*+ parallel(4) */  INTO {0} (FBillNoKey, FBillIdKey, FBillSeqKey, FEntryIdKey, FID, FEntryId, FBillFromId, FTransferDirect, FAdjCostBillType, FIsOtherAcctg, FInOutIndex, FOutInStockType, FMaterialField, FBillDateField, FCargoOwnerType, FCargoOwnerId, FStockOrgField, FBillState, FAuxPropName, FStockLocName, FSpecialName, FCustomization, FVoucherNo, FCreatorId, FAuditorId, FSerialNum, FLocalAmount, FMemo, FSrcBillNo, FSrcBillSeq, FStockField, FStockLocField, FBasicUnitField, FBatchField, FAidPropertyField, FQtyField, FPriceField, FAmountField, FDEPTFIELD, FBillTypeId, CreatorId_Id, StockOrgID_Id) 

SELECT t0.FBILLNO FBILLNOKEY, t0.FID FBILLIDKEY, t1.FSeq FBILLSEQKEY, t1.FENTRYID FENTRYIDKEY, 1 FID, '16' FENTRYID, 'PRD_PickMtrl' FBILLFROMID, 'GENERAL' FTRANSFERDIRECT, '2' FADJCOSTBILLTYPE, '0' FISOTHERACCTG, '0' FINOUTINDEX, '8' FOUTINSTOCKTYPE, t1.FMATERIALID FMATERIALFIELD, t0.FDATE FBILLDATEFIELD, t1_A.FPARENTOWNERTYPEID FCARGOOWNERTYPE, t1_A.FPARENTOWNERID FCARGOOWNERID, t0.FSTOCKORGID FSTOCKORGFIELD, t0.FDOCUMENTSTATUS FBILLSTATE, ' ' FAUXPROPNAME, ' ' FSTOCKLOCNAME, ' ' FSPECIALNAME, ' ' FCUSTOMIZATION, ' ' FVOUCHERNO, t0.FCREATORID FCREATORID, t0.FAPPROVERID FAUDITORID, N' ' FSERIALNUM, 0 FLOCALAMOUNT, t0_L.FDESCRIPTION FMEMO, N' ' FSRCBILLNO, N' ' FSRCBILLSEQ, t1.FSTOCKID FSTOCKFIELD, t1.FSTOCKLOCID FSTOCKLOCFIELD, t1.FBASEUNITID FBASICUNITFIELD, t1.FLOT FBATCHFIELD, t1.FAUXPROPID FAIDPROPERTYFIELD, t1_A.FBASESTOCKACTUALQTY FQTYFIELD, NVL(s2_c.FPRICE, t1.FPRICE) FPRICEFIELD, NVL(s2_c.FAMOUNT_LC, 0) FAMOUNTFIELD, t1.FWORKSHOPID FDEPTFIELD, t0.FBILLTYPE FBILLTYPEID, N' ' CREATORID_ID, N' ' STOCKORGID_ID FROM T_PRD_PICKMTRL T0 INNER JOIN T_PRD_PICKMTRLDATA T1 ON t0.FID = t1.FID INNER JOIN T_PRD_PICKMTRLDATA_A T1_A ON t1.FENTRYID = t1_A.FENTRYID LEFT OUTER JOIN T_PRD_PICKMTRL_L T0_L ON (t0.FID = t0_L.FID AND t0_L.FLocaleId = 2052) LEFT OUTER JOIN t_BD_StockStatus ST128 ON t1.FSTOCKSTATUSID = st128.FStockStatusId LEFT OUTER JOIN T_PRD_PICKMTRLDATA_C S2_C ON (s2_c.FENTRYID = t1.FENTRYID AND (s2_c.FDIMENSIONID IN (1, 120, 15, 5, 139, 121, 140, 141, 142, 148, 149, 155, 156))) WHERE (((((((((((t1_A.FENTRYVMIBUSINESS = '0' AND t1_A.FOWNERTYPEID = 'BD_OwnerOrg') AND t1_A.FPARENTOWNERTYPEID = 'BD_OwnerOrg') AND (t0.FDOCUMENTSTATUS <> 'Z')) AND t0.FCANCELSTATUS = 'A') AND (t1_A.FBASESTOCKACTUALQTY > 0)) AND (st128.FTYPE <> '8')) AND 1 = 1) AND (t0.FDATE >= sysdate-450)) AND (t0.FDATE < sysdate-360)) AND (t1_A.FPARENTOWNERID IN ({1}))) AND t0.FFORMID = 'PRD_PickMtrl')";

    }
}


赞 2