この2000万件のレコードビューをより速くクエリするにはどうすればよいですか?


14

検索機能では、検索する必要があるすべてのテーブルのレコードを含むビューを使用しています。ビューには、ほぼ2000万件のレコードがあります。このビューに対する検索には時間がかかりすぎています。

このビューのパフォーマンスを改善するためにどこを調べるべきですか?

ビューの大まかな定義は次のとおりです。13のテーブルと約30のフィールドが含まれます。

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, ISNULL(NT.[seventeenSearch],'') AS [seventeenSearch]
, ISNULL(NT.[eighteenSearch],'')AS [eighteenSearch]
, ISNULL(TT.[ninteenSearch],'') AS [ninteenSearch]
, ISNULL(ELT.[twentySearch],'') AS [twentySearch]
, ISNULL(ELT.[twentyOneSearch],'') AS [twentyOneSearch]
, ISNULL(TWT.[twentyTwoSearch],'') AS [twentyTwoSearch]
, ISNULL(THT.twentyThree,'') AS [twentyThree]
, ISNULL(THT.twentyFour,'') AS [twentyFour]
, ISNULL(THT.twentyFive,'') AS [twentyFive]
, ISNULL(THT.twentySix,'') AS [twentySix]
FROM 
      tblFirstTable AS FT         
      LEFT JOIN [tblSecondTable] AS ST 
            ON ST.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblThirdTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblFourthTable] AS FRT 
            ON FRT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblFifthTable] AS FIT 
            ON FIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSixthTable] AS SIT 
            ON SIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSeventhTable] AS SET 
            ON SET.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblEighthTable] AS ET 
            ON ET.[fld_primary] = FT.[fld_primary] 
      LEFT JOIN [tblNinthTable] AS NT 
            ON NT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblELTnthTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblEleventhTable] AS ELT 
            ON ELT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblTwelthTable] AS TWT 
                            ON TWT.[fld_id] = ELT.[fld_id]  
              LEFT JOIN [tblThirteenthTable] AS THT
            ON THT.[firstField]= FT.[firstField]
WHERE fld_Status ..

回答:


9

ビューは展開されるマクロです。したがって、ビューが2つのテーブルのJOINである場合、実行プランには2つのテーブルが表示されます。ビューは透明です。

ビューがインデックス化/実体化されている場合、これは適用されません。ただし、この場合、この質問はしません。

それで、実行計画は何と言っていますか?DTA?インデックスdmvクエリがありませんか?最も高価なdmvクエリ?


彼は、それがなど、一般的にちょうど別のテーブルとして実装されていますので、インデックスを作成することができます実現マテリアライズド・ビューのための質問をし、ないかもしれない
ジョー

@Joe:おそらく、彼らは違いを知っていたならば、OPは...助けを求めることはない
GBN

質問にはMS SQL Serverのタグが付けられているため、「マテリアライズドビュー」ではなく「インデックス付きビュー」について説明する必要があります;)
AndrewSQL

1
@AndrewSQL:やりました。しかし、より低い生命体に対応する必要があります
...-gbn

6

ビューとテーブルの詳細がなければ、答えは「それは依存します」ですが、インデックスを必要とする可能性のあるフィールドのビューのWHERE句を調べ始めることができます。


1
しかし、私は(...「私は私が知っているこの男に言われました」による)一般のビューがインデックスから大きな利益を得ていないという印象の下にあった
jcolebrand

5
@jcolebrand:ビューは一般に、使用方法に応じて、インデックスによって大いに役立ちます。基本的に、特定のクエリで使用すると、コードがクエリに直接挿入されたようになります。単純なビューとクエリの場合、これは単純なクエリと同様にインデックスを使用することを意味します。より複雑なビュー/クエリの場合、クエリプランナーが実行する作業をどのように再配置および最適化できるかによって異なります。これを確認する最善の方法は、大きなデータセットを選択し、それらを使用していくつかのサンプルビューとクエリを作成し、SSMSのクエリプランの表示がQPがそれらに対して行うことを確認することです。
デビッドスピレット

6

他の人が言ったこと(WHERE句、役立つインデックス)に加えて、インデックス付きビューを検討することをお勧めします-ビューにインデックスを作成することさえ可能です(詳細)。その後、クエリにNOEXPANDヒントを適用することもできます(詳細)。


これらの詳細は有望に聞こえますが、それらを試してみて、結果に戻りましょう。
バル

4

一般的な答えは、実行計画を確認することです。結合はインデックス化されていますか?出力フィールドはそれらのインデックスに含まれていますか?表示する必要がある列のみを出力していますか?


0

おそらく2つのビューを作成するだけです

  • 最初のビューは、検索する必要のあるフィールドのみです。それらのフィールドだけ。各行のIDフィールドと、検索するテーブルの種類を返します。複数のテーブルを検索するUNION ALLビューを作成して、同様のことを行いました。検索したいのは、ID、タイプ、およびテキストフィールドを含めるだけです。

  • 2番目のビューは、1番目のビューで収集された結果の表示を処理し、結果を表示するために必要なすべてのテーブルを持つか、ビューの代わりにストアドプロシージャにします。

下部にGROUP BYを指定してUNION ALLを実行しますが、LEFT OUTER JOINをすべて実行するわけではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.