Výkon je pomalý při spuštění dotazu v SQL Server 2005, které aktualizace tabulky na propojený server a potom spojí tabulku k tabulce na místním serveru

Překlady článku Překlady článku
ID článku: 942982 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Předpokládejme následující situaci:
  • Máte dotaz, který aktualizuje tabulku na propojený server a potom spojí tabulku k tabulce na místním serveru.
  • Místní server je spuštěn 2005 Microsoft SQL Server.
  • Na místním serveru spusťte dotaz SQL Server 2005.
V tomto scénáři je pomalé porovnání výkonu stejný dotaz 2000 Microsoft SQL Server. Například při spuštění dotazu SQL Server 2000 dotazu trvá dokončení menší než 1 sekunda. Však při spuštění dotazu SQL Server 2005 v dotazu trvá přibližně 24 sekund na dokončení.

Příčina

Dotaz provádí operace vzdálené skenování na tabulce propojeného serveru. Při spuštění dotazu v SQL Server 2005 operace vzdálené Scan načte všechny řádky v tabulce. Pokud tabulka obsahuje mnoho řádků, skenovat vzdálené operace trvá dlouho dokončení.

Při spuštění dotazu SQL Server 2000 operace vzdálený dotaz odešle dotaz spustit na propojeného serveru. I když tabulka obsahuje mnoho řádků, operace vzdálené skenování je tedy dokončení v krátké době.

Jak potíže obejít

Chcete-li vyřešit tento problém, Přidat omezující podmínce UNIQUE nebo omezení PRIMARY KEY v tabulce na místním serveru. Přidat omezení sloupec použít pro operaci JOIN.

Například prohlášení DECLARE uvedených v části Krok 4 "Další informace" následující aktualizaci:
DECLARE @t2 table (c1 int primary key, c2 int)

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.

Další informace

Kroky pro reprodukci problému


Poznámka: Následující postup předpokládá, že máte dva servery se systémem SQL Server 2005. Název jedné instance je ServerA\SQL2005. Název instance je ServerB\SQL2005.
  1. Na instanci serveru SQL Server 2005 Server_a spusťte následující příkazy k vytvoření databáze 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. V ServerB instance SQL Server 2005, spusťte následující příkazy vytvořit propojený server 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. Na instanci serveru SQL Server 2005 Server_a spustit následující příkaz k vytvoření tabulky a naplnit tabulku s 50 000 řádků dat:
    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. V ServerB instance SQL Server 2005 spusťte následující příkazy. Všimněte si, že výkon je pomalý.
    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

Vlastnosti

ID článku: 942982 - Poslední aktualizace: 23. října 2007 - Revize: 1.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Klíčová slova: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:942982

Dejte nám zpětnou vazbu

 

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