Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

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
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 MASTERGOIF EXISTS (SELECT * FROM sysdatabases where name = 'LinktestTarget')	DROP DATABASE LinktestTargetGOCREATE DATABASE LinktestTargetGOALTER DATABASE LinktestTarget MODIFY FILE(NAME = 'LinktestTarget', SIZE = 200MB)GOALTER 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 = @@serverNameIF 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 LinktestTargetGOCREATE 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]GOSET NOCOUNT ONGODECLARE @counter intSET @counter = 1WHILE @counter < 50000BEGIN	INSERT INTO T1 (c1, c2, c3) VALUES (@counter, @counter,'')	SET @counter = @counter + 1ENDGOUPDATE 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 ASET A.c2 = B.c2FROM LS.LinktestTarget.dbo.T1 AS A 	JOIN @t2 as B on B.c1 = A.c1

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 942982 - Ultima revisione: 10/23/2007 23:07:31 - Revisione: 1.1

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition

  • kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtit
Feedback