SQL Server 2014 include un nuovo Cardinality Estimator. In questa presentazione esploriamo insieme le caratteristiche di questa rinnovata componente del query processor.
3. Gianluca Sartori
•Independent SQL Server consultant
•Works with SQL Server since version 7
•MCTS, MCITP, MCT
•DBA @ Formula 1 team
Blog:
Twitter:
spaghettidba.com
@spaghettidba
4. Cardinality Estimator
SQL Server 2014 include un nuovo Cardinality Estimator
I piani di esecuzione saranno compilati usando il nuovo
CE
Nuovi algoritmi di calcolo dalla cardinalità
5. Cos’è il Cardinality Estimator?
Componente centrale del Query Processor
Ha il compito di stimare la cardinalità degli insiemi di
righe che soddisfano uno o più predicati
Le stime di cardinalità sono utilizzate dall’optimizer per
produrre i piani di esecuzione
Le stime si basano sulle statistiche
6. Perché un nuovo Cardinality
Estimator?
Il vecchio CE è stato scritto per SQL Server 7
Codice vecchio di 15 anni!
Molte nuove feature
Molte modifiche
Complessità elevata
Difficile da manutenere
Conveniente una riscrittura completa
7. Come si attiva il nuovo CE?
Per attivare il nuovo CE:
ALTER DATABASE AdventureWorks2012 SET COMPATIBILITY_LEVEL = 120;
--oppure
DBCC TRACEON(2312);
Per disattivare il nuovo CE:
ALTER DATABASE AdventureWorks2012 SET COMPATIBILITY_LEVEL = 110;
--oppure
DBCC TRACEON(9481);
8. Perché disattivare il nuovo CE?
Molti algoritmi sono cambiati
Codice complesso
Possibilità di regressione
Nuovi bug
Correzione di bug che nascondono altri bug
Compatibility 110 consente di mantenere il
comportamento precedente
9. Come funziona il CE?
Interroga le statistiche per stimare il numero di righe
DBCC SHOW_STATISTICS (
'Sales.SalesOrderHeader',
'OrderDate')
WITH HISTOGRAM;
10. Come funziona il CE?
SELECT *
FROM Sales.SalesOrderHeader
WHERE OrderDate = '2007-01-01'
14. Colonne Ascendenti
Colonne ascendenti manca un valore nell’istogramma
per le righe appena inserite
TF 2389 e 2390 forzano l’interrogazione del valore
Massimo
Con il nuovo CE non è più necessario usare i TF
Sono già attivi di default