فرق الأداء الكبير (1 ساعة إلى 1 دقيقة) الموجودة في SQL. هل يمكنك أن تشرح لماذا؟

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

سؤال

تستغرق الاستعلامات التالية 70 دقيقة و 1 دقيقة على التوالي على جهاز قياسي لمليون سجل. ماذا يمكن أن يكون الأسباب المحتملة؟

استعلام [01:10:00

SELECT * 
FROM cdc.fn_cdc_get_net_changes_dbo_PartitionTest(
    CASE WHEN sys.fn_cdc_increment_lsn(0x00)<sys.fn_cdc_get_min_lsn('dbo_PartitionTest')        
        THEN sys.fn_cdc_get_min_lsn('dbo_PartitionTest')        
        ELSE sys.fn_cdc_increment_lsn(0x00) END
    , sys.fn_cdc_get_max_lsn()
    , 'all with mask') 
WHERE __$operation <> 1

استعلام معدّل [00:01:10

DECLARE @MinLSN binary(10)
DECLARE @MaxLSN binary(10)
SELECT @MaxLSN= sys.fn_cdc_get_max_lsn()
SELECT @MinLSN=CASE WHEN sys.fn_cdc_increment_lsn(0x00)<sys.fn_cdc_get_min_lsn('dbo_PartitionTest')     
        THEN sys.fn_cdc_get_min_lsn('dbo_PartitionTest')        
        ELSE sys.fn_cdc_increment_lsn(0x00) END

SELECT * 
FROM cdc.fn_cdc_get_net_changes_dbo_PartitionTest(
        @MinLSN, @MaxLSN, 'all with mask') WHERE __$operation <> 1

المعدل

حاولت إعادة إنشاء السيناريو مع وظيفة مماثلة لمعرفة ما إذا تم تقييم المعلمات لكل صف.

CREATE FUNCTION Fn_Test(@a decimal)RETURNS TABLE
AS
RETURN
(
    SELECT @a Parameter, Getdate() Dt, PartitionTest.*
    FROM PartitionTest
);

SELECT * FROM Fn_Test(RAND(DATEPART(s,GETDATE())))

لكنني أحصل على نفس القيمة للعمود "المعلمة" لسجلات AA مليون التي تمت معالجتها في 38 ثانية.

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

المحلول

يتم تقييم حتى وظائف العددية الحتمية مرة واحدة على الأقل لكل صف. إذا حدثت نفس وظيفة القياس الحتمية عدة مرات على نفس "الصف" مع نفس المعلمات ، فأعتقد فقط أنه سيتم تقييمه مرة واحدة - على سبيل المثال في أ CASE WHEN fn_X(a, b, c) > 0 THEN fn_X(a, b, c) ELSE 0 END أو شيء من هذا القبيل.

أعتقد أن مشكلتك في راند هي أنك تستمر في إعادة البيع:

نداءات متكررة من RAND () مع نفس قيمة البذور إرجاع النتائج نفسها.

بالنسبة لاتصال واحد ، إذا تم استدعاء RAND () بقيمة بذرة محددة ، فإن جميع المكالمات اللاحقة لـ RAND () تنتج نتائج استنادًا إلى مكالمة RAND () المصنفة. على سبيل المثال ، سيعود الاستعلام التالي دائمًا نفس تسلسل الأرقام.

لقد اتخذت إلى نتائج تأكيد وظائف العددية كما أشرت - حتى الذهاب إلى أبعد من ذلك لتحديد الجداول المسبقة لنتائج وظائف العددية والانضمام إليها. يجب القيام بشيء ما في نهاية المطاف لجعل وظائف العددية تؤدي. حسنًا ، لا ، الخيار الأفضل هو CLR - على ما يبدو هذه تفوق بكثير SQL UDFs. لسوء الحظ ، لا يمكنني استخدامها في بيئتي الحالية.

نصائح أخرى

في استفسارك الأول ، الخاص بك fn_cdc_increment_lsn و fn_cdc_get_min_lsn الحصول على تنفيذ لكل صف. في المثال الثاني ، مرة واحدة فقط.

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