SQL Server 2008: انضم إلى عرض آخر: precalculate دون اللجوء إلى جداول مؤقت
-
29-09-2019 - |
سؤال
لإجراء التحولات في قاعدة البيانات الخاصة بي ، أستخدم مجموعة مرات عرض بالسلاسل بشكل متكرر. ضمن وجهات النظر ستكون تعبيرات الجدول الشائعة. على سبيل المثال ، سيكون لدي ما يلي:
CREATE VIEW TransformationStep1 AS
WITH Transformation1A AS (
SELECT Field1, Field2, Field3, Bla(Field1) AS Calc FROM Table1
),
Transformation1B AS (
SELECT Field1, Field2, Field3, Calc FROM Transformation1A
)
SELECT * FROM Transformation1B
CREATE VIEW TransformationStep2 AS
WITH Transformation2A AS (
SELECT Field1, Calc FROM TransformationStep1
), ....
في مكان ما بالقرب من TransformationStep4 ، ستصبح وجهات النظر أبطأ حيث تصبح خطة الاستعلام أكثر تعقيدًا. هذا متوقع وموافق.
ولكن عندما أرغب في الانضمام إلى جزء من TransformationStep4 لنفسه ، فإن الاستعلام سوف يتباطأ بشكل كبير حيث يحاول المحسن أن يجد طريقه إلى الجداول المصدر والبحث عن فهارس من نوع ما. عادةً ما يكون هذا على ما يرام ، لكنني في بعض الأحيان أريد فقط تخزين نتيجتي المؤقتة والانضمام إلى ذلك لأنه (كونه هو الإنسان في القصة) ، أعرف أن جدول النتائج سيكون صغيرًا جدًا ، وسيكون أسرع بكثير للانضمام ضد "الجلب المسبق" منه.
هل هناك طريقة بالنسبة لي لكتابة تلميح الاستعلام ، من شأنها أن تؤثر على خطة الاستعلام بطريقة ستتم تجنبه مسبقًا ثم انضمامها؟ وإلا سأضطر إلى اللجوء إلى طاولات مؤقتة في إجراء مخزن ، لكنني أريد تجنب ذلك إذا استطعت.
شكرًا على أي اقتراحات ، أيضًا عندما تعتقد أن تصميمي تمتص :-)
المحلول
العرض هو الماكرو الذي يتوسع: لا يوجد تخزين مؤقت أو ما قبل الحصر.
ما لم يكن لديك طرق عرض فهرسة حيث يمكنك استخدام noexpand .. ولكن هذه لن تعرض على وجهات نظر عادية.
ومع ذلك ، يمكنك استخدام أعلى/ترتيب داخلي لتحقيق العرض أيضًا:
SELECT
*
FROM
(SELECT TOP 2000000000 * FROm TransformationStep2 ORDER BY soemthing) V1
JOIN
(SELECT TOP... ) bar on foo.x = bar.x
لا يوجد شيء سحري حول وجهة نظر: إنه مجرد نص وليس له ذاكرة أو ثبات ...