Sintomi
Si consideri lo scenario seguente:
-
Viene configurato un server collegato tra un server locale e un server remoto che entrambi dispongono di istanze di Microsoft SQL Server 2012.
-
Il server locale viene configurato tramite un confronto, ad esempio le regole di confronto senza distinzione tra.
-
Il server remoto è un oggetto che viene configurato in un confronto diverso dal server locale, ad esempio le regole di confronto tra maiuscole e minuscole.
-
Connessione dal driver JDBC di Microsoft per SQL Server, il driver Microsoft ODBC per SQL Server, il provider OLE DB SQL o SQL Native Client al server locale.
-
Il driver esegue una query di aggiornamento di Transact-SQL come un'istruzione preparata che chiama la routine sp_prepexec memorizzati sul server locale.
-
La query viene aggiornata una tabella sul server remoto. Ciò include un oggetto colonna che utilizza regole di confronto diverse dal server locale.
In questo scenario, possono verificarsi un rallentamento delle prestazioni di esecuzione della query. Se si seleziona il piano di esecuzione di query di aggiornamento, si può vedere che viene eseguita una scansione remota sulla tabella nel server remoto senza filtro. Di conseguenza, la query può eseguire molte letture analizza la tabella remota e quindi recupera tutte le righe al server locale.
Ad esempio, viene preparata la query sul server locale che dispone di regole di confronto predefinite senza maiuscole/minuscole e il server remoto ha la tabella T1 che contiene una colonna che fanno distinzione tra maiuscole. L'aggiornamento analizzerà tutte le righe di 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
Causa
Il problema si verifica perché la query di aggiornamento preparato analizzerà la tabella remota quando le regole di confronto non corrisponde in entrambi i server.
Risoluzione
Dopo avere applicato l'hotfix, è necessario attivare il flag di traccia 4199 nel server locale che ospita il server collegato. Per istruzioni attivare il corso, consultare la sezione informazioni.
Nota: L'aggiornamento rapido si applica solo al server locale che ospita il server collegato e ottimizza le istruzioni preparate. Questo hotfix non si applica al server remoto.
Il problema è stato risolto prima nell'aggiornamento cumulativo seguente di SQL Server.
Aggiornamento cumulativo 6 per SQL Server 2012 SP1/en-us/help/2874879
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutte le correzioni di protezione che sono state incluse nell'aggiornamento cumulativo precedente. Estrarre gli ultimi aggiornamenti cumulativi per SQL Server:
Informazioni sull'hotfixUn hotfix supportato è disponibile da Microsoft. Tuttavia, questo hotfix è destinato esclusivamente alla correzione del problema descritto in questo articolo. Applicare questo hotfix solo ai sistemi in cui si verificano questo problema specifico.
Se l'hotfix è disponibile per il download, è presente una sezione "Hotfix disponibile per il download" all'inizio di questo articolo della Knowledge Base. Se non viene visualizzato in questa sezione, inviare una richiesta al servizio clienti Microsoft e supporto tecnico per ottenere l'hotfix.
Nota: Se si verificano ulteriori problemi o se è necessaria attività di risoluzione aggiuntiva, potrebbe essere necessario creare una richiesta di assistenza separata. I costi di supporto normale verranno applicati per eventuali ulteriori domande e problemi che non dovessero rientrare specifico hotfix in questione. Per un elenco completo dei numeri di telefono del servizio clienti Microsoft e supporto tecnico o per creare una richiesta di assistenza separata, visitare il seguente sito Web Microsoft:
http://support.microsoft.com/contactus/?ws=supportNota: Il modulo "Hotfix disponibile per il download" Visualizza le lingue per cui è disponibile l'hotfix. Se non viene visualizzata la lingua, è perché un aggiornamento rapido non è disponibile per tale lingua.
PrerequisitiPer applicare questo hotfix, è necessario disporre di SQL Server 2012 è installato.
Informazioni del Registro di sistemaNon è necessario modificare il Registro di sistema dopo aver applicato questo hotfix.
Informazioni sulla sostituzione dell'aggiornamento rapidoQuesto hotfix non sostituisce eventuali altri aggiornamenti rapidi.
Stato
Microsoft ha confermato che questo è un problema dei prodotti Microsoft elencati nella sezione "Si applica a".
Soluzione alternativa
Per utilizzare abbondano il problema, utilizzare uno dei seguenti metodi:
-
Non utilizzare le istruzioni preparate nel codice sorgente dell'applicazione client. È possibile utilizzare istruzioni ad hoc o richiamabile quali stored procedure se il driver supporta tali interfacce.
-
Utilizzare le regole di confronto corrispondenti su entrambi i server.
Ulteriori informazioni
Per attivare il flag di traccia, aggiungere il parametro di avvio -T4199 o TRACEON(4199,-1) di DBCC prima istruzione preparata viene compilata per abilitare il comportamento.
Per attivare il flag di traccia, è possibile utilizzare uno dei seguenti metodi:
-
Prima di avviare SQL Server, utilizzare Gestione configurazione di Microsoft SQL Server, fare l'istanza interessata e aggiungere il parametro di avvio -T4199 in modo da essere mantenuto in futuro attraverso riavvii e in tutte le connessioni all'istanza.
-
Attivare in modo dinamico l'impostazione in fase di esecuzione dopo che il servizio inizia e globalmente per tutte le connessioni "(-1)." Assicurarsi di liberare la cache delle procedure, se si prevede di eseguire test con l'opzione attivata o disattivata.
Utilizzare la seguente per attivare l'impostazione a livello globale e in modo dinamico:
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
Utilizzare la seguente per disattivare l'impostazione a livello globale e in modo dinamico:
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE