2012-05-02 10 views
-1

私はいくつかのテーブルに格納されている500000以上の行が必要です。私のロジックですべての行を取得する。 この状況では、SQL Serverブラウザで正常に実行されるストアドプロシージャを作成しますが、C#コードから実行するとタイムアウト例外が発生しました。SQL Serverで高速なストアドプロシージャを作成しますか?

誰でも私のストアドプロシージャを改善する方法を提案できますか?

CREATE PROCEDURE [dbo].[SP_ExtendedPTU] 
(
    @SQLForPTU as varchar(MAX) 
) 
AS 
BEGIN TRAN 
--DECLARE 
[email protected] as varchar(MAX) 
--SET @SQLForPTU= 'WHERE OrderID IN(4233)And OrderType =3' 

BEGIN--1 
DECLARE 
@ProductionTracingUnitID as int, 
@OrderID as int, 
@OrderType as smallint, 
@ProductID as int, 
@LabLabDipID as int, 
@ColorName as varchar(255), 
@PantonNo as varchar(127), 
@Shade as varchar(4), 
@DyeingOrderQty as decimal(30, 17), 
@JobOrderQty as decimal(30, 17), 
@ProductionPipeLineQty as decimal(30, 17), 
@ProductionFinishedQty as decimal(30, 17), 
@DeliveryQty as decimal(30, 17), 
@BuyerID as int, 
@FactoryID as int, 
@ProductionGraceQty as decimal(30, 17), 
@WeightLossGainQty as decimal(30, 17), 
@RateInLBS as decimal(30, 17), 
@State as smallint, 
@ProductionLossQty as decimal(30, 17), 
@ReturnQty as decimal(30, 17), 
@ActualDeliveryQty as decimal(30,17), 
@ReadyStockInhand as decimal(30, 17), 
@JobOrderQtyApproved as decimal(30, 17), 
@OrderNumber as varchar(50), 
@FactoryName as varchar(200), 
@BuyerName as varchar(200), 
@ProductName as varchar(200), 
@YetToDelivery as decimal(30,17), 
@StockInHand as decimal(30,17), 
@YetToProduction as decimal(30,17), 
@LCID as int, 
@LCNo as varchar(300), 
@PIQty as decimal(30,17), 
@ChangingQty as decimal(30,17), 
@SampleAdjQty as decimal(30,17), 
@SampleAdjValue as decimal(30,17), 
@MKTPersonID as int, 
@MKTPersonName as varchar(500), 
@MerchandiserID as int, 
@MerchandiserName as varchar(500), 
@AmendmentStatus as smallint, 
@AcceptanceValue as decimal(30,17), 
@MaturityValue as decimal(30,17), 
@BillAcceptanceValue as decimal(30,17), 
@BillMaturityValue as decimal(30,17), 
@BillAcceptancePercentage as decimal(30,17), 
@BillMaturityPercentage as decimal(30,17), 
@ExportLCValue as decimal(30,17), 
@Acceptance as varchar(100), 
@Maturity as varchar(100), 
@YarnCount as varchar(50), 
@PTUDQty as decimal(30,17), 
@ShadeFromOrder as smallint, 
@EWYDLRelabNo as varchar(100), 
@EWYDLColorNo as varchar(100), 
@DeliveryTo as int, 
@FactoryPersonnelID as int, 
@BuyerPersonnelID as int, 
@OrderRcvBy as int, 
@OrderState as smallint 

