2012-01-16 17 views
3

特定のReportingPeriodのLineItemTypesの金額と調整を格納する2つのテーブルがあります。私は、2つのテーブルに存在する各ReportingPeriod/LineItemTypeの組み合わせの金額と調整を照会する最も効率的な方法を探しています。2つのテーブルを最も効率的に結合する方法は?

スキーマは、本以下である:

@ReportingPeriodComposition(1030行 - テーブル変数)

Src int, 
GroupReportingPeriodId int, 
ReportingPeriodId int, 
ClientId int, 
PeriodDate date, 
... 
PRIMARY KEY CLUSTERED (Src, ReportingPeriodId) 

量(〜3000万行)

ReportingPeriodId int, 
LineItemTypeId smallint, 
Amount decimal, 
PRIMARY KEY CLUSTERED (ReportingPeriodId, LineItemTypeId) 

調整(〜 180,000行)現在、私は次のクエリを使用していますが、私は誰かどうかを確認するために興味津々

| ReportingPeriodId | LineItemTypeId | Amount | Adjustment | 

ReportingPeriodId int, 
LineItemTypeId smallint, 
Amount decimal, 
Comment nvarchar(2500), 
... 
AdjustmentId int, 
PRIMARY KEY NONCLUSTERED (AdjustmentId), 
UNIQUE KEY CLUSTERED (ReportingPeriodId, LineItemTypeId) 

私は、次の結果セットをもたらすユニークなReportingPeriodId/LineItemTypeIdによって金額と調整を選択したいと思いますこれをより効率的に行う方法についての考えがあります。すべての提案は歓迎!

SELECT 
    rpc.ReportingPeriodId, 
    COALESCE(a.LineItemTypeId, adj.LineItemTypeId) LineItemTypeId, 
    a.Amount, 
    adj.Amount Adjustment 
FROM @ReportingPeriodComposition rpc 
LEFT JOIN Watchlist.risk.Amount a 
    ON rpc.ReportingPeriodId = a.ReportingPeriodId 
LEFT JOIN Watchlist.risk.Adjustment adj 
    ON rpc.ReportingPeriodId = adj.ReportingPeriodId 
    AND (a.ReportingPeriodId IS NULL OR a.LineItemTypeId = adj.LineItemTypeId) 
WHERE 
    Src = @Src 
    AND (a.LineItemTypeId IS NOT NULL OR adj.LineItemTypeId IS NOT NULL) 
@Src変数は、@ReportingPeriodCompositionテーブル変数から取得する必要があるソース値を判断するために必要です。 〜138,000行の問合せ結果:

  • 1行量と、この数は変動し得るが調整の両方を有するこの条件が保証されていないが
  • 0行が調整のみを有するReportingPeriodCompositionに応じ

実行計画XML

