1

まったく同じ列の結果を返す必要のある検索関数(ストアドプロシージャ)がいくつかあります。

これが採用されたアプローチです。

各ストアドプロシージャの一般的な構造は次のとおりです。

CREATE TABLE #searchTmp (CustomerID uniqueIdentifier)

INSERT INTO #searchTmp
SELECT C.CustomerID FROM /**** do actual search here, based
                              on stored proc arguments ****/

EXEC spSearchResults

DROP TABLE #searchTmp

上記では、spSearchResultsはselectで#searchTmpテーブルを使用します。spSearchResultsは常に同じ列のテーブルを返し、かなりの数の結合がありました。

ただし、一時テーブルを使用するよりも、次のアプローチの方が適しています。

SELECT col1, col2, col3, col4, .... etc, lots of columns ... FROM table1 LEFT JOIN table 2 ON ... etc, lots of joins ... WHERE ... DO ACTUAL SEARCH HERE ...

10の異なる検索を行う場合(たとえば、郵便番号に基づいて顧客を検索する、名前に基づいて1つの検索を行うなど)、この2番目のアプローチは、指定された列と結合の重複が多いことを意味します。検索関数を使用するコードが変更されて、新しい列を返す必要がある場合は、10個のストアドプロシージャを更新する必要があります。

私はすべて最初の方法に賛成ですが、2番目の方法がどのような利点をもたらすのか疑問に思いました。パフォーマンス?

または、3番目の方法はありますか?

4

3 に答える 3

1

一時テーブルの内容が出力される一意のキーの最終セットを表し、後で結果セットのトリミングが行われない限り、要件を実装するための非常に効率的な方法です。

問題が発生するのは、一時テーブルに、後続のクエリでさらに削減されるキーの中間セットが含まれている場合のみです。そのシナリオでは、1つのクエリですべてのデータを読み取る方が効率的です。

編集:マークが言うように、クエリオプティマイザーは単一のクエリアプローチでは複数のスレッドを使用できますが、一時テーブルアプローチでは使用できないため、パフォーマンスに違いがある可能性があります。この潜在的な利益と、一時テーブルアプローチの保守性の大幅な向上を比較検討し、どちらが自分にとってより重要であるかを判断する必要があります。データベースの質問でいつものように、パフォーマンスを推測するよりも測定する方が良いです。

于 2009-11-12T13:43:55.650 に答える
0

2番目の方がパフォーマンスが向上するはずです。返すデータの割合が少なくなります。

2つ目は、クエリオプティマイザーに任意の順序でクエリを実行する機会を与え、1つ目は、最初のテーブルからの選択を強制します(この場合、必要なテーブルである可能性があります)。 2つ目は、オプティマイザーがこれを実行できるため、クエリで動作する複数のスレッドです。

これを確認するには、Showplan(SybaseまたはSQL Server)またはEXPLAIN(Iracle)などを実行して、生成された実際のクエリを確認します。

于 2009-11-12T13:41:41.820 に答える
0

Microsoft Sql Serverを使用している場合は、3番目の方法をお勧めします。

Create Function GetSearchKeys([Search parameters here])
Returns @Keys Table (pk Int Primary Key Not Null)
As
Begin
      Insert @Keys(pk)
      Select C.CustomerID 
      From /**** do actual search here, based 
               on Search parameters ****/
      Return
End

  -- ----------------------------------------------------

次に、ストアドプロシージャごとに、

  SELECT col1, col2, col3, col4, .... etc, lots of columns ... 
  FROM table1 
     LEFT JOIN table 2 
        ON ... etc, lots of joins
     Join schema.GetSearchKeys([Search parameters here]) K
        on K.pk = [whatever table.column has the primary key in  it]
于 2009-11-12T14:32:21.277 に答える