CREATE TABLE #TempTableOne(
          ProductionTracingUnitID int, 
          OrderID int, 
          OrderType smallint, 
          ProductID int, 
          DyeingOrderQty decimal(30,17), 
          JobOrderQty decimal(30,17), 
          ProductionPipeLineQty decimal(30,17), 
          ProductionFinishedQty decimal(30,17), 
          DeliveryQty decimal(30,17), 
          BuyerID int, 
          FactoryID int, 
          ProductionGraceQty decimal(30,17), 
          WeightLossGainQty decimal(30,17), 
          RateInLBS decimal(30,17), 
          ProductionLossQty decimal(30,17), 
          ActualDeliveryQty decimal(30,17), 
          ReadyStockInhand decimal(30,17), 
          OrderNumber varchar(50), 
          FactoryName varchar(200), 
          BuyerName varchar(200), 
          ProductName varchar(200), 
          ColorName varchar(200), 
          LabLabDipID int, 
          ReturnQty decimal(30,17), 
          YetToDelivery decimal(30,17), 
          StockInHand decimal(30,17), 
          YetToProduction decimal(30,17), 
          LCID int, 
          LCNo varchar(300), 
          PIQty decimal(30,17), 
          ChangingQty decimal(30,17), 
          SampleAdjQty decimal(30,17), 
          SampleAdjValue decimal(30,17), 
          MKTPersonID int, 
          MKTPersonName varchar(500), 
          MerchandiserID int, 
          MerchandiserName varchar(500), 
          AmendmentStatus smallint, 
          Acceptance varchar(100), 
          Maturity varchar(100), 
          YarnCount varchar(50),       
          EWYDLRelabNo varchar(50), 
          EWYDLColorNo varchar(50), 
          ShadeFromOrder smallint 
         ) 

--ProductionTracingUnitID,OrderID,OrderType,ProductID,LabLabDipID,ColorName,PantonNo,EWYDLColorNo,Shade,EWYDLRelabNo,DyeingOrderQty,JobOrderQty,ProductionPipeLineQty,ProductionFinishedQty,DeliveryQty,BuyerID,FactoryID,ProductionGraceQty,WeightLossGainQty,RateInLBS,State,ProductionLossQty,ShadeFromOrder,ReturnQty,ActualDeliveryQty,ReadyStockInhand,JobOrderQtyApproved 
DECLARE 
@SQL as varchar(MAX) 
SET @SQL= 
' 
    DECLARE Cur_AB1 CURSOR GLOBAL FORWARD_ONLY KEYSET FOR   
    SELECT ProductionTracingUnitID,OrderID,OrderType,ProductID,DyeingOrderQty,JobOrderQty,ProductionPipeLineQty,ProductionFinishedQty,BuyerID,FactoryID,ProductionGraceQty,WeightLossGainQty,RateInLBS,ProductionLossQty,ActualDeliveryQty,ReadyStockInhand,ColorName,LabLabDipID,ReturnQty,EWYDLRelabNo,EWYDLColorNo,ShadeFromOrder FROM ProductionTracingUnit '[email protected]+' 
' 
EXEC (@SQL) 

