Le prestazioni risultano rallentate quando si esegue una query in SQL Server 2005 che aggiorna una tabella in un server collegato e quindi unisce in join la tabella a una tabella nel server locale

Traduzione articoli Traduzione articoli
Identificativo articolo: 942982 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Si consideri lo scenario seguente:
  • È una query che aggiorna una tabella in un server collegato e quindi unisce in join la tabella a una tabella nel server locale.
  • Il server locale è in esecuzione Microsoft SQL Server 2005.
  • Sul server locale, si esegue la query in SQL Server 2005.
In questo scenario, le prestazioni risultano rallentate confrontato con le prestazioni della stessa query in Microsoft SQL Server 2000. Ad esempio, quando si esegue la query in SQL Server 2000, la query ha meno di 1 secondo alla fine. Tuttavia, quando si esegue la query in SQL Server 2005, la query ha circa 24 secondi alla fine.

Cause

La query esegue un'operazione di analisi remoto la tabella sul server collegato. Quando si esegue la query in SQL Server 2005, l'operazione di analisi remoto recupera tutte le righe della tabella. Se la tabella contiene molte righe, l'operazione di analisi remoto richiede molto tempo per terminare.

Tuttavia, quando si esegue la query in SQL Server 2000, l'operazione di query remoto invia la query da eseguire sul server collegato. Di conseguenza, anche se la tabella contiene il numero di righe, l'operazione di analisi remoto è completato in breve tempo.

Workaround

Per risolvere questo problema, aggiungere un vincolo UNIQUE o un vincolo PRIMARY KEY della tabella sul server locale. Aggiungere il vincolo sulla colonna da utilizzare per l'operazione di JOIN.

Ad esempio, è possibile aggiornare l'istruzione DECLARE menzionato nella sezione passaggio 4 di "ulteriori informazioni" al seguente:
DECLARE @t2 table (c1 int primary key, c2 int)

Status

Microsoft ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a".

Informazioni

Procedura per riprodurre il problema


Nota La procedura seguente si presuppone che due server che eseguono SQL Server 2005. Un nome di istanza è ServerA\SQL2005. L'altri nome dell'istanza è ServerB\SQL2005.
  1. Nell'istanza di server di SQL Server 2005, eseguire le seguenti istruzioni per creare un database in SQL Server Management Studio:
    USE MASTER
    GO
    IF EXISTS (SELECT * FROM sysdatabases where name = 'LinktestTarget')
    	DROP DATABASE LinktestTarget
    GO
    CREATE DATABASE LinktestTarget
    GO
    
    ALTER DATABASE LinktestTarget MODIFY FILE
    (NAME = 'LinktestTarget', SIZE = 200MB)
    GO
    ALTER DATABASE LinktestTarget MODIFY FILE
    (NAME = 'LinktestTarget_log', SIZE = 100MB)
    GO
  2. Nell'istanza di ServerB di SQL Server 2005, eseguire le seguenti istruzioni per creare un server collegato in Management Studio: nvarchar (50) @ serverName di
    DECLARE @serverName nvarchar(50)
    SET @serverName = @@serverName
    
    IF EXISTS (SELECT * FROM master..sysservers WHERE srvname = 'LS')
    	EXEC master.dbo.sp_dropserver @server=N'LS', @droplogins='droplogins'
    
    EXEC sp_addlinkedserver
        @server = N'LS',
        @srvproduct = N'SQLDB',
        @provider = N'SQLOLEDB',
        @datasrc = N'ServerA\SQL2005',
        @catalog = N'LinktestTarget'
    
    EXEC sp_serveroption N'LS', N'data access', N'true'
    EXEC sp_serveroption N'LS', N'rpc out', N'true'
    EXEC sp_serveroption N'LS', N'rpc', N'true'
    EXEC sp_serveroption N'LS', N'use remote collation', N'true'
    EXEC sp_addlinkedsrvlogin
      @rmtsrvname = N'LS',
      @useself = N'true',
      @locallogin = N'sa'
  3. Nell'istanza di server di SQL Server 2005, eseguire la seguente istruzione per creare una tabella e quindi riempire la tabella con 50.000 righe di dati:
    USE LinktestTarget
    GO
    CREATE TABLE [T1] (
    	[c1] [int]  NOT NULL,
    	[c2] [int] NOT NULL,
    	[c3] char (4000) NOT NULL,
    	CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED ([c1])
    WITH FILLFACTOR = 80 ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    SET NOCOUNT ON
    GO
    DECLARE @counter int
    SET @counter = 1
    
    WHILE @counter < 50000
    BEGIN
    	INSERT INTO T1 (c1, c2, c3) VALUES (@counter, @counter,'')
    	SET @counter = @counter + 1
    END
    GO
    UPDATE STATISTICS T1 (PK_t1) WITH FULLSCAN
  4. Nell'istanza di ServerB di SQL Server 2005, eseguire le seguenti istruzioni. Si noti che le prestazioni sono lenta.
    DECLARE @t2 table (c1 int, c2 int)
    INSERT INTO @t2 (c1, c2) VALUES (399990, 399990)
     
    UPDATE A
    SET A.c2 = B.c2
    FROM LS.LinktestTarget.dbo.T1 AS A 
    	JOIN @t2 as B on B.c1 = A.c1

Proprietà

Identificativo articolo: 942982 - Ultima modifica: martedì 23 ottobre 2007 - Revisione: 1.1
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Chiavi: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 942982
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com