SQL Server 2014 – quelques requêtes très lentes (estimateur de cardinalité)

Dans notre environnement de production, nous avions plusieurs servers avec SQL server 2012 SP2+Windows Server 2008R2 . Il y a 3 mois, nous migrons tous les servers vers SQL Server 2014 SP1+Windows Server 2012 R1 . Nous avons créé de nouveaux servers avec une nouvelle configuration (plus de RAM, plus de CPU, plus d'espace disque) et sauvegardez nos bases de données à partir de SQL Server 2012 -> restaurer vers les nouveaux SQL Server 2014 . Après la restauration, nous avons changé le niveau de compatibilité de 110 à 120 + Rebuild Index + Update.

Mais maintenant nous avons des problèmes avec plusieurs requêtes qui fonctionnent très lentement lorsque le niveau de compatibilité 120. Si nous changeons le niveau de compatibilité à l'ancien 110, il fonctionne très vite.

Je search beaucoup sur ce problème, mais je n'ai rien trouvé.

SQL Server 2014 introduit un nouvel estimateur de cardinalité

L'une des améliorations de performance dans SQL Server 2014 est la refonte de l'estimation de la cardinalité. Le composant qui fait l'estimation de cardinalité (CE) s'appelle l'estimateur de cardinalité. C'est le composant essentiel du processeur de requête SQL pour la génération de plan de requête. Les estimations de la cardinalité sont des prédictions du nombre de lignes finales et des nombres de lignes des résultats intermédiaires (tels que les jointures, le filtrage et l'agrégation). Ces estimations ont un impact direct sur les choix de plan tels que l'ordre de jointure, le type de jointure etc. Avant SQL Server 2014, l'estimateur de cardinalité était largement basé sur la base de code SQL Server 7.0. SQL Server 2014 introduit un nouveau design et le nouvel estimateur de cardinalité est basé sur la search sur les charges de travail modernes et sur l'apprentissage de l'expérience passée.

Les indicateurs de trace 9481 et 2312 peuvent être utilisés pour contrôler quelle version de Cardinality Estimator est utilisée.

Vérifiez les requêtes qui causent des problèmes et comparez les propriétés des plans d'exécution, le nombre estimé de lignes par rapport au nombre réel de lignes en 2008 et 2014.

Estimations de cardinalité dans Microsoft SQL Server 2014


À partir de SQL Server 2016+ vous pouvez définir l'ancien estimateur de cardinalité par database sans utiliser de traceflags ou en modifiant le niveau de compatibilité DB à 110.

ALTER DATABASE SCOPED CONFIGURATION

Cette instruction permet la configuration d'un certain nombre de parameters de configuration de database au niveau de la database individuelle, indépendamment de ces parameters pour toute autre database.

LEGACY_CARDINALITY_ESTIMATION = {ON | OFF | PRIMAIRE}

Vous permet de définir le model d'estimation de la cardinalité de l'optimiseur de requête sur SQL Server 2012 et version antérieure, indépendamment du niveau de compatibilité de la database. Ceci est équivalent à Trace Flag 9481 . Pour définir cela au niveau de l'instance, voir Indicateurs de trace (Transact-SQL). Pour ce faire au niveau de la requête, ajoutez l' QUERYTRACEON requête QUERYTRACEON .

SUR

Définit le model d'estimation de la cardinalité de l'optimiseur de requête sur SQL Server 2012 et version antérieure du model d'estimation de la cardinalité.

DE

Définit le model d'estimation de la cardinalité de l'optimiseur de requête en fonction du niveau de compatibilité de la database.

 ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;