خمس طرق لتحسين أداء SQL الخاص بك
تم اقتباس هذه المقالة من مقالة MSDN "خمس طرق لتحسين أداء SQL" وتقترح كيفية تحسين كفاءة تشغيل التطبيقات المستندة إلى SQL Server. بالنسبة لبعض أنظمة التطبيقات ذات حركة المرور العالية، تعد كيفية تحسين تعليمات SQL وتحسينها أمرًا مهمًا للغاية ونقطة انطلاق جيدة.
*تتضمن المقالة بشكل أساسي المحتويات التالية (إذا كنت مهتمًا، يرجى زيارة عنوان URL التالي مباشرةً لقراءة المستند الكامل باللغتين الصينية والإنجليزية):
1. قم بإرجاع الهوية من INSERT
حدد @@IDENTITY
2، العرض المضمن والجدول المؤقت
الجداول المؤقتة - يمكن أن تتسبب الجداول المؤقتة في tempdb في قيام الاستعلامات بإجراء عمليات إدخال/إخراج ثقيلة والوصول إلى القرص، ويمكن أن تستهلك الجداول المؤقتة الكثير من الموارد.
طرق العرض المضمنة - استخدم طرق العرض المضمنة بدلاً من الجداول المؤقتة. العرض المضمن هو ببساطة استعلام يمكن ضمه في جملة FROM. إذا كنت تحتاج فقط إلى ضم البيانات إلى استعلامات أخرى، فيمكنك تجربة استخدام طرق العرض المضمنة لحفظ الموارد.
3. تجنب الانضمام الأيسر والفارغ
تعد عمليات LEFT JOIN كثيفة الاستخدام للموارد لأنها تحتوي على بيانات تطابق بيانات NULL (غير موجودة). في بعض الحالات، لا يمكن تجنب ذلك، ولكن التكلفة يمكن أن تكون مرتفعة للغاية. تستهلك LEFT JOIN موارد أكثر من INNER JOIN، لذا إذا تمكنت من إعادة كتابة الاستعلام بحيث لا يستخدم أي LEFT JOIN، فستحصل على مكافأة جيدة جدًا.
تتضمن إحدى تقنيات تسريع الاستعلامات التي تستخدم LEFT JOIN إنشاء نوع بيانات TABLE، وإدراج كافة الصفوف في الجدول الأول (الجدول الموجود على يسار LEFT JOIN)، ثم تحديث نوع بيانات TABLE بالقيم من الجدول الثاني. تتكون هذه التقنية من عملية مكونة من خطوتين، ولكنها يمكن أن توفر الكثير من الوقت مقارنةً بتقنية LEFT JOIN القياسية. القاعدة الجيدة هي تجربة مجموعة متنوعة من الأساليب المختلفة وتسجيل الوقت المطلوب لكل منها حتى تحصل على الاستعلام الذي يحقق أفضل أداء لتطبيقك.
أعلن @tblMonths TABLE (sMonth VARCHAR(7))
4، الاستخدام المرن للمنتج الديكارتي
سأخوض في تفاصيل كبيرة حول هذه التقنية وأؤيد استخدام المنتجات الديكارتية في بعض الحالات. لسبب ما، تتعرض المنتجات الديكارتية (CROSS JOIN) للكثير من الانتقادات، وغالبًا ما يتم تحذير المطورين من استخدامها على الإطلاق. وفي كثير من الحالات، تستهلك الكثير من الموارد بحيث لا يمكن استخدامها بكفاءة. ولكن مثل أي أداة في SQL، يمكن أن تكون ذات قيمة إذا تم استخدامها بشكل صحيح.
أحد رموز الأمثلة يستحق المتابعة:
- المنتج الديكارتي يعيد جميع العملاء لجميع الأشهر. يقوم المنتج الديكارتي بشكل أساسي بضرب الجدول الأول في الجدول الثاني، مما ينتج عنه مجموعة من الصفوف التي تحتوي على عدد الصفوف في الجدول الأول مضروبًا في عدد الصفوف في الجدول الثاني. لذلك، يقوم المنتج الديكارتي بإرجاع 12 (كل الأشهر) * 81 (جميع العملاء) = 972 صفًا إلى الجدول @tblFinal. تتمثل الخطوات النهائية في تحديث جدول @tblFinal بإجماليات المبيعات الشهرية لكل عميل لهذا النطاق الزمني وتحديد المجموعة النهائية من الصفوف.
أعلن عن جدولtblMonths (sMonth VARCHAR(7))
أعلن @tblCustomers TABLE (CustomerID CHAR(10)،
اسم الشركة VARCHAR(50)،
اسم جهة الاتصال VARCHAR(50))
أعلن @tblFinal TABLE (sMonth VARCHAR(7)،
معرف العميل (10)،
اسم الشركة VARCHAR(50)،
اسم جهة الاتصال VARCHAR(50)،
مساليس موني)
أعلن @dtStartDate DATETIME،
@dtEndDate التاريخ والوقت،
@dtDate التاريخ والوقت،
@i INTEGER
SET @dtEndDate = '5/5/1997'
SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' 23:59:59' AS DATETIME))
SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)
- أدخل كل الأشهر في الجدول الأول
تعيين @i = 0
بينما (@i <12)
يبدأ
SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
أدخل في @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +
قضية
متى الشهر (@dtDate) < 10
ثم '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))
إرسال آخر (شهر (@ dtDate) AS VARCHAR (2))
تنتهي في شهر واحد
اضبط @i = @i + 1
النهاية
- ضع كافة العملاء الذين لديهم مبيعات خلال تلك الفترة في الجدول "y".
أدخل في @tblCustomers
اختر مميزة
ج.معرف العميل،
ج.اسم الشركة،
ج.اسم جهة الاتصال
من العملاء ج
طلبات الانضمام الداخلي o ON c.CustomerID = o.CustomerID
حيث o.OrderDate بين @dtStartDate و@dtEndDate،
أدخل في @tblFinal
حدد m.sMonth،
ج.معرف العميل،
ج.اسم الشركة،
ج. اسم جهة الاتصال،
0
من @tblMonths m CROSS JOIN @tblCustomers c
تحديث @tblFinal SET
mSales = mydata.mSales
من @tblFinal f INNER JOIN
(
حدد ج.معرف العميل،
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
الحالة عندما يكون الشهر (o.OrderDate) < 10
ثم '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
إرسال آخر (MONTH(o.OrderDate) AS VARCHAR(2))
نهاية AS شهر،
SUM(od.Quantity * od.UnitPrice) AS mSales
من العملاء ج
طلبات الانضمام الداخلي o ON c.CustomerID = o.CustomerID
INNER JOIN [تفاصيل الطلب] od ON o.OrderID = od.OrderID
حيث o.OrderDate بين @dtStartDate و@dtEndDate
المجموعة حسب
ج.معرف العميل،
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
الحالة عندما يكون الشهر (o.OrderDate) < 10
ثم '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
إرسال آخر (MONTH(o.OrderDate) AS VARCHAR(2))
نهاية
) mydata on f.CustomerID = mydata.CustomerID AND f.sMonth =
mydata.sMonth
حدد f.sMonth،
f.معرف العميل،
f.اسم الشركة،
f. اسم جهة الاتصال،
f.mSales
من @tblFinal f
الطلب حسب
f.اسم الشركة،
f.sMonth
5. قم بالتقاط الأجزاء المفقودة وتعويض الأجزاء المفقودة.
فيما يلي بعض الأساليب الشائعة الأخرى التي يمكن أن تساعد في تحسين كفاءة استعلامات SQL. لنفترض أنك تريد تجميع كل مندوبي المبيعات حسب المنطقة وإجمالي مبيعاتهم الفرعي، ولكنك تريد فقط وضع علامة على مندوبي المبيعات هؤلاء كنشطين في قاعدة البيانات. يمكنك تجميع مندوبي المبيعات حسب المنطقة وحذف الأشخاص غير النشطين باستخدام جملة HAVING، أو يمكنك القيام بذلك في جملة WHERE. يؤدي القيام بذلك في جملة WHERE إلى تقليل عدد الصفوف التي تحتاج إلى التجميع، لذا فهو أكثر كفاءة من القيام بذلك في جملة HAVING. التصفية بناءً على شروط الصف في جملة HAVING تفرض الاستعلام على تجميع البيانات التي ستتم إزالتها في جملة WHERE.
نصيحة أخرى تتعلق بالكفاءة هي استخدام الكلمة الأساسية DISTINCT للعثور على تقارير منفصلة لصفوف البيانات بدلاً من استخدام عبارة GROUP BY. في هذه الحالة، يكون استخدام SQL للكلمة الأساسية DISTINCT أكثر كفاءة. يرجى استخدام GROUP BY فقط عندما تحتاج إلى حساب الدوال المجمعة (SUM، COUNT، MAX، وما إلى ذلك). وأيضًا، إذا كان الاستعلام الخاص بك يُرجع دائمًا صفًا فريدًا بمفرده، فلا تستخدم الكلمة الأساسية DISTINCT. في هذه الحالة، تضيف الكلمة الأساسية DISTINCT حمل النظام فقط.
-------------------
عنوان URL باللغة الصينية:
http://www.microsoft.com/china/MSDN/library/data/sqlserver/FiveWaystoRevupYourSQLPerformanCE.mspx
عنوان URL باللغة الإنجليزية:
http://msdn.microsoft.com/msdnmag/issues/02/07/DataPoints/