هل يمكن للاستعلامات التي تقرأ متغيرات الجدول إنشاء خطط تنفيذ متوازية في SQL Server 2008؟

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

سؤال

أولا، من بول:

الاستعلامات التي تعدل طاولة لا تقوم المتغيرات بإنشاء خطط تنفيذ استعلام متوازية.يمكن أن يتأثر الأداء عندما يكون كبيرًا جدًا طاولة يتم تعديل المتغيرات، أو متغيرات الجدول في الاستعلامات المعقدة.في هذه الحالات، فكر في استخدام الجداول المؤقتة بدلاً من ذلك.لمزيد من المعلومات، راجع إنشاء جدول (Transact-SQL).الاستعلامات التي تقرأ طاولة لا يزال من الممكن موازاة المتغيرات دون تعديلها.

يبدو ذلك واضحا بما فيه الكفاية.الاستعلامات ذلك يقرأ لا يزال من الممكن موازاة متغيرات الجدول دون تعديلها.

ولكن بعد ذلك في محرك تخزين SQL Server, ، وهو مصدر حسن السمعة، قال سونيل أغاروال هذا في مقال على tempdb بتاريخ 30 مارس 2008:

لا تؤدي الاستعلامات التي تتضمن متغيرات الجدول إلى إنشاء خطط متوازية.

هل كان سونيل يعيد صياغة BOL فيما يتعلق بما يلي:INSERT أم أن وجود متغيرات الجدول في جملة FROM يمنع التوازي؟إذا كان الأمر كذلك لماذا؟

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

شكرًا!

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

المحلول

حسنا، لدي اختيار مواز ولكن لا في متغير الجدول

لقد قمت بإخفاء هويته و:

  • BigParallelTable هو 900 ألف صف وعرضه
  • لأسباب قديمة، تم تغيير شكل BigParallelTable جزئيًا (سأقوم بإصلاحه لاحقًا، وأعدك بذلك)
  • غالبًا ما يُنشئ BigParallelTable خططًا متوازية لأنها ليست مثالية و"باهظة الثمن"
  • SQL Server 2005 x64، SP3، الإصدار 4035، 16 مركزًا

الاستعلام + الخطة:

DECLARE @FilterList TABLE (bar varchar(100) NOT NULL)

INSERT @FilterList (bar)
SELECT 'val1' UNION ALL 'val2' UNION ALL 'val3'

--snipped

SELECT
     *
FROM
    dbo.BigParallelTable BPT
    JOIN
    @FilterList FL ON BPT.Thing = FL.Bar

StmtText
  |--Parallelism(Gather Streams)
       |--Hash Match(Inner Join, HASH:([FL].[bar])=([BPT].[Thing]), RESIDUAL:(@FilterList.[bar] as [FL].[bar]=[MyDB].[dbo].[BigParallelTable].[Thing] as [BPT].[Thing]))
            |--Parallelism(Distribute Streams, Broadcast Partitioning)
            |    |--Table Scan(OBJECT:(@FilterList AS [FL]))
            |--Clustered Index Scan(OBJECT:([MyDB].[dbo].[BigParallelTable].[PK_BigParallelTable] AS [BPT]))

الآن، بالتفكير في الأمر، يكون متغير الجدول دائمًا عبارة عن مسح جدول، ولا يحتوي على إحصائيات ويُفترض أنه صف واحد "العدد المقدر للصفوف = 1"، "فعلي..= 3".

هل يمكننا أن نعلن أن متغيرات الجدول لا تستخدم بالتوازي، ولكن الخطة المحتوية يمكن أن تستخدم التوازي في مكان آخر؟لذا فإن BOL صحيح ومقالة تخزين SQL خاطئة

نصائح أخرى

مثال بسيط يوضح عامل متوازي على متغير الجدول نفسه.

DECLARE @T TABLE
(
X INT
)
INSERT INTO @T
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1,master..spt_values v2;

WITH E8(N)
     AS (SELECT 1
         FROM   @T a,
                @T b),
     Nums(N)
     AS (SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
         FROM   E8)
SELECT COUNT(N)
FROM   Nums
OPTION (RECOMPILE)  

Plan

ما أفهمه هو أن التوازي محظور في متغيرات الجدول لعمليات UPDATE/DELETE/INSERT، ولكن ليس لعمليات التحديد.إن إثبات ذلك سيكون أصعب بكثير من مجرد الافتراض، بالطبع.:-)

[الإجابة على سؤالي هنا، حتى أتمكن من تقديم الاقتباسات ذات الصلة بشكل مناسب....]

بوريس ب، من خيط في منتديات MSDN SQL Server:

لا يزال من الممكن موازاة استعلامات القراءة فقط التي تستخدم متغيرات الجدول.يتم تشغيل الاستعلامات التي تتضمن متغيرات الجدول التي تم تعديلها بشكل تسلسلي. سنقوم بتصحيح البيان في الكتب عبر الإنترنت. (emp.تمت الإضافة)

و:

لاحظ أن هناك نوعين من دعم التوازي:

أ.يمكن/لا يمكن للمشغل أن يكون في خيط متوازي

ب.يمكن/لا يمكن تشغيل الاستعلام بالتوازي لأن هذا العامل موجود في الشجرة.

B هي مجموعة شاملة من A.

أفضل ما أستطيع قوله هو أن متغيرات الجدول هي لا فرقة ربما أ.

اقتباس آخر ذو صلة، إعادة:وحدات TVF T-SQL غير المضمنة:

تعتبر وحدات T-SQL TVF غير المضمنة... مناسبة للتوازي إذا كانت مدخلات TVF عبارة عن ثوابت وقت التشغيل، على سبيل المثال.المتغيرات والمعلمات.إذا كان الإدخال عبارة عن عمود (من تطبيق متقاطع)، فسيتم تعطيل التوازي للبيان بأكمله.

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