كان الأداء بطيئا عند تشغيل استعلام في SQL Server 2005 تحديث جدول على ملقم مرتبط ومن ثم ربط الجدول بجدول على الخادم المحلي

الأعراض

يرجى مراعاة السيناريو التالي:
  • لديك استعلام تحديث جدول على ملقم مرتبط، ثم ربط الجدول بجدول على الملقم المحلي.
  • يستخدم الملقم المحلي Microsoft SQL Server 2005.
  • على الملقم المحلي, يمكنك تشغيل الاستعلام في SQL Server 2005.
في هذا السيناريو، كان الأداء بطيئا مقارنة بأداء نفس الاستعلام في Microsoft SQL Server 2000. على سبيل المثال، عند تشغيل الاستعلام في SQL Server 2000، أخذ الاستعلام أقل من ثانية واحدة حتى النهاية. ومع ذلك، عند تشغيل الاستعلام في SQL Server 2005، يستغرق الاستعلام حوالي 24 ثانية لإنهاء.

السبب

ينفذ الاستعلام عملية "تفحص بعيد" في الجدول على ملقم مرتبط. عند تشغيل الاستعلام في SQL Server 2005، عملية "تفحص بعيد" استرداد كافة الصفوف في الجدول. إذا كان الجدول يحتوي على العديد من الصفوف، عملية "تفحص بعيد" وقتاً طويلاً للانتهاء.

ومع ذلك، عند تشغيل الاستعلام في SQL Server 2000، عملية "الاستعلام البعيد" إرسال الاستعلام لتشغيلها على ملقم مرتبط. ولذلك، إذا كان الجدول يحتوي على عدد من الصفوف، "تفحص بعيد" اكتمال العملية في فترة زمنية قصيرة.

الحل البديل

للتغلب على هذه المشكلة، أضف قيد "مفتاح أساسي" أو قيد فريد في الجدول على الملقم المحلي. إضافة القيد إلى العمود الذي تستخدمه لعملية الربط.

على سبيل المثال، يمكنك تحديث كشف DECLARE الموضح في الخطوة 4 من القسم "مزيد من المعلومات" على ما يلي:
DECLARE @t2 table (c1 int primary key, c2 int)

الحالة

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "ينطبق على".

مزيد من المعلومات

خطوات إعادة إنشاء هذه المشكلة


ملاحظة: تفترض الخطوات التالية أن اثنين من الملقمات التي تستخدم SQL Server 2005. اسم مثيل واحد من ServerA\SQL2005. اسم المثيل هو ServerB\SQL2005.
  1. ServerA مثيل SQL Server 2005، تشغيل العبارات التالية لإنشاء قاعدة بيانات في SQL Server إدارة Studio:
    USE MASTERGO
    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، تشغيل العبارات التالية لإنشاء ملقم مرتبط في إدارة 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. على ServerA مثيل SQL Server 2005، تشغيل العبارة التالية لإنشاء جدول، وقم بملء الجدول مع 50 ألف صف من البيانات:
    USE LinktestTargetGO
    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 سيرفيرب، العبارات التالية. ولاحظ أن الأداء بطيء.
    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
خصائص

رقم الموضوع: 942982 - آخر مراجعة: 14‏/01‏/2017 - المراجعة: 1

تعليقات