Symptomen
Overweeg het volgende scenario:
-
Een gekoppelde server is geconfigureerd tussen de lokale en een externe server hebben beide exemplaren van Microsoft SQL Server 2012.
-
De lokale server is geconfigureerd met een sortering, zoals een niet-hoofdlettergevoelige sortering.
-
De externe server heeft een object dat is geconfigureerd in een andere sortering van de lokale server, zoals een hoofdlettergevoelige sortering.
-
Een verbinding wordt gemaakt van Microsoft JDBC-stuurprogramma voor SQL Server, SQL Server, de SQL OLE DB-provider of de SQL Native Client ODBC-stuurprogramma op de lokale server.
-
Het stuurprogramma wordt uitgevoerd een Transact-SQL update-query als een voorbereide instructie die de procedure sp_prepexec is opgeslagen op de lokale server roept.
-
De query een tabel op de externe server bijgewerkt. Dit omvat een column-object dat een andere sortering van de lokale server gebruikt.
In dit scenario kan traag van uitvoering van de query. Als u het selectievakje het uitvoeringsplan van de update-query, ziet u dat een externe scan zonder te filteren op de tabel in de externe server wordt uitgevoerd. Daarom kan de query veel uitvoeren wanneer het scannen van de externe tabel en vervolgens alle rijen naar de lokale server worden.
Bijvoorbeeld, de query wordt voorbereid op de lokale server met niet-hoofdlettergevoelige standaardsortering en de externe server heeft een tabel T1 die een kolom bevat die zijn hoofdlettergevoelig. De update scant alle rijen van 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
Oorzaak
Het probleem treedt op omdat de voorbereide bijwerkquery de externe tabel scant als de sortering niet op beide servers overeenkomt.
Oplossing
Nadat u de hotfix hebt toegepast, moet u traceringsvlag 4199 op de lokale server die fungeert als de gekoppelde server inschakelen. Voor informatie over het inschakelen van de traceermarkering, raadpleegt u de sectie met meer informatie.
Opmerking De hotfix is alleen van toepassing op de lokale server die fungeert als de gekoppelde server en optimaliseert de voorbereide instructies. Deze hotfix is niet van toepassing op de externe server.
Het probleem is in eerste instantie opgelost in de volgende cumulatieve update van SQL Server.
6 cumulatieve Update voor SQL Server 2012 SP1/en-us/help/2874879
Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingscorrecties die zijn opgenomen in de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:
Informatie over de hotfixEen ondersteunde hotfix is beschikbaar bij Microsoft. Deze hotfix is echter alleen bedoeld voor het probleem dat wordt beschreven in dit artikel. Voer deze hotfix alleen uit op systemen waarop dit specifieke probleem zich voordoet.
Als de hotfix gedownload kan worden, is er een sectie 'Hotfix downloaden' aan het begin van dit Knowledge Base-artikel. Als deze sectie niet wordt weergegeven, dien dan een verzoek in bij Microsoft Customer Service and Support om de hotfix te verkrijgen.
Opmerking Als er andere problemen optreden of als probleemoplossing is vereist, moet u wellicht een apart serviceverzoek indienen. De normale ondersteuningskosten gelden voor extra ondersteuningsvragen en problemen die niet in aanmerking komen voor deze specifieke hotfix. Voor een volledige lijst met telefoonnummers van Microsoft Customer Service and Support of een afzonderlijk serviceverzoek maken, gaat u naar de volgende Microsoft-website:
http://support.microsoft.com/contactus/?ws=supportOpmerking Het formulier 'Hotfix kan worden gedownload' geeft de talen weer waarvoor de hotfix beschikbaar is. Als uw taal niet wordt weergegeven, is dit omdat een hotfix niet voor die taal beschikbaar is.
VereistenDeze hotfix moet u SQL Server 2012 geïnstalleerd hebben.
Informatie over het registerU beschikt niet over het register wijzigen nadat u deze hotfix hebt toegepast.
Informatie over het vervangen van hotfixesDeze hotfix vervangt geen andere hotfixes.
Status
Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'.
Tijdelijke oplossing
Werkt iedereen kent wel het probleem, gebruikt u een van de volgende methoden:
-
Gebruik geen voorbereide instructies in de broncode van de client-toepassing. Kunt u ad hoc-instructies of callable overzichten zoals opgeslagen procedures in plaats daarvan als het stuurprogramma deze interfaces ondersteunt.
-
Overeenkomende sortering op beide servers gebruiken.
Meer informatie
Toevoegen zodat de traceringsvlag opstartparameter -T4199 of DBCC TRACEON(4199,-1) voordat de voorbereide instructie zodat het gedrag wordt gecompileerd.
U kunt een van de volgende methoden de traceringsvlag inschakelen:
-
Voordat u SQL Server, Microsoft SQL Server Configuration Manager gebruiken, met de rechtermuisknop op het desbetreffende exemplaar en de opstartparameter toevoegen -T4199 zodat blijft bestaan tussen het opnieuw opstarten en alle verbindingen met het exemplaar in de toekomst.
-
Dynamisch de inschakelt tijdens runtime nadat de service is gestart en globaal voor alle verbindingen "(-1)." Zorg ervoor dat de procedurecache vrij te maken als u wilt testen met de schakeloptie ingeschakeld of uitgeschakeld.
Gebruik het volgende om de instelling globaal en dynamisch:
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
Gebruik het volgende om de instelling te schakelen globaal en dynamisch:
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE