Wie kann ich diese 20-Millionen-Datensatzansicht schneller abfragen?


14

Für eine Suchfunktion verwende ich eine Ansicht, die die Datensätze aus allen Tabellen enthält, in denen ich suchen muss. Die Ansicht hat fast 20 Millionen Datensätze. Suchen gegen diese Ansicht nehmen zu viel Zeit in Anspruch.

Wo soll ich nachsehen, um die Leistung dieser Ansicht zu verbessern?

Die grobe Definition für die Ansicht ist unten. Es umfasst dreizehn Tische und rund dreißig Felder.

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 ..

Antworten:


9

Eine Ansicht ist ein Makro, das erweitert wird. Wenn Ihre Ansicht also ein JOIN von 2 Tabellen ist, werden im Ausführungsplan die 2 Tabellen angezeigt. Die Ansicht ist transparent.

Dies gilt nicht, wenn die Ansicht indiziert / materialisiert ist. Dann würden Sie diese Frage jedoch nicht stellen.

Also, was steht im Ausführungsplan? Der DTA? Fehlende Indizes dmv-Abfrage? Die teuerste dmv abfrage?


Möglicherweise stellt er die Frage nach einer materialisierten Ansicht und merkt nicht, dass sie normalerweise nur als eine andere Tabelle implementiert ist. Sie kann indiziert werden usw.
Joe,

@ Joe: Möglicherweise, aber dann würde OP nicht um Hilfe bitten, wenn sie die Unterschiede wüssten ...
gbn

Die Frage ist für MS SQL Server markiert, daher sollten wir anstatt von "materialisierten Ansichten" von "indizierten Ansichten" sprechen;)
AndrewSQL

1
@ AndrewSQL: Ich habe. Aber wir sollten uns um die niederen Lebensformen
kümmern

6

Ohne weitere Details zu Ansicht und Tabellen lautet die Antwort "es hängt davon ab". Sie können jedoch in der WHERE-Klausel Ihrer Ansicht nach den Feldern suchen, für die möglicherweise Indizes erforderlich sind.


1
Aber ich hatte den Eindruck, dass die Ansichten im Allgemeinen nicht sehr von den Indizes profitieren (... laut "Mir wurde von diesem Typen erzählt, den ich kenne")
jcolebrand

5
@jcolebrand: Sichten im Allgemeinen werden stark von Indizes unterstützt, je nachdem, wie sie verwendet werden. Wenn sie in einer bestimmten Abfrage verwendet werden, haben sie im Wesentlichen den Vorteil, dass ihr Code direkt in die Abfrage eingefügt wird. Für einfache Ansichten + Abfragen bedeutet dies, dass sie Indexe verwenden, so wie es bei jeder einfachen Abfrage der Fall wäre. Bei komplexeren Ansichten / Abfragen kommt es darauf an, wie gut der Abfrageplaner die zu erledigende Arbeit neu anordnen und optimieren kann. Der beste Weg, dies zu sehen, besteht darin, einen großen Datensatz auszuwählen und einige Beispielansichten und -abfragen mit diesen zu erstellen und zu sehen, was die Anzeige des Abfrageplans von SSMS sagt, der QP macht mit ihnen.
David Spillett

6

Zusätzlich zu dem, was andere gesagt haben (WHERE-Klausel, INDEXes, die helfen könnten), schlage ich vor, dass Sie indizierte Ansichten in Betracht ziehen möchten - vorausgesetzt, es ist sogar möglich, Indizes für die Ansicht ( Details ) zu erstellen . Dann können Sie möglicherweise auch den NOEXPAND-Hinweis in Ihren Abfragen ( Details ) anwenden .


Diese Details klingen vielversprechend. Lassen Sie mich diese ausprobieren und auf die Ergebnisse zurückkommen.
balu

4

Die generische Antwort ist ein Blick auf den Ausführungsplan. Sind Ihre Joins indiziert? Sind Ihre Ausgabefelder in diesen Indizes enthalten? Geben Sie nur die Spalten aus, die Sie sehen müssen?


0

Was ich wahrscheinlich machen würde, ist nur 2 Views zu erstellen

  • Die erste Ansicht zeigt nur die Felder, die ich durchsuchen muss. nur diese Felder. Ich würde das ID-Feld für jede Zeile sowie die Art der Tabelle, nach der Sie suchen, zurückgeben. Ähnlich ging es mir, als ich eine UNION ALL-Ansicht erstellte, in der mehrere Tabellen durchsucht wurden. Ich habe nur darauf geachtet, die ID, den Typ und die Textfelder einzuschließen, die ich durchsuchen wollte.

  • In der zweiten Ansicht werden die in der ersten Ansicht gesammelten Ergebnisse angezeigt, und in jeder Tabelle, die Sie zum Anzeigen der Ergebnisse benötigen, wird eine gespeicherte Prozedur angezeigt.

Ich würde eine UNION ALL machen, mit einer GROUP BY unten, und ich würde nicht alle diese LEFT OUTER JOINs machen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.