OPEN Cur_AB1 
FETCH NEXT FROM Cur_AB1 INTO @ProductionTracingUnitID,@OrderID,@OrderType,@ProductID,@DyeingOrderQty,@JobOrderQty,@ProductionPipeLineQty,@ProductionFinishedQty,@BuyerID,@FactoryID,@ProductionGraceQty,@WeightLossGainQty,@RateInLBS,@ProductionLossQty,@ActualDeliveryQty,@ReadyStockInhand,@ColorName,@LabLabDipID,@ReturnQty,@EWYDLRelabNo,@EWYDLColorNo,@ShadeFromOrder 
    WHILE(@@Fetch_Status <> -1) 
    BEGIN--2 
     SET @LCID=0 
     SET @LCNo='' 
     SET @PIQty=0 
     SET @AcceptanceValue =0 
     SET @MaturityValue= 0 
     SET @Acceptance= '' 
     SET @Maturity ='' 


     SET @[email protected]@ReturnQty 
     SET @[email protected]@[email protected] 
     set @PTUDQty=(select sum(Qty) from PTUDistribution where [email protected]) 
     IF(@PTUDQty>@YetToDelivery) 
     BEGIN--sih 
      SET @StockInHand [email protected] 
     END --sih 
     ELSE 
     BEGIN--sih2 
      SET @StockInHand [email protected] 
     END --sih2   
     SET @[email protected]@[email protected][email protected] 
     IF (@YetToProduction<0) 
     BEGIN 
      SET @YetToProduction=0 
     END 

     SET @ChangingQty=0 
     SET @SampleAdjQty=0 
     SET @SampleAdjValue=0 
     SET @MerchandiserID=0 
     SET @MerchandiserName='' 
     SET @MKTPersonID =0 
     SET @AmendmentStatus=0 
     SET @AcceptanceValue =0 
     SET @MaturityValue= 0 
     SET @Acceptance= '' 
     SET @Maturity ='' 


     SET @MKTPersonName ='' 
     SET @OrderNumber=''  
     IF(@OrderType=3) 
     BEGIN--jam1 
      SET @OrderNumber=(SELECT ISNULL(JobCode,'')+' - '+ISNULL(JobNo,'')+'/'+ISNULL(JobYear,'') FROM Job WHERE [email protected]) 
      SELECT @LCID=ISNULL(ExportLCID,0), @LCNo=ISNULL(ExportLCNo,''),@AmendmentStatus=AmendmentStatus,@ExportLCValue=Amount FROM ExportLC WHERE ExportLCID =(SELECT LCID FROM [PI] WHERE PIID=(SELECT PIID FROM Job WHERE [email protected]))      
      SELECT @PIQty=ISNULL(SUM(Qty),0), @SampleAdjQty=ISNULL(SUM(AdjQty),0), @SampleAdjValue=ISNULL(SUM(AdjValue),0) FROM PIProducts WHERE PIID=(SELECT PIID FROM Job WHERE [email protected]) AND [email protected]   
      SET @ChangingQty=(SELECT ISNULL(SUM(Qty),0) FROM PIDeliverableProducts WHERE PIID=(SELECT PIID FROM Job WHERE [email protected]) AND [email protected])     
      SELECT @MKTPersonID=EWYDLMarketingEmpID, @MerchandiserID=CmsBCPID FROM [PI] WHERE PIID=(SELECT PIID FROM Job WHERE [email protected]) 
      SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE [email protected])   
      SET @MKTPersonName =(SELECT [Name] FROM Employee WHERE [email protected])  


      SET @BillAcceptanceValue=(select isnull(sum(Amount),0) from LCbill where [email protected] and [state] in (2,3,4)) 
      SET @BillMaturityValue =(select isnull(sum(Amount),0) from LCbill where [email protected] and [state] in (5,6,7,8,9,10,12)) 

      IF(@ExportLCValue>0 and @ExportLCValue is not null) 
      BEGIN 
       SET @BillAcceptancePercentage =(@BillAcceptanceValue*100)/@ExportLCValue -- bill Percentage 
       SET @BillMaturityPercentage =(@BillMaturityValue*100)/@ExportLCValue 

       SET @AcceptanceValue=(@ChangingQty*@RateInLBS)*(@BillAcceptancePercentage/100)--Percentage Wise PI Valu   
       SET @MaturityValue=(@ChangingQty*@RateInLBS)*(@BillMaturityPercentage/100) 

       IF((@ChangingQty*@RateInLBS)>0 and (@ChangingQty*@RateInLBS) is not null) 
       BEGIN 
        SET @AcceptanceValue=(@AcceptanceValue*100)/(@ChangingQty*@RateInLBS)-- PI ValuePercentage 
        SET @MaturityValue=(@MaturityValue*100)/(@ChangingQty*@RateInLBS) 
       END 

       SET @Acceptance=Convert(varchar(20),(CONVERT(float,round((@[email protected]),0)))) +'%' 
       SET @Maturity =Convert(varchar(20),(CONVERT(float,round(@MaturityValue,0)))) +'%' 
      END 

      SET @FactoryName='' 
      IF(@FactoryID>0) 
      BEGIN--jam3 
       SET @FactoryName=(SELECT [Name] FROM Contractor WHERE [email protected]) 
      END--jam3 

      SET @BuyerName='' 
      IF(@BuyerID>0) 
      BEGIN--jam4 
       SET @BuyerName=(SELECT [Name] FROM Contractor WHERE [email protected]) 
      END--jam4 

     END--jam1 
     ELSE 
     BEGIN --jam2 IF Sample 
      SET @LCID=0 
      SET @LCNo='' 
      SET @OrderNumber='' 
      SET @PIQty=0  
      SET @DeliveryTo=0 
      SET @FactoryPersonnelID=0 
      SET @BuyerPersonnelID=0 
      SET @OrderRcvBy=0 
      SET @ChangingQty=0 
      SET @MerchandiserName='' 
      SET @MKTPersonName='' 
      SET @OrderState=0 
      SET @AmendmentStatus=0 
      SET @PIQty= (SELECT ISNULL(SUM(Qty),0) FROM SampleOrderDetail WHERE [email protected]) 
      SET @[email protected] 
      SELECT @OrderNumber=ISNULL(SampleOrderNo,''), @DeliveryTo=ISNULL(DeliveryTo,0),@FactoryPersonnelID=ISNULL(FactoryPersonnelID,0),@BuyerPersonnelID=ISNULL(BuyerPersonnelID,0),@OrderRcvBy=ISNULL(OrderRcvBy,0),@OrderState=ISNULL(OrderState,0) FROM SampleOrder WHERE [email protected] 
      SET @[email protected] 
      IF(@DeliveryTo=3) 
      BEGIN 
       SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE [email protected])  
      END 

      IF(@DeliveryTo=2) 
      BEGIN 
       SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE [email protected]) 
      END 
      SET @MKTPersonName =(SELECT [Name] FROM Employee WHERE [email protected])  

      IF(@DeliveryTo=3) 
      BEGIN 
       SET @FactoryName=(SELECT [Name] FROM Contractor WHERE [email protected]) 
      END 

      IF(@DeliveryTo=2) 
      BEGIN 
       SET @FactoryName=(SELECT [Name] FROM Contractor WHERE [email protected]) 
      END  

      SET @BuyerName='' 
      IF(@BuyerID>0) 
      BEGIN--jam4 
       SET @BuyerName=(SELECT [Name] FROM Contractor WHERE [email protected]) 
      END--jam4 
     END--jam2 

     SET @ProductName='' 
     SET @YarnCount ='' 
     SELECT @ProductName=('['+ Code+ '] '+ [Name]), @YarnCount =[Count] FROM Yarncategory WHERE [email protected]  

     INSERT INTO #TempTableOne Values(ISNULL(@ProductionTracingUnitID,0),ISNULL(@OrderID,0),ISNULL(@OrderType,0),ISNULL(@ProductID,0),ISNULL(@DyeingOrderQty,0),ISNULL(@JobOrderQty,0),ISNULL(@ProductionPipeLineQty,0),ISNULL(@ProductionFinishedQty,0),ISNULL(@DeliveryQty,0),ISNULL(@BuyerID,0),ISNULL(@FactoryID,0),ISNULL(@ProductionGraceQty,0),ISNULL(@WeightLossGainQty,0),ISNULL(CONVERT (decimal(18,2),@RateInLBS),0),ISNULL(@ProductionLossQty,0),ISNULL(@ActualDeliveryQty,0),ISNULL(@ReadyStockInhand,0),ISNULL(@OrderNumber,''),ISNULL(@FactoryName,''),ISNULL(@BuyerName,''),ISNULL(@ProductName,''),ISNULL(@ColorName,''),ISNULL(@LabLabDipID,0),ISNULL(@ReturnQty,0),ISNULL(@YetToDelivery,0),ISNULL(@StockInHand,0),ISNULL(@YetToProduction,0),ISNULL(@LCID,0),ISNULL(@LCNo,''),ISNULL(@PIQty,0),ISNULL(@ChangingQty,0),ISNULL(@SampleAdjQty,0),ISNULL(@SampleAdjValue,0),ISNULL(@MKTPersonID,0),ISNULL(@MKTPersonName,''),ISNULL(@MerchandiserID,0),ISNULL(@MerchandiserName,''),ISNULL(@AmendmentStatus,0),ISNULL(@Acceptance,''),ISNULL(@Maturity,''),ISNULL(@YarnCount,''),ISNULL(@EWYDLRelabNo,''),ISNULL(@EWYDLColorNo,''),ISNULL(@ShadeFromOrder,0)) 
