2010-08-13 2 views
1

이렇게하면 내 머리카락이 빠져 나옵니다. 우리는 WCF 서비스로 호스팅되는 워크 플로를 가지고 있으며,이 워크 플로는 다른 WCF 서비스를 호출하여 저장 프로 시저를 호출합니다. 저장 프로시 저는 병합을 호출 한 다음 다른 sproc을 호출하는 커서를 반복합니다. 커서 수는 병합의 소스 수와 같습니다. 소스 카운트가 높으면 (~ 120k), sproc은 결코 반환되지 않습니다. 디스크 활동 및 CPU 사용률은 0이며 메모리에 과세되지 않습니다. 그런 다음 SSMS에서 sproc을 호출하면 약 1 시간 후에 완료됩니다.SQL Server 2008 - SqlDataAdapter를 사용하여 WPF 서비스에서 호출 될 때 저장 프로 시저가 멈추다

SQLDataAdapter를 사용하여 실제 호출합니다. SDA가 모든 커서 반복에 대한 업데이트를받은 후 실패하여 SQL이 대기 상태가 될 때까지 멈추게합니까? 아니면 다른 일이 있습니까?

워크 플로 폴트의 원인을 추적하는 일찍 초반을 보냈기 때문에 반복되는 ANSI 경고 메시지가 SDA로 반환되어 메모리 부족 예외가 발생했기 때문에 SDA가 표시됩니다. . 어떤 문제가 여기에있어 커버 밑에서 다른 일이 일어나는지 궁금합니다.

+0

무슨 일이 일어나는지 SQL Profiler를 사용해 보았습니까? – Ryk

+0

그것은 단지 sproc가 시작되었음을 보여줍니다. 언급해야 할 것은이 프로세스는 이전에 원래 데이터베이스에서 잘 실행되었다는 것입니다. 그런 다음 해당 데이터베이스의 백업과 다른 이름으로 현재 데이터베이스를 복원했습니다. – Brian

답변

0

매개 변수 스니핑의 경우가 매우 나쁜 것으로 나타났습니다. 아주, 아주 나쁜 경우 ...

1

나는 WCF 호스트가 1 시간 동안 데이터베이스 호출을 유지하기에 적합한 환경이라는 것을 진지하게 생각하지 않는다 ... 당신은 Asynchronous procedure execution을 보길 권한다.이 데이터베이스에서 긴 데이터베이스 호출과 ASP/WCF 프로세스를 신뢰할 수있는 패션을 호출하고 HTTP 호출을 호출자에게 다시 보냅니다.

+0

불행히도 지금 당장이 옵션을 바꿀 수는 없습니다. – Brian

+0

나는 그 느낌을 안다. '우리는 지금 가스를 넣기 위해 멈출 수 없으며, 우리는 서두르고 있습니다.'라고 보통 더 잘 표현됩니다 ... –

+0

* Perfect * analogy. 한숨... – Brian

0

코드가 실제로 무엇을하는지 알기는 어렵지만 저장된 proc가 커서를 사용하고 있으며 저장된 proc이 느리다는 것을 언급합니다. 임시 테이블을 사용하기 위해 저장된 procs를 작성하고 다음 예제에서와 같이 임시 테이블을 반복합니다. 이로 인해 커서를 사용했을 때 몇 분에서 몇 시간 정도 걸릴 때 procs를 단 몇 초 만에 실행할 수있었습니다. 커서를 사용하고 프로파일 링이 저장된 proc의 커서 코드가 천천히 느리다면 임시 테이블에 시도해보십시오.

커서로 돌아 오지 못할 것입니다.

-- create a temporary table 
DECLARE @FrontDeskRows table (
    id int, 
    Arrival datetime, 
    Departure datetime, 
    CheckedIn int, 
    OwnerID varchar(50), 
    GuestID varchar(50), 
    [LName] varchar (256), 
    [FName] varchar (256), 
    [Address] varchar (256), 
    [City] varchar (256), 
    [State] varchar (256), 
    [Zip] varchar (256), 
    [phone] varchar (256), 
    [Status] int) 

-- load your temporary table 
INSERT INTO @FrontDeskRows 
    SELECT id, 
     Arrival, 
     Departure, 
     CheckedIn, 
     OwnerID, 
     GuestID, 
     [LName], 
     [FName], 
     [Address], 
     [City], 
     [State], 
     [Zip], 
     [phone], 
     [Status] 
    FROM FrontDesk 
    ORDER BY Id ASC 

DECLARE @arrival as DateTime 
DECLARE @departure as DateTime 
DECLARE @id as int 

-- loop over the temprary table 
SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows) 
SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id 
SELECT @departure = Departure FROM @FrontDeskRows Where id = @id 
    WHILE @id IS NOT NULL 
    BEGIN 

    -- PROCESS EACH ROW HERE 

    -- get the next item in the temporary table 
    SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows WHERE id > @id) 
    SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id 
    SELECT @departure = Departure FROM @FrontDeskRows Where id = @id 

    END 
관련 문제