<?xml version="1.0" encoding="utf-16"?> 
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.0.4064.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="9" StatementEstRows="104.769" StatementId="5" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.343989" StatementText="SELECT&#xD;&#xA; rpc.ReportingPeriodId,&#xD;&#xA; COALESCE(a.LineItemTypeId, adj.LineItemTypeId) LineItemTypeId,&#xD;&#xA; a.Amount,&#xD;&#xA; adj.Amount Adjustment&#xD;&#xA;FROM @ReportingPeriodComposition rpc&#xD;&#xA;LEFT JOIN Rating.risk.Amount a&#xD;&#xA; ON rpc.ReportingPeriodId = a.ReportingPeriodId&#xD;&#xA;LEFT JOIN Rating.risk.Adjustment adj&#xD;&#xA; ON rpc.ReportingPeriodId = adj.ReportingPeriodId&#xD;&#xA; AND (a.ReportingPeriodId IS NULL OR a.LineItemTypeId = adj.LineItemTypeId)&#xD;&#xA;WHERE&#xD;&#xA; Src = @Src&#xD;&#xA; AND (a.LineItemTypeId IS NOT NULL OR adj.LineItemTypeId IS NOT NULL)" StatementType="SELECT" QueryHash="0x425781A4C1D20919" QueryPlanHash="0xF3E9DD0ADAD04044"> 
      <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 
      <QueryPlan DegreeOfParallelism="1" CachedPlanSize="24" CompileTime="5" CompileCPU="5" CompileMemory="424"> 
      <RelOp AvgRowSize="31" EstimateCPU="1.04769E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="104.769" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="0.343989"> 
       <OutputList> 
       <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
       <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
       <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="Amount" /> 
       <ColumnReference Column="Expr1006" /> 
       </OutputList> 
       <ComputeScalar> 
       <DefinedValues> 
        <DefinedValue> 
        <ColumnReference Column="Expr1006" /> 
        <ScalarOperator ScalarString="CASE WHEN [Rating].[risk].[Amount].[LineItemTypeId] as [a].[LineItemTypeId] IS NOT NULL THEN [Rating].[risk].[Amount].[LineItemTypeId] as [a].[LineItemTypeId] ELSE [Rating].[risk].[Adjustment].[LineItemTypeId] as [adj].[LineItemTypeId] END"> 
         <IF> 
         <Condition> 
          <ScalarOperator> 
          <Compare CompareOp="IS NOT"> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
           </Identifier> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Const ConstValue="NULL" /> 
           </ScalarOperator> 
          </Compare> 
          </ScalarOperator> 
         </Condition> 
         <Then> 
          <ScalarOperator> 
          <Identifier> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
          </Identifier> 
          </ScalarOperator> 
         </Then> 
         <Else> 
          <ScalarOperator> 
          <Identifier> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
          </Identifier> 
          </ScalarOperator> 
         </Else> 
         </IF> 
        </ScalarOperator> 
        </DefinedValue> 
       </DefinedValues> 
       <RelOp AvgRowSize="33" EstimateCPU="9.21971E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="104.769" LogicalOp="Filter" NodeId="1" Parallel="false" PhysicalOp="Filter" EstimatedTotalSubtreeCost="0.343979"> 
        <OutputList> 
        <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
        <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
        <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
        <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
        <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="Amount" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="0" ActualRows="137631" ActualEndOfScans="1" ActualExecutions="1" /> 
        </RunTimeInformation> 
        <Filter StartupExpression="false"> 
        <RelOp AvgRowSize="33" EstimateCPU="0.000437936" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="104.769" LogicalOp="Left Outer Join" NodeId="2" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.343886"> 
         <OutputList> 
         <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
         <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
         <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
         <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
         <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="Amount" /> 
         </OutputList> 
         <RunTimeInformation> 
         <RunTimeCountersPerThread Thread="0" ActualRows="137647" ActualEndOfScans="1" ActualExecutions="1" /> 
         </RunTimeInformation> 
         <NestedLoops Optimized="false" WithUnorderedPrefetch="true"> 
         <OuterReferences> 
          <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
          <ColumnReference Column="Expr1009" /> 
         </OuterReferences> 
         <RelOp AvgRowSize="26" EstimateCPU="0.000437936" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="104.769" LogicalOp="Left Outer Join" NodeId="4" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00711828"> 
          <OutputList> 
          <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
          </OutputList> 
          <RunTimeInformation> 
          <RunTimeCountersPerThread Thread="0" ActualRows="137647" ActualEndOfScans="1" ActualExecutions="1" /> 
          </RunTimeInformation> 
          <NestedLoops Optimized="false"> 
          <OuterReferences> 
           <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
          </OuterReferences> 
          <RelOp AvgRowSize="11" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="5" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="0"> 
           <OutputList> 
           <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
           </OutputList> 
           <RunTimeInformation> 
           <RunTimeCountersPerThread Thread="0" ActualRows="1030" ActualEndOfScans="1" ActualExecutions="1" /> 
           </RunTimeInformation> 
           <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
           <DefinedValues> 
            <DefinedValue> 
            <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
            </DefinedValue> 
           </DefinedValues> 
           <Object Table="[@ReportingPeriodComposition]" Index="[PK__#6FDF7DF__F9ABEE3F71C7C670]" Alias="[rpc]" /> 
           <SeekPredicates> 
            <SeekPredicateNew> 
            <SeekKeys> 
             <Prefix ScanType="EQ"> 
             <RangeColumns> 
              <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="Src" /> 
             </RangeColumns> 
             <RangeExpressions> 
              <ScalarOperator ScalarString="[@Src]"> 
              <Identifier> 
               <ColumnReference Column="@Src" /> 
              </Identifier> 
              </ScalarOperator> 
             </RangeExpressions> 
             </Prefix> 
            </SeekKeys> 
            </SeekPredicateNew> 
           </SeekPredicates> 
           </IndexScan> 
          </RelOp> 
          <RelOp AvgRowSize="22" EstimateCPU="0.000272246" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="104.769" LogicalOp="Clustered Index Seek" NodeId="6" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.00339725" TableCardinality="29974300"> 
           <OutputList> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
           </OutputList> 
           <RunTimeInformation> 
           <RunTimeCountersPerThread Thread="0" ActualRows="137631" ActualEndOfScans="1030" ActualExecutions="1030" /> 
           </RunTimeInformation> 
           <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
           <DefinedValues> 
            <DefinedValue> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
            </DefinedValue> 
            <DefinedValue> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
            </DefinedValue> 
            <DefinedValue> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="Amount" /> 
            </DefinedValue> 
           </DefinedValues> 
           <Object Database="[Rating]" Schema="[risk]" Table="[Amount]" Index="[PK_Amount]" Alias="[a]" IndexKind="Clustered" /> 
           <SeekPredicates> 
            <SeekPredicateNew> 
            <SeekKeys> 
             <Prefix ScanType="EQ"> 
             <RangeColumns> 
              <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
             </RangeColumns> 
             <RangeExpressions> 
              <ScalarOperator ScalarString="@ReportingPeriodComposition.[ReportingPeriodId] as [rpc].[ReportingPeriodId]"> 
              <Identifier> 
               <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
              </Identifier> 
              </ScalarOperator> 
             </RangeExpressions> 
             </Prefix> 
            </SeekKeys> 
            </SeekPredicateNew> 
           </SeekPredicates> 
           </IndexScan> 
          </RelOp> 
          </NestedLoops> 
         </RelOp> 
         <RelOp AvgRowSize="18" EstimateCPU="0.000165111" EstimateIO="0.003125" EstimateRebinds="103.769" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="7" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.33565" TableCardinality="178911"> 
          <OutputList> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
          <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="Amount" /> 
          </OutputList> 
          <RunTimeInformation> 
          <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="137647" ActualExecutions="137647" /> 
          </RunTimeInformation> 
          <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
          <DefinedValues> 
           <DefinedValue> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
           </DefinedValue> 
           <DefinedValue> 
           <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="Amount" /> 
           </DefinedValue> 
          </DefinedValues> 
          <Object Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Index="[IX_Adjustment_ReportingPeriodId_LineItemTypeId]" Alias="[adj]" IndexKind="Clustered" /> 
          <SeekPredicates> 
           <SeekPredicateNew> 
           <SeekKeys> 
            <Prefix ScanType="EQ"> 
            <RangeColumns> 
             <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="ReportingPeriodId" /> 
            </RangeColumns> 
            <RangeExpressions> 
             <ScalarOperator ScalarString="@ReportingPeriodComposition.[ReportingPeriodId] as [rpc].[ReportingPeriodId]"> 
             <Identifier> 
              <ColumnReference Table="@ReportingPeriodComposition" Alias="[rpc]" Column="ReportingPeriodId" /> 
             </Identifier> 
             </ScalarOperator> 
            </RangeExpressions> 
            </Prefix> 
           </SeekKeys> 
           </SeekPredicateNew> 
          </SeekPredicates> 
          <Predicate> 
           <ScalarOperator ScalarString="[Rating].[risk].[Amount].[ReportingPeriodId] as [a].[ReportingPeriodId] IS NULL OR [Rating].[risk].[Amount].[LineItemTypeId] as [a].[LineItemTypeId]=[Rating].[risk].[Adjustment].[LineItemTypeId] as [adj].[LineItemTypeId]"> 
           <Logical Operation="OR"> 
            <ScalarOperator> 
            <Compare CompareOp="IS"> 
             <ScalarOperator> 
             <Identifier> 
              <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="ReportingPeriodId" /> 
             </Identifier> 
             </ScalarOperator> 
             <ScalarOperator> 
             <Const ConstValue="NULL" /> 
             </ScalarOperator> 
            </Compare> 
            </ScalarOperator> 
            <ScalarOperator> 
            <Compare CompareOp="EQ"> 
             <ScalarOperator> 
             <Identifier> 
              <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
             </Identifier> 
             </ScalarOperator> 
             <ScalarOperator> 
             <Identifier> 
              <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
             </Identifier> 
             </ScalarOperator> 
            </Compare> 
            </ScalarOperator> 
           </Logical> 
           </ScalarOperator> 
          </Predicate> 
          </IndexScan> 
         </RelOp> 
         </NestedLoops> 
        </RelOp> 
        <Predicate> 
         <ScalarOperator ScalarString="[Rating].[risk].[Amount].[LineItemTypeId] as [a].[LineItemTypeId] IS NOT NULL OR [Rating].[risk].[Adjustment].[LineItemTypeId] as [adj].[LineItemTypeId] IS NOT NULL"> 
         <Logical Operation="OR"> 
          <ScalarOperator> 
          <Compare CompareOp="IS NOT"> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Amount]" Alias="[a]" Column="LineItemTypeId" /> 
           </Identifier> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Const ConstValue="NULL" /> 
           </ScalarOperator> 
          </Compare> 
          </ScalarOperator> 
          <ScalarOperator> 
          <Compare CompareOp="IS NOT"> 
           <ScalarOperator> 
           <Identifier> 
            <ColumnReference Database="[Rating]" Schema="[risk]" Table="[Adjustment]" Alias="[adj]" Column="LineItemTypeId" /> 
           </Identifier> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Const ConstValue="NULL" /> 
           </ScalarOperator> 
          </Compare> 
          </ScalarOperator> 
         </Logical> 
         </ScalarOperator> 
        </Predicate> 
        </Filter> 
       </RelOp> 
       </ComputeScalar> 
      </RelOp> 
      <ParameterList> 
       <ColumnReference Column="@Src" ParameterRuntimeValue="(2)" /> 
      </ParameterList> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