FETCH NEXT FROM Cur_AB1 INTO @ProductionTracingUnitID,@OrderID,@OrderType,@ProductID,@DyeingOrderQty,@JobOrderQty,@ProductionPipeLineQty,@ProductionFinishedQty,@BuyerID,@FactoryID,@ProductionGraceQty,@WeightLossGainQty,@RateInLBS,@ProductionLossQty,@ActualDeliveryQty,@ReadyStockInhand,@ColorName,@LabLabDipID,@ReturnQty,@EWYDLRelabNo,@EWYDLColorNo,@ShadeFromOrder 
END--2 
CLOSE Cur_AB1 
DEALLOCATE Cur_AB1 
SELECT * FROM #TempTableOne Order By OrderID 
--Group By Product 
SELECT ProductID,ProductName, YarnCount, SUM(PIQty) as PIQty, SUM(ChangingQty) AS ChangingQty, SUM(SampleAdjQty) AS SampleAdjQty, SUM(SampleAdjValue) as SampleAdjValue, SUM(DyeingOrderQty) as DyeingOrderQty,SUM(JobOrderQty)AS JobOrderQty,SUM(ProductionPipeLineQty)as ProductionPipeLineQty,SUM(ProductionFinishedQty) as ProductionFinishedQty,SUM(DeliveryQty)as DeliveryQty,SUM(ProductionGraceQty)AS ProductionGraceQty,SUM(WeightLossGainQty) as WeightLossGainQty,SUM(ProductionLossQty)as ProductionLossQty,SUM(ActualDeliveryQty)as ActualDeliveryQty,SUM(ReadyStockInhand)as ReadyStockInhand, SUM(ReturnQty) AS ReturnQty,SUM(YetToDelivery)AS YetToDelivery,SUM(StockInHand)AS StockInHand,SUM(YetToProduction)AS YetToProduction FROM #TempTableOne GROUP BY ProductID,ProductName,YarnCount Order By ProductID 
--Group By Factory 
SELECT FactoryID,FactoryName,SUM(PIQty) as PIQty, SUM(ChangingQty) AS ChangingQty, SUM(SampleAdjQty) AS SampleAdjQty, SUM(SampleAdjValue) as SampleAdjValue, SUM(DyeingOrderQty) as DyeingOrderQty,SUM(JobOrderQty)AS JobOrderQty,SUM(ProductionPipeLineQty)as ProductionPipeLineQty,SUM(ProductionFinishedQty) as ProductionFinishedQty,SUM(DeliveryQty)as DeliveryQty,SUM(ProductionGraceQty)AS ProductionGraceQty,SUM(WeightLossGainQty) as WeightLossGainQty,SUM(ProductionLossQty)as ProductionLossQty,SUM(ActualDeliveryQty)as ActualDeliveryQty,SUM(ReadyStockInhand)as ReadyStockInhand, SUM(ReturnQty) AS ReturnQty,SUM(YetToDelivery)AS YetToDelivery,SUM(StockInHand)AS StockInHand,SUM(YetToProduction)AS YetToProduction FROM #TempTableOne GROUP BY FactoryID,FactoryName 
--Group By Order  
SELECT OrderID,OrderNumber,LCNo,FactoryID,FactoryName,BuyerID,BuyerName,SUM(PIQty) AS PIQty,SUM(ChangingQty) AS ChangingQty,SUM(SampleAdjQty) AS SampleAdjQty,SUM(SampleAdjValue) AS SampleAdjValue,MKTPersonID,MKTPersonName,MerchandiserID,MerchandiserName,AmendmentStatus,Acceptance,Maturity,SUM(DyeingOrderQty) as DyeingOrderQty,SUM(JobOrderQty)AS JobOrderQty,SUM(ProductionPipeLineQty)as ProductionPipeLineQty,SUM(ProductionFinishedQty) as ProductionFinishedQty,SUM(DeliveryQty)as DeliveryQty,SUM(ProductionGraceQty)AS ProductionGraceQty,SUM(WeightLossGainQty) as WeightLossGainQty,SUM(ProductionLossQty)as ProductionLossQty,SUM(ActualDeliveryQty)as ActualDeliveryQty,SUM(ReadyStockInhand)as ReadyStockInhand, SUM(ReturnQty) AS ReturnQty,SUM(YetToDelivery)AS YetToDelivery,SUM(StockInHand)AS StockInHand,SUM(YetToProduction)AS YetToProduction FROM #TempTableOne GROUP BY OrderID,OrderNumber,OrderNumber,LCNo,FactoryID,FactoryName,BuyerID,BuyerName,MKTPersonID,MKTPersonName,MerchandiserID,MerchandiserName,AmendmentStatus,Acceptance,Maturity 
--Default View 
SELECT OrderID,OrderNumber,LCNo,FactoryID,FactoryName,BuyerID,BuyerName,ProductID,ProductName,YarnCount,PIQty,ChangingQty,SampleAdjQty,SampleAdjValue,RateInLBS,MKTPersonID,MKTPersonName,MerchandiserID,MerchandiserName,AmendmentStatus,Acceptance,Maturity, SUM(DyeingOrderQty) as DyeingOrderQty,SUM(JobOrderQty)AS JobOrderQty,SUM(ProductionPipeLineQty)as ProductionPipeLineQty,SUM(ProductionFinishedQty) as ProductionFinishedQty,SUM(DeliveryQty)as DeliveryQty,SUM(ProductionGraceQty)AS ProductionGraceQty,SUM(WeightLossGainQty) as WeightLossGainQty,SUM(ProductionLossQty)as ProductionLossQty,SUM(ActualDeliveryQty)as ActualDeliveryQty,SUM(ReadyStockInhand)as ReadyStockInhand, SUM(ReturnQty) AS ReturnQty,SUM(YetToDelivery)AS YetToDelivery,SUM(StockInHand)AS StockInHand,SUM(YetToProduction)AS YetToProduction FROM #TempTableOne GROUP BY OrderID,OrderNumber,LCNo,FactoryID,FactoryName,BuyerID,BuyerName,ProductID,ProductName,YarnCount,PIQty,ChangingQty,SampleAdjQty,SampleAdjValue,RateInLBS,MKTPersonID,MKTPersonName,MerchandiserID,MerchandiserName,AmendmentStatus,Acceptance,Maturity 
DROP TABLE #TempTableOne 
END--1 
COMMIT TRAN 
+6

