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

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 942982 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

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 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. 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 = @@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. 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 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. 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 A
    SET A.c2 = B.c2
    FROM LS.LinktestTarget.dbo.T1 AS A 
    	JOIN @t2 as B on B.c1 = A.c1

Eigenschaften

Artikel-ID: 942982 - Geändert am: Dienstag, 23. Oktober 2007 - Version: 1.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Keywords: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtde
Maschinell übersetzter Artikel
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.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 942982
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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