زيادة جودة مجموعة الصفوف لفهارس مخزن الأعمدة في تجمع SQL المخصص

يتم تحديد جودة مجموعة الصفوف من خلال عدد السجلات في مجموعة السجلات. يمكن أن تؤدي زيادة الذاكرة المتوفرة إلى زيادة عدد السجلات التي يضغطها مؤشر تخزين الأعمدة في كل مجموعة سجلات. استخدم هذه الطرق لتحسين معدلات الضغط وأداء الاستعلام لفهارس مخزن الأعمدة.

لماذا حجم مجموعة السجل مهم

نظراً لأن فهرس تخزين الأعمدة يقوم بمسح الجدول عن طريق مسح شرائح الأعمدة لمجموعات الصفوف الفردية، فإن زيادة عدد الصفوف في كل مجموعة صف إلى الحد الأقصى يعمل على تعزيز أداء الاستعلام.

عندما يوجد عدد كبير من الصفوف في مجموعات الصفوف، يتحسن ضغط البيانات مما يعني قراءة بيانات أقل من القرص.

لمزيد من المعلومات حول مجموعات الصفوف، راجع دليل فهارس مخزن الأعمدة.

الحجم المستهدف لمجموعات الصفوف

للحصول على أفضل أداء للاستعلام، يكمن الهدف في زيادة عدد الصفوف لكل مجموعة صفوف في فهرس تخزين أعمدة إلى أقصى حد. يمكن أن تحتوي مجموعة الصفوف على حد أقصى من الصفوف يبلغ 1,048,576.

لا بأس بألّا يكون لديك الحد الأقصى من عدد الصفوف لكل مجموعة صفوف. تحقق فهارس تخزين الأعمدة أداءً جيداً عندما تضم مجموعات الصفوف ما لا يقل عن 100,000 صف.

يمكن قص مجموعات الصفوف أثناء الضغط

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

عند عدم وجود ذاكرة كافية لضغط ما لا يقل عن 10000 سجل في كل مجموعة سجلات، سيتم إنشاء خطأ.

لمزيد من المعلومات حول التحميل المجمع، راجع التحميل المجمع في مؤشر تخزين الأعمدة المجمع.

كيفية مراقبة جودة مجموعة الب

يحتوي DMV sys.dm_pdw_nodes_db_column_store_row_group_physical_stats (sys.dm_db_column_store_row_group_physical_stats على تعريف العرض المطابق لـ SQL DB) الذي يعرض معلومات مفيدة مثل عدد السجلات في مجموعات السجلات، وإذا كان هناك سبب للاقتطاع.

يمكنك إنشاء العرض التالي كطريقة مفيدة للاستعلام عن DMV هذا للحصول على معلومات حول اقتطاع مجموعة الصفوف.

create view dbo.vCS_rg_physical_stats
as
with cte
as
(
select   tb.[name]                    AS [logical_table_name]
,        rg.[row_group_id]            AS [row_group_id]
,        rg.[state]                   AS [state]
,        rg.[state_desc]              AS [state_desc]
,        rg.[total_rows]              AS [total_rows]
,        rg.[trim_reason_desc]        AS trim_reason_desc
,        mp.[physical_name]           AS physical_name
FROM    sys.[schemas] sm
JOIN    sys.[tables] tb               ON  sm.[schema_id]          = tb.[schema_id]
JOIN    sys.[pdw_table_mappings] mp   ON  tb.[object_id]          = mp.[object_id]
JOIN    sys.[pdw_nodes_tables] nt     ON  nt.[name]               = mp.[physical_name]
JOIN    sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg      ON  rg.[object_id]     = nt.[object_id]
                                                                            AND rg.[pdw_node_id]   = nt.[pdw_node_id]
                                        AND rg.[distribution_id]    = nt.[distribution_id]
)
select *
from cte;

يوضح trim_reason_desc ما إذا كان قد تم قطع مجموعة الصفوف أم لا (يشير trim_reason_desc = NO_TRIM إلى عدم وجود قص وأن مجموعة الصفوف ذات جودة مثالية). تشير أسباب القطع التالية إلى التشذيب المبكر لمجموعة الصفوف:

  • BULKLOAD: يتم استخدام سبب القطع هذا عندما تحتوي الدفعة الواردة من السجلات للحمل على أقل من مليون سجل. سيقوم المحرك بإنشاء مجموعات سجلات مضغوطة إذا كان هناك أكثر من 100000 سجل يتم إدخالها (على عكس الإدراج في مخزن دلتا) ولكنه يحدد سبب القطع على BULKLOAD. في هذا السيناريو، ضع في اعتبارك زيادة تحميل الدُفعات لتضمين المزيد من السجلات. أيضاً، أعد تقييم مخطط التقسيم للتأكد من أنه ليس دقيقاً للغاية حيث لا يمكن لمجموعات الصفوف أن تمتد إلى حدود الأقسام.
  • MEMORY_LIMITATION: لإنشاء مجموعات سجلات تحتوي على مليون سجل، يتطلب المحرك قدراً معيناً من الذاكرة العاملة. عندما تكون الذاكرة المتاحة لجلسة التحميل أقل من الذاكرة العاملة المطلوبة، يتم قطع مجموعات الصفوف قبل الأوان. توضح الأقسام التالية كيفية تقدير الذاكرة المطلوبة وتخصيص المزيد من الذاكرة.
  • DICTIONARY_SIZE: يشير سبب القطع هذا إلى حدوث اقتطاع لمجموعة الصفوف بسبب وجود عمود سلسلة واحد على الأقل به سلاسل عريضة و/أو سلاسل عددية عالية. يقتصر حجم القاموس على 16 ميغابايت في الذاكرة وبمجرد الوصول إلى هذا الحد يتم ضغط مجموعة الصفوف. إذا واجهت هذا الموقف، ففكر في عزل العمود الإشكالي في جدول منفصل.

