web-dev-qa-db-ja.com

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

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

このビューのパフォーマンスを改善するためにどこを見ればよいですか?

ビューの大まかな定義は次のとおりです。 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 ..
14
balu

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

これは、ビューがインデックス化/マテリアライズされている場合は適用されません。しかし、あなたはこの質問をすることはないでしょう。

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

9
gbn

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

6
ggponti

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

6
AndrewSQL

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

4
Matt M

私がおそらくすることは、2つのビューを作成することです

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

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

下部にGROUP BYを指定してUNION ALLを実行し、これらすべてのLEFT OUTER JOINを実行しません。

0
crosenblum