はい、高速にしたい場合はカーソルを使用しないでください。 –

+0

あなたは「SQL Server Browserで正常に実行されました」と言います...どれくらいかかりますか? –

+2

クエリプランを見たときに確認したボトルネック –

答えて

0

SQL Serverの実行計画を使用して、ボトルネックを特定できます。 可能であればカーソルを使用しないようにしてください。大量のデータがある場合は、#テーブルを作成する代わりに通常のテーブルを作成してください。

0

50万行を解析する場合、カーソルは非スターターです。これはあらゆる種類の問題を引き起こし、データが大きくなるにつれて、それはより遅くなり、遅くなります。より良いパフォーマンスを達成するにはいくつかの方法があります。すなわちではなく、あなたの一時テーブルに挿入する - すなわち選択バッチにできるだけ多くのデータを取得するSQLジョブ

2)を使用して、スナップショットテーブルにデータを平坦化 -

1)可能な場合は、一晩のデータをフェッチあなたのループの行ごとに行を検索すると、特定の列に必要なすべてのデータを取得するクエリを実行することができます。

3)これを一晩で行うことができず、常にこのようにしなければならない場合は、ディスクリートなストアドプロシージャとC#コード内からのループに変換します。そのようにして、ユーザーにフィードバックを提供することができます。おそらくプログレスバーの形になります。これはタイムアウトではなく、ユーザーが何かが計算されていることを知っていればどれくらい時間がかかりますか、彼らはどれくらい待たなければならないかを大まかに知っています。をしたい。

