Ambientazione
In un datawarehouse, sto unendo una tabella dei fatti a 20 dimensioni. La tabella dei fatti ha 32 milioni di righe e 30 colonne. Questa è una tabella temporanea di gestione temporanea, quindi non ho a che fare con altri utenti che leggono o scrivono sul tavolo. Seleziono 10 colonne dalla tabella di base e 20 colonne dalle rispettive dimensioni. Le tabelle delle dimensioni sono piccole (tra 3 e 15.000 righe). I campi su cui sono uniti sono sia numeri interi che nvarchars. Uso un'istruzione SELECT ... INTO. Non ci sono indici nelle tabelle.
La velocità di esecuzione di questa query è troppo lenta per essere utile.
Soluzioni provate
Poiché la query richiede troppo tempo per l'elaborazione, ho provato le seguenti soluzioni:
- Dividi i 20 join in 4 join su 5 tavoli. Tuttavia, le prestazioni della query rimangono basse.
- Inserisci gli indici nelle colonne chiave esterna. Nessuna riduzione significativa del tempo.
- Assicurarsi che i campi della condizione di join siano numeri interi. Ho notato un aumento delle prestazioni del 25%. Non proprio quello che sto cercando.
- Usa un'istruzione insert in invece di select into. Prestazioni peggiori a causa della crescita dei file di registro, sebbene il database sia in modalità di ripristino semplice.
Questi risultati mi hanno portato a includere il piano di esecuzione effettivo, che mostra che l'89% del costo risiede nell'inserto della tabella . Gli altri costi sono l'8% della scansione della tabella sulla tabella dei fatti e il 2% sulla corrispondenza dell'hash per i join interni.
Domande
- Quali sono le possibili ragioni dell'inserimento lento della tabella?
- Quali sono i modi per identificare questo collo di bottiglia senza il piano di esecuzione?
- Quali azioni posso intraprendere per ridurre il costo dell'inserto della tabella?