Symptom
Föreställ dig följande:
-
En länkad server konfigureras mellan en lokal server och en fjärransluten server som båda har instanser av Microsoft SQL Server 2012.
-
Den lokala servern är konfigurerad med en sortering som skiftlägesokänslig.
-
Fjärrservern har ett objekt som har konfigurerats i en annan sortering från den lokala servern, till exempel skiftlägeskänslig sortering.
-
En anslutning görs från Microsoft JDBC driver för SQL Server, Microsoft ODBC-drivrutinen för SQL Server, SQL OLE DB-provider eller SQL Native Client till den lokala servern.
-
Drivrutinen utför en uppdatering Transact-SQL-fråga som ett förberett uttryck som anropar sp_prepexec lagrad procedur på den lokala servern.
-
Frågan uppdaterar en tabell på fjärrservern. Detta inkluderar ett kolumn-objekt som använder en annan sortering från den lokala servern.
I det här scenariot kan det uppstå långsamma prestanda i frågan. Om du markerar Körningsplan för uppdateringsfrågan syns en fjärrsökning utförs på tabellen i den fjärranslutna servern utan filtrering. Frågan kan därför utföra många läsningar när den söker igenom tabellen remote och hämtar alla rader till den lokala servern.
Till exempel frågan är beredd på den lokala servern som har skiftlägesokänslig Standardsortering och fjärrservern har en tabell T1 som innehåller en kolumn som är skiftlägeskänsliga. Uppdateringen söks alla rader i 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
Orsak
Problemet uppstår eftersom förberedda uppdateringsfråga genomsöker tabellen remote när sorteringen inte matchar på båda servrarna.
Lösning
När du har installerat snabbkorrigeringen måste du aktivera spårningsflagga 4199 på den lokala servern som är värd för länkad server. Hur du aktiverar traceflag, finns i avsnittet Mer information.
Obs! Snabbkorrigeringen gäller endast för den lokala servern som är värd länkad server och optimerar de förberedda rapporterna. Den här snabbkorrigeringen gäller inte till fjärrservern.
Problemet korrigerades först i följande kumulativ uppdatering av SQL Server.
Kumulativ uppdatering 6 för SQL Server 2012 SP1/en-us/help/2874879
Varje ny kumulativ uppdatering för SQL Server innehåller alla snabbkorrigeringar och alla säkerhetskorrigeringar som ingick i den tidigare kumulativa uppdateringen. Checka ut de senaste kumulativa uppdateringarna för SQL Server:
Information om snabbkorrigeringenEn snabbkorrigering är tillgänglig från Microsoft. Den här snabbkorrigeringen är emellertid avsedd att åtgärda det problem som beskrivs i denna artikel. Använd bara den här snabbkorrigeringen för system med just detta problem.
Om snabbkorrigeringen är tillgänglig för hämtning finns ett avsnitt för "Snabbkorrigeringen är tillgänglig" överst i den här Knowledge Base-artikeln. Om det här avsnittet inte visas, skicka en begäran till Microsofts kundtjänst och Support för att få snabbkorrigeringen.
Obs! Om det uppstår ytterligare problem eller krävs felsökning, kan du behöva skapa en serviceförfrågan. De vanliga supportkostnaderna gäller för övriga supportfrågor och problem som inte uppfyller kraven för den här snabbkorrigeringen. En fullständig lista över telefonnummer för Microsofts kundtjänst och Support eller skapa en serviceförfrågan finns på följande Microsoft-webbplats:
http://support.microsoft.com/contactus/?ws=supportObs! "Snabbkorrigeringen tillgänglig"-formuläret visar de språk som snabbkorrigeringen är tillgänglig. Om ditt språk inte visas beror det på att ingen snabbkorrigering är tillgänglig för språket.
FörutsättningarOm du vill installera den här snabbkorrigeringen måste du ha SQL Server 2012 installerat.
RegisterinformationDu behöver inte ändra registret när du har installerat den här snabbkorrigeringen.
Ersättningsinformation för HotfixDen här snabbkorrigeringen ersätter inte några andra snabbkorrigeringar.
Status
Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet "Gäller".
Temporär lösning
Att arbeta fler problemet, använder du någon av följande metoder:
-
Använd inte de förberedda rapporterna i klient-programmets källkod. Du kan använda ad hoc-rapporter eller callable uttryck som lagrade procedurer i stället om drivrutinen som stöder dessa gränssnitt.
-
Använd matchande sortering på båda servrarna.
Mer Information
Om du vill aktivera spårning flaggan, lägger du till startparamentern -T4199 eller DBCC TRACEON(4199,-1) innan förberedda uttrycket är kompilerad för att aktivera funktionen.
Du kan använda någon av följande metoder för att aktivera spårningsflagga:
-
Innan du startar SQL Server, Microsoft SQL Server Konfigurationshanteraren, högerklicka på den aktuella instansen och lägger till startparamentern -T4199 så att det kvarstår mellan omstarter och mellan alla anslutningar till instansen i framtiden.
-
Dynamiskt aktivera inställningen vid körning när tjänsten har kommit igång och globalt för alla anslutningar "(-1)." Glöm inte att frigöra procedur cache om du planerar att göra tester med växeln aktiverat eller inaktiverat.
Använda följande för att aktivera inställningen globalt och dynamiskt:
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
Använda följande för att inaktivera inställningen globalt och dynamiskt:
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE