SQL Server 2005, bağlantılı bir sunucu üzerinde bir tablosunu güncelleştirir ve sonra yerel sunucuda bir tabloya tabloyu birleştiren bir sorgu çalıştırdığınızda performansı yavaşlıyor

Makale çevirileri Makale çevirileri
Makale numarası: 942982 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Şu senaryoyu inceleyin:
  • Bağlantılı bir sunucu üzerinde bir tablosunu güncelleştirir ve sonra yerel sunucuda bir tabloya tabloyu birleştiren bir sorgu var.
  • Microsoft SQL Server 2005, yerel sunucu çalışıyor.
  • Yerel sunucu üzerinde SQL Server 2005'te sorguyu çalıştırın.
Bu senaryoda, performansı aynı sorguda bir Microsoft SQL Server 2000 ile karşılaştırıldığında, performansı yavaş gelir. Örneğin, SQL Server 2000'de Sorguyu çalıştırdığınızda, sorgu 1 bitmesini saniyeden alır. Ancak, SQL Server 2005'te Sorguyu çalıştırdığınızda, sorgu tamamlanması yaklaşık 24 saniye sürer.

Neden

Sorgu, bağlantılı bir sunucu üzerinde bir tabloyu uzaktan tarama işlemi gerçekleştirir. SQL Server 2005'te Sorguyu çalıştırdığınızda, uzaktan tarama işlemi tablosundaki tüm satırları alır. Tablo çok fazla satır içeriyorsa, uzaktan tarama işlemi tamamlamak için uzun sürüyor.

Ancak, SQL Server 2000'de Sorguyu çalıştırdığınızda, uzaktan Query işlemi bağlantılı bir sunucu üzerinde çalıştırmak için bir sorgu gönderir. Bu nedenle, çok sayıda tablo içeriyor olsa bile, kısa bir süre uzaktan tarama işlemi tamamlanır.

Pratik Çözüm

Bu soruna geçici bir çözüm bulmak için <a0></a0>, yerel sunucuda tablosundaki bir UNIQUE sınırlamasıyla veya bir PRIMARY KEY kısıtlaması ekleyin. Kısıtlamayı KATıLMA işlemi için kullandığınız bir sütun ekleyin.

Örneğin, aşağıdaki adım 4 "daha fazla bilgi" bölümünde açıklanan DECLARE bildirimi güncelleştirmeniz:
DECLARE @t2 table (c1 int primary key, c2 int)

Durum

Microsoft, "Geçerli Olduğu Ürünler" bölümünde listelenen Microsoft ürünlerinde bu sorunun olduğunu onaylamıştır.

Daha fazla bilgi

Sorunu yeniden oluşturma adımları


Not Aşağıdaki adımlar, SQL Server 2005 çalıştıran iki sunucu olduğunu varsayalım. Bir örnek ServerA\SQL2005 adıdır. Diğer örnek ServerB\SQL2005 addır.
  1. SQL Server 2005'in ServerA örneğinde, SQL Server Management Studio'da bir veritabanı oluşturmak için aşağıdaki kodu çalıştırın:
    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. SQL Server 2005'in <a1>SunucuB</a1> örneğinde Management Studio'da bağlantılı bir sunucu oluşturmak için aşağıdaki kodu çalıştırın: @ sunucuadı
    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. SQL Server 2005'in ServerA örneğinde, bir tablo oluşturmak için aşağıdaki deyimi çalıştırın ve sonra da 50.000 satır veri içeren tabloyu doldurmak:
    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. SQL Server 2005'in <a1>SunucuB</a1> örneğinde, aşağıdaki ifadeyi çalıştırın. Performansı yavaş olduğuna dikkat edin.
    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

Özellikler

Makale numarası: 942982 - Last Review: 23 Ekim 2007 Salı - Gözden geçirme: 1.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
Anahtar Kelimeler: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:942982

Geri Bildirim Ver

 

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