+1

表示された説明とスキーマから、明らかに間違っていると思われるものはありません – Andrew

+0

私はそれを行うことができます。どのように私はそれを表示したいですか? –

+0

XMLまたはグラフィックのどちらでも動作します – Andrew

答えて

2

あなたが投稿したクエリプランには特に問題はありません.SQLが適切な選択をしていると思われます。私が少し気にしているのは、クエリプランの見積もりと実際に返される行数がかなり離れていることだけです。統計情報が完全に最新ではないことを示します。統計情報を強制的に更新し、同じクエリプランを使用する

一貫性のないパフォーマンスで問題が発生した場合は、devボックスでクエリプランキャッシュを消去し、非常に少ない行を生成する@SRC値のクエリプランを生成し、プランキャッシュをクリアし、 @SRC非常に大量の行が返される値です。クエリプランが同じであればOKですが、異なる場合はOPTIMIZE FORヒントを使用する必要があります。これはパラメータ化されたクエリで発生することがあり、その最初の実行でキャッシュに格納されているプラ​​ンが決定され、そのプランが期限切れになるまで、クエリの以降の実行で同じプランが使用されます。

これを確認することで、遭遇している/解決しようとしている特定の問題に関する詳細情報を提供する必要がありますか?

1

JOIN HINTはどうですか? MSDNから