1

ここにはいくつかの問題があります。適切に書かれているように、この手順はインデックスに応じて約15秒で快適に実行する必要があります。

バルク処理でカーソルを使用できるのは、バルクプロセスでの更新のパーティション分割だけです。つまり、すべてのレコードを更新するために反復処理を必要とするカーソルを使用しないでください。全体の手順は50万回繰り返す必要があり、それは非常に遅くなるでしょう。 tempテーブルを使用してデータを挿入し、そのテーブルを使用して更新を実行します。以下のコードに示すように、一時索引付きの一時表を索引付けすることは可能です。テンポラリテーブルとライブテーブルの両方について、WHERE句で使用されているフィールドがインデックスに登録されていることを確認します。

CREATE TABLE #Temp2 (
    ProductionTracingUnitID int, 
    OrderID int, 
    OrderType smallint, 
    ProductID int, 
    DyeingOrderQty decimal(30, 17), 
    JobOrderQty  decimal(30, 17), 
    ProductionPipeLineQty decimal(30, 17), 
    ProductionFinishedQty decimal(30, 17), 
    BuyerID  int, 
    FactoryID int, 
    ProductionGraceQty decimal(30, 17), 
    WeightLossGainQty decimal(30, 17), 
    RateInLBS decimal(30, 17), 
    ProductionLossQty decimal(30, 17), 
    ActualDeliveryQty decimal(30,17), 
    ReadyStockInhand decimal(30, 17), 
    ColorName varchar(255), 
    LabLabDipID  int, 
    ReturnQty decimal(30, 17), 
    EWYDLRelabNo varchar(100), 
    EWYDLColorNo varchar(100), 
    ShadeFromOrder smallint 
) 
CREATE NONCLUSTERED INDEX #IX_Temp2_1 ON #Temp2(ProductionTracingUnitID) 
CREATE NONCLUSTERED INDEX #IX_Temp2_2 ON #Temp2(OrderID) 
CREATE NONCLUSTERED INDEX #IX_Temp2_3 ON #Temp2(ProductID) 

