0

私の選択したクエリは次のとおりです。

Select A.DocumentID,
       A.CodingID,
       A.DebitPrice,
       A.CreditPrice,
       A.DocumentDetailDescriptionID,
       A.HKSID,
       A.OldInc,
       A.EffectiveDate,
       A.DetailedAccount1ID,
       A.DetailedAccount2ID,
       A.DetailedAccount3ID,
       C.FinancialPeriodID,
       C.SalesCompanyID,
       B.[Date]
 From  acc.DocumentDetail A
 INNER JOIN ACC.Document B ON B.DocumentID = A.DocumentID
 INNER JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID

acc.DocumentDetail には約 12917388 レコードがあります

acc.documet には約 131767 のレコードがあります

org.SalesCompanyFinancialPeriod には約 93 件のレコードがあります

私のクエリは遅いので、もっと速くしたいです。どのヒントを使用する必要がありますか?

4

2 に答える 2

1

この状況に関して2つの重要な質問があります。

  1. 全体的に最高のパフォーマンスを実現しますか、それとも最初の行をより速く返したいですか(UIアプリケーションにより適しています)?
  2. テーブルorg.SalesCompanyFinancialPeriodは、フィルターまたはディクショナリのように機能しますか?

より良い全体的な時間を探していて、SalesCompanyFinancialPeriodが辞書のように機能する場合は、DocumentとDocumentDetailの間でMERGE結合を使用し、次にSalesCompanyFinancialPeriodへのHASH結合を使用することで最高のパフォーマンスを実現できます。

SELECT (...)
FROM acc.Document doc
INNER MERGE JOIN acc.DocumentDetail det ON (...)
INNER HASH JOIN org.SalesCompanyFinancialPeriod fnp ON (...)
OPTION(FORCE ORDER);

SalesCompanyFinancialPeriodがフィルターのように機能する場合、またはこのクエリをUIアプリケーションで使用する場合は、このテーブルから始めて、ドキュメントでLOOP / HASH結合を使用し、次に別のLOOP / HASH結合を使用することで、最初の行をより速く返すことができます。 DocumentDetail。LOOP結合とHASH結合のどちらを選択するかは、多くの環境変数に依存するため、JOINの順序を指定して、エンジンに結合を選択させます。

SELECT (...)
FROM org.SalesCompanyFinancialPeriod fnp
INNER JOIN acc.Document doc ON (...)
INNER JOIN acc.DocumentDetail det ON (...)
OPTION(FORCE ORDER);

ただし、クエリパフォーマンスのヒントよりも重要なのは、これらのテーブルのインデックス構造です。このクエリが重要な場合は、次のインデックスをお勧めします(両方の使用例で有効)。

CREATE UNIQUE CLUSTERED INDEX idxc_det
  ON acc.DocumentDetail(DocumentID, CodingID);

CREATE UNIQUE CLUSTERED INDEX idxc_doc
  ON acc.Document(DocumentID);

CREATE INDEX idx_fnper
  ON acc.Document(SalesCompanyFinancialPeriodID);

CREATE UNIQUE CLUSTERED INDEX idxc_doc
  ON org.SalesCompanyFinancialPeriod(SalesCompanyFinancialPeriodID);
于 2012-05-28T10:23:19.733 に答える
0

皆さんありがとう。

クエリを調査し、SalesCompanyFinancialPeriodのSalesCompanyFinancialPeriodIDにインデックスを追加し、SalesCompanyIDとFinancialIDを含めて、クエリを以下に変更します(このクエリは約1:10高速です)

Select  A.DocumentID,
    A.CodingID,
    A.DebitPrice,        
    A.CreditPrice,        
    A.DocumentDetailDescriptionID,        
    A.HKSID,        
    A.OldInc,        
    A.EffectiveDate,        
    A.DetailedAccount1ID,        
    A.DetailedAccount2ID,        
    A.DetailedAccount3ID,        
    C.FinancialPeriodID,        
    C.SalesCompanyID,        
    B.[Date]  
From  acc.DocumentDetail A  
INNER HASH JOIN ACC.Document B ON B.DocumentID = A.DocumentID  
INNER LOOP JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID 
于 2012-05-28T06:40:38.450 に答える