Skip to content
English

اقتراح إنشاء Indexes لجداول التفاصيل الكبيرة ​

يوفر هذا المقال إرشادات لتحديد جداول التفاصيل الكبيرة في قاعدة البيانات التي تفتقر إلى indexes أساسية على أعمدة المفاتيح الخارجية (foreign key)، مما قد يؤدي إلى مشكلات في الأداء عند استرجاع السجلات.

لماذا يهمنا هذا الأمر ​

في نما والأنظمة الأخرى ذات المخططات عالية التطبيع، تحتوي كثير من الجداول على سطور تفاصيل (سجلات فرعية) مرتبطة بالجداول الرئيسية عبر عمود مفتاح خارجي (مثل qtyTrans_id وstockAgesTrans_id). إذا لم تكن هذه الأعمدة مُفهرَسة، فإن الاستعلامات التي تتضمن سطور التفاصيل—ولا سيما عند توليد التقارير أو تحميل المستندات—ستكون أبطأ بشكل ملحوظ.

لتحسين الأداء، يُنصح بإنشاء non-clustered index على أعمدة المفاتيح الخارجية هذه فقط إذا كان جدول التفاصيل يحتوي على عدد كبير من الصفوف.

المستندات الأكثر استخداماً يفهرسها نما بنفسه

ينشئ نما عند التشغيل الـ index على سطور مستنداته الأكثر استخداماً، باسم idx_<column> (مثل idx_salesInvoice_id): فواتير المبيعات والمشتريات ومرتجعاتها، وفواتير مبيعات نقاط البيع ومردوداتها، وأوامر البيع، والصرف المخزني والتوريد المخزني، وسندات التحويل المخزني، وصرف واستلام التحويل المخزني، وطلبات التحويل المخزني، وسندات القبض والصرف، والقيود اليومية، وقوائم أسعار البيع والشراء، وسطور الوحدات والمقاسات والألوان والمحددات في الأصناف. وفي قاعدة البيانات الكبيرة التي ليس فيها هذا الـ index يطول أول تشغيل بعد التحديث حتى يُبنى.

وإن كنت أنشأت أحد هذه الـ indexes يدوياً من قبل، ففي الجدول الآن نسختان منه. تعرض أداة اكتشاف الفهارس المكررة النسخة الزائدة، ويذكّر خطأ حرج فريق الدعم بها حتى تُحذف.

كيفية استخدام هذا الاستعلام ​

يبحث استعلام SQL التالي عن الجداول في قاعدة البيانات التي:

  • تحتوي على أعداد كبيرة من السجلات
  • تملك عمود مفتاح خارجي معروفاً للجدول الأب
  • لا تمتلك بالفعل index على عمود المفتاح الخارجي

يُخرج الاستعلام قائمة بالجداول مع مقترحات لإنشاء الـ index المطلوب.

يجب تطبيق الـ indexes المقترحة فقط على الجداول التي يتجاوز فيها row_count الحد المحدد، مثل 50,000 أو 100,000 سجل.

table_namecolumn_namerow_countcreate_index_sql
StockAgesTransLinestockAgesTrans_id37537276CREATE NONCLUSTERED INDEX IX_StockAgesTransLine_stockAgesTrans_id ON dbo.StockAgesTransLine(stockAgesTrans_id);
QtyTransLineqtyTrans_id31629670CREATE NONCLUSTERED INDEX IX_QtyTransLine_qtyTrans_id ON dbo.QtyTransLine(qtyTrans_id);
CostOutTransLinecostOutTrans_id26216977CREATE NONCLUSTERED INDEX IX_CostOutTransLine_costOutTrans_id ON dbo.CostOutTransLine(costOutTrans_id);
StockTakingDetailsElecLinestockTakingDetails_id2365CREATE NONCLUSTERED INDEX IX_StockTakingDetailsElecLine_stockTakingDetails_id ON dbo.StockTakingDetailsElecLine(stockTakingDetails_id);

من هذه النتيجة:

  • يجب إنشاء الـ index لجدول StockAgesTransLine لأنه يحتوي على 37 مليون صف.
  • لا يجب إنشاء الـ index لجدول StockTakingDetailsElecLine لأنه يحتوي على 2,365 صفاً فقط.

التوصيات ​

  • راجع نتيجة الاستعلام بصفة دورية، خاصةً بعد إضافة أنواع مستندات جديدة أو جداول تفاصيل جديدة.
  • لا تُنشئ indexes على الجداول الصغيرة (مثل أقل من 10,000 صف) ما لم تلاحظ مشكلات أداء فعلية.

استعلام SQL ​