مشاركة عبر


قم بزيادة جودة rowgroup لأداء فهرس مخزن الأعمدة

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

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

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

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

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

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

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

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

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

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

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

عرض الإدارة الديناميكي (DMV) (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 ميغابايت في الذاكرة وبمجرد الوصول إلى هذا الحد يتم ضغط مجموعة الصفوف. إذا واجهت هذا الموقف، ففكر في عزل العمود الإشكالي في جدول منفصل.

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

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

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

ملاحظة

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ضبط MAXDOP

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

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

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

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

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

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

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