Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Wenn Sie eine Abfrage in SQL Server 2005 ausführen, die eine Tabelle auf einen verknüpften Server aktualisiert und dann in der Tabelle zu einer Tabelle auf dem lokalen Server hinzugefügt, ist Leistung langsam

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

942982
Problembeschreibung
Stellen Sie sich das folgende Szenario vor:
  • Sie verfügen über eine Abfrage, die eine Tabelle auf einen verknüpften Server aktualisiert und dann in der Tabelle zu einer Tabelle auf dem lokalen Server hinzugefügt.
  • Der lokale Server wird Microsoft SQL Server 2005 ausgeführt.
  • Auf dem lokalen Server Ausführen der Abfrage in SQL Server 2005.
In diesem Szenario ist Leistung langsam verglichen mit der Leistung von der gleichen Abfrage in Microsoft SQL Server 2000. Beispielsweise wenn Sie die Abfrage in SQL Server 2000 ausführen, hat die Abfrage weniger als 1 Sekunde um fertig zu stellen. Beim Ausführen der Abfrage in SQL Server 2005 hat die Abfrage jedoch ca. 24 Sekunden um fertig zu stellen.
Ursache
Die Abfrage führt eine Operation Remote Scan in der Tabelle auf dem Verbindungsserver. Wenn Sie die Abfrage in SQL Server 2005 ausführen, ruft der Remote Scan-Vorgang alle Zeilen in der Tabelle ab. Wenn die Tabelle viele Zeilen enthält, dauert der Remote Scan-Vorgang abgeschlossen.

Wenn Sie die Abfrage in SQL Server 2000 ausführen, sendet die Operation Remote Query die Abfrage auf verknüpften Server ausführen. Selbst wenn die Tabelle viele Zeilen enthält, ist somit der Remote Scan-Vorgang in kurzer Zeit abgeschlossen.
Abhilfe
Um dieses Problem zu umgehen, fügen Sie eine UNIQUE-Einschränkung oder eine PRIMARY KEY-Einschränkung in der Tabelle auf dem lokalen Server. Fügen Sie die Einschränkung auf die Spalte, die Sie für die JOIN-Operation verwenden.

Beispielsweise aktualisieren Sie die im Abschnitt Schritt 4 der "Weitere Informationen" die folgende DECLARE-Anweisung:
DECLARE @t2 table (c1 int primary key, c2 int)
Status
Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind.
Weitere Informationen

Schritte zum Reproduzieren des Problems


Hinweis: Den folgenden Schritten wird davon ausgegangen, dass Sie zwei Server verfügen, die SQL Server 2005 ausgeführt werden. Ein Instanzname ist ServerA\SQL2005. Name der anderen Instanz ist ServerB\SQL2005.
  1. Führen Sie auf ServerA Instanz von SQL Server 2005, die folgenden Anweisungen zum Erstellen einer Datenbank 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. Führen Sie auf Server B Instanz von SQL Server 2005, die folgenden Anweisungen so erstellen Sie einen Verbindungsserver in Management Studio:
    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. Auf ServerA Instanz von SQL Server 2005, führen Sie die folgende Anweisung zum Erstellen einer Tabelle, und füllen Sie die Tabelle mit 50.000 Zeilen mit Daten:
    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. Führen Sie auf Server B Instanz von SQL Server 2005 die folgenden Anweisungen aus. Beachten Sie, dass die Leistung langsam ist.
    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

Warnung: Dieser Artikel wurde automatisch übersetzt

Eigenschaften

Artikelnummer: 942982 – Letzte Überarbeitung: 10/23/2007 23:07:31 – Revision: 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 KbMtde
Feedback