Ho un database data warehouse e sto affrontando problemi con il nuovo cardinalità stimatore di SQL Server 2014.Nuovo cardinalità stimatore (SQL Server 2014) è lontano
Dopo l'aggiornamento del server di database di SQL Server 2014 I ho osservato una grande differenza nelle prestazioni delle query. Alcune query vengono eseguite molto più lentamente (30 secondi in SQL 2012 e 5 minuti in SQL 2014). Dopo aver esaminato i piani di esecuzione, ho visto che le stime di cardinalità su SQL Server 2014 sono lontane e non riesco a trovarne una ragione.
Ecco un esempio di un piano di esecuzione di query (operatore in alto a sinistra) in SQL 2012 contro SQL 2014:
Alcuni dettagli:
mie domande sono dati tipici query di carico della tabella dei fatti di magazzino. Faccio una query su una tabella transazionale e mi unisco a una tabella di dimensioni lotto (15-20) (c'è sempre o 0 o 1 record che è unito dalla tabella dimensionale).
Ho aggiornato le statistiche di tutte le tabelle (con FULLSCAN) per essere sicuri che le statistiche siano aggiornate.
Le chiavi aziendali delle tabelle delle dimensioni sono indicizzate (indice univoco non protetto). Mi sembra che, a causa dell'unicità di questo indice, il vecchio stimatore di cardinalità (SQL 2012) presupponga correttamente che non ci sia il massimo. 1 record che si aggiunge (il numero stimato di record non cambia nel piano di esecuzione).
ho cercato di restringere la questione al più semplice esempio - Seleziona con 2 unisce:
Ecco la stima di cardinalità per gli operatori 1 e 2 in SQL 2012 contro SQL 2014:
| Est.rows - SQL2012 | Est.rows - SQL2014
Operator 1 | 7653 | 7653
Operator 2 | 7653 | 10000
Come si può vedere, SQL Server 2014 non trova la stima di oltre il 30% (10000 vs 7653). Perché ho cca. 15-20 join in una query tipica, la stima finale va via.
Posso mettere il database nella modalità di compatibilità inferiore (110) e funziona perfettamente (come su SQL Server 2012), ma mi piacerebbe davvero sapere qual è la ragione di questo comportamento. Perché il risultato dello stimatore di cardinalità di SQL Server 2014 è errato?
Potrebbe avere qualcosa a che fare con l'indipendenza/correlazione di predicati progettati diversamente nel nuovo CE. Non so come funziona esattamente. Puoi leggere di più qui: http://sqlperformance.com/2013/12/t-sql-queries/a-first-look-at-the-new-sql-server-cardinality-estimator – NickyvV
Una buona lettura del nuovo stima della cardinalità nel 2014 e in che modo vengono forniti i valori del piano di query: http://thomaslarock.com/2014/07/sql-2014-cardinality-estimator-care-part-2/ –