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