2017-12-17 16 views
0

하루로드로 5 분이 걸립니다. 매개 변수화 된 저장 프로 시저로 변경하고 실행 계획에서 권장하는대로 인덱스를 적용하고 하루는 47 초로 떨어졌지만 월로드는 영원히 떨어졌습니다. 무엇이 문제 일 수 있습니까? 평균 일일로드는 약 50,000 행입니다.1 분 미만의 하루로드 및 1 달의로드는 테이블 변수에서 수 시간이 걸립니다.

USE [DBl] 

--[dbo].[ClosedOrder] StartDate, '@EndDate' 
ALTER PROCEDURE [dbo].[ClosedOrders] 
(@StartDate DATETIME 
    ,@EndDate DATETIME 
) 
AS 




DECLARE @temp_dec DECIMAL(15,2) = 0.00 
DECLARE @temp_int int  = NULL 
DECLARE @temp_str nvarchar(60) = NULL 
DECLARE @temp_date Date = NULL 
-- Michael Xia changes temp table to table variable on 05/24/2016 
DECLARE @lines TABLE 
(
    SalesOrderID nvarchar (20), 
    SalesOrderLine smallint, 
    CustomerID_SoldTo nvarchar (14), 
    OrderDate date, 

) 


INSERT INTO @lines 
SELECT 

-- multiple sub queries like below    
, (SELECT TOP 1 CAST(sh.ship_date AS DATE) 
    FROM dbl.dbo.[Shipments] sh (NOLOCK) 
    WHERE sh.co_num = coi.co_num AND sh.co_line = coi.co_line 
    AND sh.shipped=3 
    ORDER BY sh.ship_date DESC)    'DateLastShipped' 


---multiple update to the table variable using scalar function like below 
UPDATE @lines 
SET __ServiceLevelDays = CASE 
     WHEN ScheduledToShipDate = ShipNoLaterThanDate THEN 1 
     ELSE [dbl].[dbo].GetNumberOfBays(SchlShipDate,ShipNoLaterThanDate,1) + 1 
      END 


TRUNCATE TABLE [DBL].[dbo].[ClosedOrder] 

INSERT INTO [DBL].[dbo].[ClosedOrder] 

(

) 

SELECT 
* 
FROM @lines 


END 
+0

내가 이것을 조사하고 있었다면 (매월 INSERT INTO @ lines'에서) 서브 쿼리를 개별적으로 매월로드 매개 변수 값으로 실행하고 무엇이 두드러 지는지 살펴 보겠습니다. –

+0

프로 시저에서 입력 변수를 사용하지 않습니다. 아마도 당신은 전체 절차를 게시하지 않았을 것입니다. 어쨌든 이것은 매개 변수 스니핑 일 수 있습니다. SP에 'WITH RECOMPILE'을 추가하여 무차별 대처할 수 있습니다. 아니면 단지 많은 시간이 걸릴 수도 있습니다. 한 달에 몇 개의 기록이 있습니까? –

+0

변수는 SQL 에이전트 작업 단계에서 전달됩니다. 나는 물리적 테이블에 대한 select 문에서 재 컴파일 옵션을 사용했다. 우리는 한 달에 평균 430k를로드합니다. – Projack

답변

1

이 때문에, 매일 부하는 초 몇 (47초 정확한 예정), 당신은 임시 테이블을 생성하는 모든 날짜를 저장하고 다음 루프를 작성해야하고 매일을 추가하여 매월 부하를 수정해야한다 몇 분 (47 초 * 30 회) 사용 간접적으로 데이터베이스에 기록하기 전에 총 행 수가 메모리에 줄어 듭니다. 도움이 되길 바랍니다.

+2

아니요 데이터베이스에 루프를 사용하지 마십시오. –

+0

저장 프로 시저는 일일로드 용입니다. SQL 에이전트에서 하나의 시간 기록 만로드하면 나중에 일일로드가됩니다. 그러나 TempDB를 폭발시키지 않고 권장 사항을 구현하는 방법에 대한 예제를 제공 할 수 있습니까? – Projack