LOOP |ハッシュ| MERGEクエリ内の結合でループ、ハッシュ、またはマージを にすることを指定します。 LOOP | HASHを使用する| MERGE JOINは、 2つのテーブル間の特定の結合を強制します。結合型としてLOOPまたはFULLを指定して、LOOPを一緒に指定することはできません。

REMOTE右側の表 のサイトで結合操作を実行することを指定します。これは、左側のテーブルがローカルテーブル で、右側のテーブルがリモートテーブルである場合に便利です。 REMOTEは、 の左側の表の行数が右側の表の行数より少ない場合にのみ使用してください。

右側の表がローカルの場合、結合はローカルで実行されます。両方とも テーブルがリモートであるが異なるデータソースからのものである場合、REMOTEは右テーブルのサイトで 結合を実行します。両方のテーブル が同じデータソースのリモートテーブルである場合、REMOTEは必須ではありません。

結合述語で比較される値の1つが、COLLATE 節を使用して異なる照合にキャストされている場合、REMOTEは使用できません。

REMOTEは、INNER JOIN操作にのみ使用できます。

あなたの場合、LEFT結合を扱っているので、LOOP結合を使用することができます。それ以外の場合は、クエリが正常に見える、あなたはあなたがフィルタリングしている列にインデックスを持っていますか?

あなたの金額テーブルには多くの行がありますが、私はずっと多くのデータベースを見てきました。あなたが使っているハードウェアは何ですか?

LOOP JOINがどのように使用され、特定の最適化が行われたかの例は、articleを参照してください。しかし、それはすべて、結合ヒントを使用するときの問合せのタイプに依存します。それは適用されないかもしれませんし、あなたの場合の最後の手段のオプションでなければなりません。

+0

クエリオプティマイザは、左外部結合のネストループを実行することを選択しています。ケースの98%がIX_Adjustment_ReportingPeriodId_LineItemTypeIdのClustered Index Seekです。 1実際の行数、137647実行数、104.769実行件数の見積もり –

0

#tempテーブルに置き換えて、SQL Serverでより正確な統計情報を再生できるようにします。

現在、テーブル変数が1行を返し、ネストされたループ計画を選択すると想定しています。実際のテーブルのカーディナリティを考慮に入れることができる場合は、別のテーブルを取得することができます。