私はいくつかのテーブルに格納されている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
はい、高速にしたい場合はカーソルを使用しないでください。 –
あなたは「SQL Server Browserで正常に実行されました」と言います...どれくらいかかりますか? –
クエリプランを見たときに確認したボトルネック –