Come posso interrogare più velocemente questa visualizzazione di 20 milioni di record?


14

Per una funzionalità di ricerca sto usando una vista che ha i record di tutte le tabelle all'interno delle quali devo cercare. La vista ha quasi 20 milioni di record. Le ricerche in questa prospettiva richiedono troppo tempo.

Dove devo cercare per migliorare le prestazioni di questa vista?

La definizione approssimativa per la vista è di seguito. Comprende tredici tavoli e una trentina di campi.

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

Risposte:


9

Una vista è una macro che si espande. Pertanto, se la vista è un JOIN di 2 tabelle, il piano di esecuzione mostrerà le 2 tabelle. La vista è trasparente

Questo non si applica se la vista è indicizzata / materializzata. Tuttavia, non porteresti questa domanda.

Quindi, cosa dice il piano di esecuzione? Il DTA? Query dmv di indici mancanti? Query dmv più costosa?


Potrebbe porre la domanda per una visione materializzata e non rendersi conto che in genere è implementato come solo un'altra tabella, quindi può essere indicizzato, ecc.
Joe,

@Joe: forse, ma poi OP non chiederebbe aiuto se conoscessero le differenze ...
gbn

La domanda è taggata per MS SQL Server, quindi piuttosto che "viste materializzate" dovremmo parlare di "viste indicizzate";)
AndrewSQL

1
@AndrewSQL: l'ho fatto. Ma dovremmo provvedere alle forme di vita inferiori ...
gbn

6

Senza ulteriori dettagli sulla vista e sulle tabelle, la risposta è "dipende", ma è possibile iniziare a guardare la clausola WHERE della vista per i campi che potrebbero richiedere indici.


1
Ma avevo l'impressione che le opinioni in generale non beneficiassero molto degli indici (... secondo "Mi è stato detto da questo tizio che conosco")
jcolebrand

5
@jcolebrand: le viste in generale sono notevolmente aiutate dagli indici, a seconda di come vengono utilizzate. Essenzialmente, se utilizzati in una determinata query, trarranno vantaggio come se il loro codice fosse inserito direttamente nella query. Per semplici visualizzazioni + query, ciò significa che usano gli indici così come qualsiasi query semplice. Per visualizzazioni / query più complesse dipende dalla capacità del pianificatore di query di riorganizzare e ottimizzare il lavoro da svolgere. Il modo migliore per vederlo è scegliere un set di dati di grandi dimensioni e produrre alcune viste e query di esempio che li utilizzano e vedere cosa mostra il display del piano di query di SSMS che il QP fa con loro.
David Spillett,

6

Oltre a ciò che altri hanno detto (clausola WHERE, INDICI che potrebbero aiutare), suggerisco che potresti voler prendere in considerazione le viste indicizzate, supponendo che sia persino possibile creare indici sulla vista ( dettagli ). Quindi potresti essere in grado di applicare anche il suggerimento NOEXPAND nelle tue query ( dettagli ).


Questi dettagli sembrano promettenti. Fammi provare quelli e tornerò sui risultati.
Balu,

4

La risposta generica è dare un'occhiata al piano di esecuzione. I tuoi join sono indicizzati? I tuoi campi di output sono inclusi in quegli indici? Stai solo mostrando le colonne che devi vedere?


0

Quello che probabilmente farei è semplicemente creare 2 viste

  • La prima vista è solo dei campi che devo cercare; solo quei campi. Vorrei restituire il campo ID per ogni riga, oltre al tipo di tabella che stai cercando. Ho fatto una cosa simile creando una vista UNION ALL che ha cercato più tabelle. Mi sono appena assicurato di includere l'id, il tipo e i campi di testo che volevo cercare.

  • La seconda vista gestirà la visualizzazione dei risultati raccolti nella prima vista e avrebbe tutte le tabelle necessarie per visualizzare i risultati, o forse invece di una vista, rendendola una procedura memorizzata.

Farei un UNION ALL, con un GROUP BY in fondo, e non farei tutti quei JOIN ESTERNI SINISTRA.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.