2011-08-09 2 views
1

SQL Server 최적화에 대한 일반적인 질문이 하나 있습니다. 저장 프로 시저에서 읽기 수를 어떻게 줄일 수 있습니까?SQL Server - 읽기 횟수 줄이기

내가 좋아하는 모범 사례에 관심이 있어요 : - DDL DML 전에 - - 대신 절차 에서 같은 테이블에 몇 시간을 사용하여 임시 테이블을 사용 - 신체의 인덱스와 임시 테이블 을 만드는 저장의 시작 부분에 NOCOUNT ON SET 프로 시저 ...

우리는 몇 개의 저장 프로 시저로 인해 발생하는 많은 읽기 때문에 디스크 공간에 문제가 있으며이를 최적화해야합니다. '가장 비싼'는 저장 프로 시저의

부분은 다음과 같습니다

create table #stavke 
( 
    Id_Br int identity(1, 1), IDStavke int, 
    HeaderID int, Currency varchar(3), GLAcct varchar(20), id varchar(20), Trnuid varchar(60), 
    ReferenceID varchar(20), DocumentID varchar(20), 
    DtAvail varchar(10), DtBooking varchar(10), DatePosted varchar(10), 
    Amount money, AmountLcl money, 
    Description varchar(250), Type varchar(10), DP int ) 
insert into #stavke 
    ( 
    IDStavke, HeaderID, GLAcct, Currency, id , Trnuid , 
    ReferenceID, DocumentID , 
    DtAvail , DtBooking , DatePosted, 
    Amount , AmountLcl , 
    Description , Type , DP 
) 

SELECT S.ID as IDStavke, 
    z.RB as HeaderID, 
    z.KONTO AS GLAcct, 
    z.OZNVAL AS Currency, 
    Si.BROJNALOGA as ID, 
    D.TRN as Trnuid, 
    case substring(SI.BROJNALOGA,1,4) 
     when '0746' then O.REFERENCA 
     when '1450' then D.REFERENCA 
     when '0743' then L.REFERENCA 
     when '2021' then N.REFERENCA 
    end ReferenceID, 
    case substring(SI.BROJNALOGA,1,4) 
     when '3000' then 'Kursna razlika' 
     when '2200' then 'PP-'+SI.BROJNALOGA 
     when '2201' then 'KDP-'+SI.BROJNALOGA 
     else SI.BROJNALOGA 
    end DocumentID, 
    dvalute as DtAvail, 
    si.dknizenja as DtBooking, 
    '' as DatePosted,   
    case si.teret 
     when 0 then si.korist 
     else si.teret 
    end Amount, 
    case SI.DINTERET 
     when 0 then si.dinkorist 
     else si.dinteret 
    end AmountLcl, 
    '' as Description, 
    case substring(SI.BROJNALOGA,1,4) 
     when '0746' then '0746' 
     when '1450' then '1450' 
     when '0743' then '0743' 
     when '2021' then 'Ostalo' 
    end Type, 
    case SI.DINTERET 
     when 0 then 1 
     else -1 
    end DP 
FROM  A I 
inner join B st on i.transfer=st.transfer and i.partija=st.partija 
INNER JOIN C SI ON st.RB=Si.RB 
inner join D z on z.rb=st.rb 
inner join E s on z.rb=s.rb AND s.BROJNALOGA = si.BROJNALOGA 
LEFT JOIN F D ON D.BROJ=SI.BROJNALOGA 
LEFT JOIN G L ON L.BROJ=SI.BROJNALOGA 
LEFT JOIN H O ON O.BROJ=SI.BROJNALOGA 
LEFT JOIN I N ON N.BROJ=SI.BROJNALOGA 
WHERE I.novi_izvod=convert(int,@StatementNumber) AND [email protected] 
ORDER BY I.PARTIJA,z.RB,SI.id, z.KONTO,z.OZNVAL, SI.DKNIZENJA 

테이블 B, G, H와 나는 (I 읽기 쉽도록하기 위해, 예를 들어 테이블의 실제 이름을 변경)입니다 매우 큰, 즉 많은 컬럼과 많은 양의 데이터를 가지고 있습니다.

자세한 정보가 필요하면 내 게시물을 편집하십시오.

TnX 미리!

네마냐

+4

환경에 ** READS ** 디스크 공간 문제가 발생하는 이유는 무엇입니까? – JNK

+0

그것은 매우 광범위한 질문이며 많은 책이 헌정되어 있습니다. 좀 더 구체적인 질문을하면 (X를 어떻게 최적화 할 수 있습니까?) 코드와 스키마를 제공하는 것이 더 나을 것입니다. –

+0

여기에 특정 질문이 필요하다는 데 동의합니다. 몇 가지 문제가 있으면 저장 프로 시저를 게시하고 최적화 방법을 묻습니다. – Paparazzi

답변

5

나는 당신이 절차에 의해 디스크 활동을 최소화의 이야기를 바랍니다.

첫째로, 당신은 벤치 마크 손에서 그 정보와

set statistics IO on; 

를 사용하여 SET의 SHOWPLAN_ALL 또는 XML과 실행 계획을 받고 현재 IO 활동을하거나 SSMS의 사용이 인체 공학적으로 같은를 얻을 수 있습니다. 기본 튜닝을 위해 DTA를 사용할 수 있습니다.

SP를 일련의 특수 문으로 실행하고 IO가 무거운 곳을보고 해당 세그먼트에 집중하십시오. 귀하의 요구 사항에 적합한 우수 사례가 많이 있습니다.

+0

답변 해 주셔서 감사합니다. 그런 식으로 최적화 된 저장 프로 시저가 생겼습니다. 아주 좋은 결과! 처음에는 SET STATISTICS IO ON을 사용했습니다. 실행 계획 (Execution Plan)에서 프로 시저의 어느 부분이 가장 많은 리소스를 소비하는지 파악했습니다. 그 후 데이터베이스 엔진 튜닝 관리자를 사용하고 내가 얻은 권장 사항에 따라 인덱스를 만들었습니다. 또한 STATISTICS 및 성능을 향상시킬 수있는 일부 테이블을 만드는 권장 사항이 있습니다. MSDN에서 STATISTICS를 만들기위한 DETA의 권장 사항을 수락 할 제안을 찾았습니다. –

관련 문제