DECLARE @SQL as varchar(MAX) 
SET @SQL= 
' 
    SELECT ProductionTracingUnitID,OrderID,OrderType,ProductID,DyeingOrderQty,JobOrderQty,ProductionPipeLineQty,ProductionFinishedQty,BuyerID,FactoryID,ProductionGraceQty, 
     WeightLossGainQty,RateInLBS,ProductionLossQty,ActualDeliveryQty,ReadyStockInhand,ColorName,LabLabDipID,ReturnQty,EWYDLRelabNo,EWYDLColorNo,ShadeFromOrder 
    FROM ProductionTracingUnit '[email protected] 
INSERT INTO #Temp2 (ProductionTracingUnitID, OrderID, OrderType, ProductID, DyeingOrderQty, JobOrderQty, ProductionPipeLineQty, 
     ProductionFinishedQty, BuyerID, FactoryID, ProductionGraceQty, WeightLossGainQty, RateInLBS, ProductionLossQty, ActualDeliveryQty, 
     ReadyStockInhand, ColorName, LabLabDipID, ReturnQty, EWYDLRelabNo, EWYDLColorNo, ShadeFromOrder) 
EXEC (@SQL) 

次に、一括処理を行う場合は、行ごとに実行する必要があるサブクエリの使用を避けてください。

SELECT @LCID=ISNULL(ExportLCID,0), @LCNo=ISNULL(ExportLCNo,''),@AmendmentStatus=AmendmentStatus,@ExportLCValue=Amount 
FROM ExportLC e, [PI] p, Job j 
WHERE e.ExportLCID = p.LCID 
AND p.PIID = j.PIID 
AND j.JobID = @OrderID 

カーソルを使用せずに手順を書き換え、これはより多くなります:

SELECT @LCID=ISNULL(ExportLCID,0), @LCNo=ISNULL(ExportLCNo,''),@AmendmentStatus=AmendmentStatus,@ExportLCValue=Amount 
FROM ExportLC WHERE ExportLCID =(SELECT LCID FROM [PI] WHERE PIID=(SELECT PIID FROM Job WHERE [email protected]))      

このように、参加すると言い換え考えてみましょう:次の行は、時代の最高の状態で、非常に遅くなります線に沿って:

UPDATE #Temp2 SET LCID = ISNULL(ExportLCID, 0), LCNo = ISNULL(ExportLCNo, 0), ... 
FROM #Temp2 t, ExportLC e, [PI] p, Job j 
WHERE e.ExportLCID = p.LCID 
AND p.PIID = j.PIID 
AND j.JobID = t.OrderID 

あり、このすべての作業を取得するために仕事のかなりのビットがある、と私はそのような化合物のプロセスのためのテスト環境を作成することは困難です。しかし、私はこれがあなたに十分に進むべきだと思う。あなたが立ち往生したら教えてください。

関連する問題