عن طريق وكيل العمل SQL لاستدعاء الإجراءات في حلقة

StackOverflow https://stackoverflow.com/questions/1601077

سؤال

وأنا أضع معا وظيفة في إدارة المؤسسة SQL 2000 لنسخ وحذف السجلات في جداول قاعدة البيانات الزوجين. لقد تشغيل نسخة الجماعية على التوالي وحذف الإجراء المخزن، ولكن يمكن تشغيله على الملايين من الصفوف، وبالتالي توقف الخادم. أنا مهتم في محاولة لتشغيل خدمة في قطع سجل 100 العش في وقت واحد، لذلك الملقم لا ستتوقف (وهذا هو قاعدة بيانات على شبكة الإنترنت الحية). أريد هذه الخدمة لتشغيل مرة واحدة ليلا، وهذا هو السبب لقد وضعت في وظيفة وكيل. هل هناك أي طريقة لحلقة المكالمات إلى الإجراءات المخزنة التي تفعل في الواقع نسخة وحذف، ثم "النوم" بين كل مكالمة لإعطاء خادم الوقت للحاق؟ أعرف أن هناك أمر WAITFOR، ولكن أنا غير متأكد ما إذا كان هذا سوف يعقد المعالج أو السماح لها تشغيل الاستعلامات الأخرى في هذه الأثناء.

وشكرا!

هل كانت مفيدة؟

المحلول

و"Chunkifying" حذف الخاص بك هو الطريقة المفضلة لحذف كميات كبيرة من البيانات دون النفخ الاحتياطي للملفات سجل المعاملة. آخر BradC هي مثال معقول من ذلك.

وإدارة مثل هذه الحلقات وبذلت قصارى داخل إجراء مخزن واحد. لنشر هذا العمل مع مرور الوقت، كنت لا تزال يبقيه في الإجراء. وإدخال WAITFOR في حلقة وضع "وقفة" بين كل مجموعة من الحذف، إذا كنت ترى أن من الضروري للتعامل مع مشكلات التوافق المحتملة. استخدام وظيفة وكيل SQL لتحديد متى يبدأ الإجراء - وإذا كنت بحاجة للتأكد من أنه توقف في وقت معين، والعمل الذي في حلقة فضلا

وبلدي تدور على هذا الرمز سيكون:

--  NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData

    @StopBy DateTime
    --  Pass in a cutoff time.  If it runs this long, the procedure will stop.
AS

DECLARE @LastBatch  int

SET @LastBatch = 1
--  Initialized to make sure the loop runs at least once


WHILE @LastBatch > 0
 BEGIN

    WAITFOR DELAY '00:00:02'
    --  Set this to your desired delay factor

    DELETE top 1000  --  Or however many per pass are desired
     from SourceTable
    --  Be sure to add a where clause if you don't want to delete everything!

    SET @LastBatch = @@rowcount

    IF getdate() > @StopBy
        SET @LastBatch = 0

 END

RETURN 0

وهم. إعادة قراءة قمت بنشر يعني أنك تريد نسخ البيانات في مكان ما أولا قبل حذفها. للقيام بذلك، فما استقاموا لكم فاستقيموا إعداد جدول مؤقت، وداخل الحلقة الأولى اقتطاع جدول مؤقت، ثم نسخ في المفاتيح الأساسية من العناصر TOP N، إدراج في جدول "أرشيف" من خلال الانضمام إلى جدول مؤقت، ثم حذف الجدول المصدر أيضا عن طريق الانضمام إلى جدول مؤقت. (فقط قليلا أكثر تعقيدا من حذف مباشرة، أليس كذلك؟)

نصائح أخرى

لا تقلق بشأن انتظار بين الحلقات، ويجب التعامل مع الخادم SQL للخلاف بين وظيفة الصيانة والنشاط المنتظم على الخادم.

ما الذي يسبب حقا مشكلة في هذه الأنواع من الحالات هو أن عملية حذف كامل يحدث في كل مرة، داخل معاملة واحدة. هذا يفجر سجل لقاعدة البيانات، ويمكن أن يسبب نوعا من المشاكل التي يبدو وكأنه التي تعاني منها.

استخدم حلقة من هذا القبيل لحذف في قطع يمكن التحكم فيها:

DECLARE @i INT
SET @i = 1

SET ROWCOUNT 10000

WHILE @i > 0
BEGIN
    BEGIN TRAN
        DELETE TOP 1000 FROM dbo.SuperBigTable
        WHERE RowDate < '2009-01-01'
    COMMIT

    SELECT @i = @@ROWCOUNT
END
SET ROWCOUNT 0

ويمكنك استخدام منطق مشابه لنسختك.

وWAITFOR سيتيح العمليات الأخرى لديها التنقل ". لقد استعملت هذه التقنية لوقف كبيرة DELETE لقد حبس الجهاز. إنشاء حلقة WHILE، حذف كتلة من الصفوف، ومن ثم WAITFOR بضع ثوان (أو أقل، كل ما هو مناسب).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top