كيفية تقدير متطلبات الذاكرة

لعرض تقدير لمتطلبات الذاكرة لضغط مجموعة صفوف بأقصى حجم في مؤشر تخزين الأعمدة، ضع في اعتبارك إنشاء عرض العينة dbo.vCS_mon_mem_grant. يعرض هذا الاستعلام حجم منح الذاكرة التي تتطلبها مجموعة الصفوف للضغط في مخزن الأعمدة.

الحد الأقصى للذاكرة المطلوبة لضغط مجموعة سجل واحدة هو تقريباً

  • 72 MB +
  • #rows * #columns * 8 bytes +
  • #rows * #short-string-columns * 32 bytes +
  • # أعمدة السلسلة الطويلة * 16 ميغابايت لقاموس الضغط

ملاحظة

تستخدم أعمدة السلاسل القصيرة أنواع بيانات السلاسل من <= 32 بايت وتستخدم أعمدة السلسلة الطويلة أنواع بيانات السلاسل المكونة من > 32 بايت.

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

طرق لتقليل متطلبات الذاكرة

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

استخدم عدداً أقل من الأعمدة

إذا أمكن، فصمم الجدول بأعمدة أقل. عندما يتم ضغط مجموعة صفوف في مخزن الأعمدة، يقوم مؤشر تخزين الأعمدة بضغط كل مقطع عمود بشكل منفصل.

على هذا النحو، تزداد متطلبات الذاكرة لضغط مجموعة الصفوف مع زيادة عدد الأعمدة.

استخدم عدداً أقل من أعمدة السلسلة

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

متطلبات الذاكرة الإضافية لضغط السلسلة:

  • يمكن أن تتطلب أنواع بيانات السلسلة التي تصل إلى 32 حرفاً 32 بايت إضافياً لكل قيمة.
  • يتم ضغط أنواع بيانات السلسلة التي تحتوي على أكثر من 32 حرفاً باستخدام طرق القاموس. يمكن أن يتطلب كل عمود في مجموعة السجل 16 ميغابايت إضافية لإنشاء القاموس.

تجنب الإفراط في التقسيم

تنشئ فهارس Columnstore مجموعة صفوف واحدة أو أكثر لكل قسم. بالنسبة لتجمع SQL المخصص في Azure Synapse Analytics، يتزايد عدد الأقسام بسرعة نظراً لتوزيع البيانات وتقسيم كل توزيع.

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

سبب آخر لتجنب التقسيم الزائد هو وجود حمل للذاكرة لتحميل السجلات في مؤشر تخزين الأعمدة على جدول مقسم.

أثناء التحميل، يمكن أن تتلقى العديد من الأقسام السجلات الواردة، والتي يتم الاحتفاظ بها في الذاكرة حتى يحتوي كل قسم على سجلات كافية لضغطها. يؤدي وجود عدد كبير جداً من الأقسام إلى زيادة ضغط الذاكرة.

تبسيط الاستعلام عن التحميل

تشارك قاعدة البيانات منح الذاكرة للاستعلام بين جميع عوامل التشغيل في الاستعلام. عندما يحتوي استعلام التحميل على عمليات فرز وضم معقدة، يتم تقليل الذاكرة المتاحة للضغط.

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

تلميح

يمكنك أيضاً تحميل البيانات أولاً ثم استخدام نظام MPP لتحويل البيانات.

ضبط MAXDOP

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

يتطلب التوازي موارد ذاكرة إضافية، ما قد يؤدي إلى ضغط الذاكرة وتشذيب مجموعة الصفوف.

لتقليل ضغط الذاكرة، يمكنك استخدام تلميح استعلام MAXDOP لفرض تشغيل عملية التحميل في الوضع التسلسلي داخل كل توزيع.

CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);

طرق تخصيص ذاكرة أكبر

يحدد حجم DWU وفئة موارد المستخدم معاً مقدار الذاكرة المتاحة لاستعلام المستخدم.

لزيادة منح الذاكرة لاستعلام التحميل، يمكنك إما زيادة عدد DWUs أو زيادة فئة المورد.

الخطوات التالية

للعثور على مزيد من الطرق لتحسين الأداء لتجمع SQL المخصص، راجع نظرة عامة على الأداء.