I need more than 500000 rows that are stored in several tables. Getting all rows with my logic.
In this situation I write a stored procedure that is successfully executed in SQL Server browser, but when I run it from my C# code, a timeout exception occurred. 

Can anyone suggest how I can improve my stored procedure? 

```
CREATE PROCEDURE [dbo].[SP_ExtendedPTU]
(
    @SQLForPTU as varchar(MAX)  
)
AS
BEGIN TRAN
--DECLARE 
--@SQLForPTU 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 '+@SQLForPTU+'
'
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 @DeliveryQty=@ActualDeliveryQty-@ReturnQty
        SET @YetToDelivery=@JobOrderQty-@ActualDeliveryQty+@ReturnQty
        set @PTUDQty=(select sum(Qty) from PTUDistribution where ProductionTracingUnitID=@ProductionTracingUnitID )
        IF(@PTUDQty>@YetToDelivery)
        BEGIN--sih
            SET @StockInHand =@YetToDelivery
        END --sih
        ELSE
        BEGIN--sih2
            SET @StockInHand =@PTUDQty
        END --sih2          
        SET @YetToProduction=@JobOrderQty-@ReadyStockInhand-@ActualDeliveryQty+@ReturnQty
        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 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 JobID=@OrderID))                    
            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 JobID=@OrderID) AND ProductID=@ProductID          
            SET @ChangingQty=(SELECT ISNULL(SUM(Qty),0) FROM PIDeliverableProducts WHERE PIID=(SELECT PIID FROM Job WHERE JobID=@OrderID) AND ProductID=@ProductID)                 
            SELECT @MKTPersonID=EWYDLMarketingEmpID, @MerchandiserID=CmsBCPID FROM [PI] WHERE PIID=(SELECT PIID FROM Job WHERE JobID=@OrderID) 
            SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE ContactPersonnelID=@MerchandiserID)         
            SET @MKTPersonName =(SELECT [Name] FROM Employee WHERE EmployeeID=@MKTPersonID)     

            SET @BillAcceptanceValue=(select isnull(sum(Amount),0) from LCbill where EXportLCID=@LCID and [state] in (2,3,4))
            SET @BillMaturityValue =(select isnull(sum(Amount),0) from LCbill where EXportLCID=@LCID 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((@AcceptanceValue+@MaturityValue),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 ContractorID=@FactoryID)
            END--jam3

            SET @BuyerName=''
            IF(@BuyerID>0)
            BEGIN--jam4
                SET @BuyerName=(SELECT [Name] FROM Contractor WHERE ContractorID=@BuyerID)
            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 PTUID=@ProductionTracingUnitID)
            SET @ChangingQty=@PIQty
            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 SampleOrderID=@OrderID
            SET @AmendmentStatus=@OrderState
            IF(@DeliveryTo=3)
            BEGIN
                SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE ContactPersonnelID=@FactoryPersonnelID)     
            END

            IF(@DeliveryTo=2)
            BEGIN
                SET @MerchandiserName=(SELECT ISNULL([Name],'') FROM ContactPersonnel WHERE ContactPersonnelID=@BuyerPersonnelID)
            END
            SET @MKTPersonName =(SELECT [Name] FROM Employee WHERE EmployeeID=@OrderRcvBy)      

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

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

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

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

        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

```