2011-08-09 13 views
1

SQL Serverの最適化に関する一般的な質問が1つあります。ストアドプロシージャの読み取り回数をどのように減らすことができますか?SQL Server - 読み取り回数を減らす

私のようなグッド・プラクティスに興味がある: - 物理的および一時テーブル でインデックスを作成する - 手順 で同じテーブルの数回を使用して代わりに一時テーブルを使用して - DML 前DDL - SET NOCOUNT ON格納されるの先頭に手順 - ...

私は、カップルのストアドプロシージャに起因する膨大な数の読み込みのために使用されるディスクスペースに問題があり、最適化する必要があります。 「最も高価」ですストアドプロシージャの

一部は次のとおりです。

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を使用しました。実行計画では、プロシージャのどの部分が最も多くのリソースを消費しているかがわかりました。その後、データベースエンジンチューニングアドバイザを使用し、得られた推奨事項に従ってインデックスを作成しました。また、STATISTICSを作成するための推奨事項と、パフォーマンスを向上させるテーブルがあります。 MSDNでは、STATISTICSを作成するためのDETAからの推奨事項を受け入れる提案が見つかりました。 –

関連する問題