Contesto:
ho numerosi database con un gran numero di VIEW e un numero estremamente elevato di SYNONYM. Ad esempio, un db ha più di 10k VIEW e 2+ milioni di SYNONYM.
Problema generale: le
query che coinvolgono sys.objects
(e le tabelle di sistema in generale) tendono ad essere lente. Le domande che coinvolgono sys.synonyms
sono glaciali. Mi chiedo cosa posso fare per migliorare le prestazioni.
Esempio specifico
Questo comando viene eseguito da uno strumento di terze parti. È lento sia nell'app, sia in SSMS:
exec sp_tables_rowset;2 NULL,NULL
La mia domanda :
come posso farlo funzionare più velocemente?
Cosa ho provato :
se SET STATISTICS IO ON
ottengo questo risultato:
(2201538 righe interessate)
Tabella 'sysobjrdb'. Conteggio scansioni 1, letture logiche 28, letture fisiche 0, letture read-ahead 0, letture logiche lob 0, letture fisiche lob 0, letture read lob
iniziali 0. Tabella "sysschobjs". Conteggio scansioni 1, letture logiche 53926, letture fisiche 0, letture read-ahead 0, letture log lob 0, letture fisiche lob 0, letture read lob 0.
Sono stato in grado di aggiornare le statistiche sulle tabelle di sistema sottostanti. Questo ha funzionato nel mio SQL 2008 R2 o negli ambienti più recenti:
UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN
Sono stato anche in grado di eseguire la manutenzione dell'indice. Funziona nel mio SQL 2012 o negli ambienti più recenti. Ad esempio, in esecuzione sp_help 'sys.sysschobjs'
identifica gli indici sulla tabella e da lì creo ed eseguo questi comandi:
ALTER INDEX clst ON sys.sysschobjs REORGANIZE
ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc2 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc3 ON sys.sysschobjs REORGANIZE
L'aggiornamento delle statistiche e la riorganizzazione degli indici aiuta, ma non di molto.