Symptômes
Considérez le scénario suivant :
-
Un serveur lié est configuré entre un serveur local et un serveur distant ont des instances de Microsoft SQL Server 2012.
-
Le serveur local est configuré à l’aide d’un classement, par exemple un classement insensible à la casse.
-
Le serveur distant dispose d’un objet qui est défini dans un autre classement à partir du serveur local, comme le classement sensible à la casse.
-
Une connexion est établie à partir du pilote JDBC de Microsoft pour SQL Server, pilote ODBC de Microsoft pour SQL Server, fournisseur SQL OLE DB ou SQL Native Client sur le serveur local.
-
Le pilote exécute une requête de mise à jour de Transact-SQL sous la forme d’une instruction préparée qui appelle la procédure sp_prepexec stockées sur le serveur local.
-
La requête met à jour une table sur le serveur distant. Cela inclut un objet column qui utilise un classement différent à partir du serveur local.
Dans ce scénario, vous pouvez rencontrer ralentissement des performances de l’exécution de la requête. Si vous activez le plan d’exécution de la requête de mise à jour, vous pouvez voir qu’une analyse à distance est effectuée sur la table sur le serveur distant sans filtrage. Par conséquent, la requête peut effectuer des nombreuses lectures lorsqu’il analyse la table distante et puis récupère toutes les lignes sur le serveur local.
Par exemple, la requête est préparée sur le serveur local qui a classement de non-respect de la casse par défaut, et le serveur distant a une table T1 qui contient une colonne qui respectent la casse. La mise à jour analyse toutes les lignes de T1.
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1
Cause
Le problème se produit parce que la requête de mise à jour préparé analysera la table distante lorsque le classement ne correspond pas sur les deux serveurs.
Résolution
Après avoir appliqué le correctif, vous devez activer l’indicateur de trace 4199 sur le serveur local qui héberge le serveur lié. Pour savoir comment activer la traceflag, reportez-vous à la section plus d’informations.
Remarque : Le correctif s’applique uniquement au serveur local qui héberge le serveur lié et optimise les instructions préparées. Ce correctif logiciel ne s’applique pas au serveur distant.
Le problème a été tout d’abord résolu dans la mise à jour cumulative suivante de SQL Server.
Mise à jour cumulative 6 pour SQL Server 2012 SP1/en-us/help/2874879
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et de sécurité inclus dans la mise à jour cumulative précédente. Découvrez les dernières mises à jour cumulatives pour SQL Server :
Informations sur le correctifUn correctif pris en charge est disponible auprès de Microsoft. Toutefois, ce correctif vise à corriger uniquement le problème décrit dans cet article. Appliquez ce correctif uniquement aux systèmes rencontrant ce problème spécifique.
Si le correctif est disponible pour le téléchargement, il existe une section « Téléchargement de correctif logiciel disponible » au début de cet article de la Base de connaissances. Si cette section n’apparaît pas, soumettez une demande au Service Clients et Support de Microsoft pour obtenir le correctif.
Remarque Si des problèmes supplémentaires se produisent ou si des procédures de dépannage sont nécessaires, vous devrez peut-être formuler une demande de service distincte. Les coûts habituels du support technique s'appliqueront aux questions et problèmes qui ne relèvent pas de ce correctif logiciel. Pour une liste complète des numéros de téléphone service clientèle de Microsoft ou pour créer une demande de service distincte, visitez le site Web Microsoft suivant :
http://support.microsoft.com/contactus/?ws=supportRemarque Le formulaire « Téléchargement de correctif logiciel disponible » affiche les langues pour lesquelles le correctif est disponible. Si vous ne voyez pas votre langue, c'est parce qu'il n'y a pas de correctif disponible pour cette langue.
Conditions préalablesPour appliquer ce correctif, vous devez disposer de SQL Server 2012 est installé.
Informations concernant le RegistreVous n’êtes pas obligé de modifier le Registre après avoir appliqué ce correctif.
Informations de remplacement du correctifCe correctif ne remplace aucun autre correctif.
État
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».
Solution de contournement
Travailler sont nombreux le problème, utilisez une des méthodes suivantes :
-
N’utilisez pas ces instructions dans le code source d’application client. Vous pouvez utiliser les instructions ad hoc ou pouvant être appelé par comme des procédures stockées à la place si le pilote prend en charge ces interfaces.
-
Utilisez le classement correspondant sur les deux serveurs.
Plus d'informations
Pour activer l’indicateur de trace, ajoutez le paramètre de démarrage -T4199 ou TRACEON(4199,-1) de DBCC avant l’instruction préparée est compilée pour activer le comportement.
Vous pouvez utiliser une des méthodes suivantes pour activer l’indicateur de Trace :
-
Avant de démarrer SQL Server, utilisez le Gestionnaire de Configuration de Microsoft SQL Server, avec le bouton droit à l’instance concernée et d’ajouter le paramètre de démarrage -T4199 afin qu’il persiste lors des redémarrages et sur toutes les connexions à l’instance à l’avenir.
-
Dynamiquement activer le paramètre lors de l’exécution une fois que le service démarre et globalement pour toutes les connexions "(-1). » Veillez à libérer le cache de procédure, si vous envisagez de faire des tests avec le commutateur sous tension ou hors tension.
Utilisez la suivante pour activer le paramètre global et dynamique :
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
Utilisez la suivante pour désactiver le paramètre de manière globale et dynamique :
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE