Symptômes
Supposez que vous avez appliqué Microsoft SQL Server 2012 Service Pack 2 (SP2) sur votre ordinateur. Vous appelez le cdc.fn_cdc_get_net_changes_<capture_instance> la requête de capture de données de modification (CDC) dans la procédure stockée sp_executesql et il est possible qu’elle provient d’une source d’application telle que SQL Server Management Studio Server (SSMS), CDC lui-même ou les packages SQL Server Integration Services (SSIS). Dans ce cas, vous subissez des performances médiocres dans SQL Server 2012.RemarqueLa baisse des performances peut être importante. Par exemple, une requête peut se terminer dans quelques secondes dans SQL Server 2012 SP1. Toutefois, la même requête peut prendre plusieurs heures pour s’exécuter dans SQL Server 2012 SP2. Par ailleurs, la mise à jour des statistiques ne permet pas de résoudre le problème.
Cause
Ce problème survient en raison d’un problème d’estimation de cardinalité affectant sérieusement les performances de l' cdc.fn_cdc_get_net_changes_<capture_instance> requête.
Résolution
Le problème a été résolu dans la mise à jour cumulative suivante de SQL Server.
Mise à jour cumulative 3 pour SQL Server 2012 SP2 /en-us/help/3002049
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs et les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :
Solution de contournement
Pour contourner ce problème, utilisez l’indicateur de requête option (RECOMPILE) dans votre requête. Dans le cas où la requête est déclenchée à partir de composants CDC de SSIS, l' option (RECOMPILE) peut être forcée en créant un repère de plan comme dans l’exemple suivant :Exec sp_create_plan_guide @name = N'CDC_Query1_PlanGuide', @stmt = N'select [__$start_lsn],[__$operation],[__$update_mask],[Column1],[Column2],[Column3] from [cdc].[fn_cdc_get_net_changes_dbo_Table1](CONVERT(binary(10), @cs, 1), CONVERT(binary(10), @ce, 1), @mode)',@type = N'SQL',@module_or_batch = NULL, @params = N'@ce nvarchar(22),@mode nvarchar(14),@cs nvarchar(22)', @hints = N'OPTION (RECOMPILE)'; RemarqueVous devez remplacer l’exemple de requête par la requête avec laquelle vous rencontrez un problème. Vous pouvez le faire à partir de la trace du Générateur de profils , afin qu’aucun caractère supplémentaire ne soit ajouté par erreur. De plus, assurez-vous que la requête sélection est placée sur une seule ligne (par exemple, elle ne doit pas avoir de retour chariot ou de saut de ligne) pour permettre au Guide de plan de fonctionner correctement. Vous pouvez également avoir besoin d’utiliser DBCC FREEPROCCACHE pour masquer l’ancien plan dans le cache.
Statut
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.