اختر أعمدة التوزيع في قاعدة بيانات Azure ل PostgreSQL – Hyperscale (Citus)
يعد اختيار عمود توزيع كل جدول أحد أهم قرارات النمذجة التي ستتخذها. Azure Database for PostgreSQL – Hyperscale (Citus) يخزن الصفوف في شظايا استنادا إلى قيمة عمود توزيع الصفوف.
يجمع الاختيار الصحيح البيانات ذات الصلة معا على نفس العقد الفعلية ، مما يجعل الاستعلامات سريعة ويضيف دعما لجميع ميزات SQL. اختيار غير صحيح يجعل النظام يعمل ببطء.
النصائح العامة
فيما يلي أربعة معايير لاختيار عمود التوزيع المثالي للجداول الموزعة.
اختر عمودا يمثل جزءا أساسيا في عبء عمل التطبيق.
قد تفكر في هذا العمود على أنه "القلب" أو "القطعة المركزية" أو "البعد الطبيعي" لتقسيم البيانات.
أمثلة:
device_idفي عبء عمل إنترنت الأشياءsecurity_idلتطبيق مالي يتتبع الأوراق الماليةuser_idفي تحليلات المستخدمtenant_idلتطبيق SaaS متعدد المستأجرين
اختر عمودا ذا كاردينالية لائقة ، وتوزيعا إحصائيا متساويا.
يجب أن يحتوي العمود على العديد من القيم ، وأن يوزع بدقة وبالتساوي بين جميع الشظايا.
أمثلة:
- الكاردينالية أكثر من 1000
- لا تختار عمودا له نفس القيمة على نسبة كبيرة من الصفوف (انحراف البيانات)
- في عبء عمل SaaS ، يمكن أن يؤدي وجود مستأجر واحد أكبر بكثير من الباقي إلى انحراف البيانات. في هذه الحالة، يمكنك استخدام عزل المستأجر لإنشاء شظية مخصصة للتعامل مع المستأجر .
اختر عمودا يفيد استعلاماتك الحالية.
بالنسبة إلى عبء العمل المتعلق بالمعاملات أو العمليات (حيث تستغرق معظم الاستعلامات بضعة ميلي ثانية فقط)، اختر عمودا يظهر كعامل تصفية في
WHEREالعبارات لما لا يقل عن 80٪ من الاستعلامات. على سبيل المثال ،device_idالعمود فيSELECT * FROM events WHERE device_id=1.بالنسبة لعبء العمل التحليلي (حيث تستغرق معظم الاستعلامات من 1 إلى 2 ثانية)، اختر عمودا يمكن من موازاة الاستعلامات عبر العقد العاملة. على سبيل المثال ، عمود يحدث بشكل متكرر في عبارات GROUP BY ، أو يتم الاستعلام عنه عبر قيم متعددة في وقت واحد.
اختر عمودا موجودا في غالبية الجداول الكبيرة.
يجب توزيع الجداول التي يزيد حجمها عن 50 غيغابايت. يتيح لك اختيار عمود التوزيع نفسه لكل منهم المشاركة في تحديد موقع البيانات لهذا العمود على عقد العاملين. الموقع المشترك يجعل من الفعال تشغيل JOINs و Rollups ، وفرض المفاتيح الخارجية.
يمكن أن تكون الجداول الأخرى (الأصغر) جداول محلية أو مرجعية. إذا كان الجدول الأصغر يحتاج إلى الانضمام مع الجداول الموزعة، فاجعله جدولا مرجعيا.
أمثلة على حالات الاستخدام
لقد رأينا معايير عامة لاختيار عمود التوزيع. الآن دعونا نرى كيف تنطبق على حالات الاستخدام الشائعة.
تطبيقات متعددة المستأجرين
تستخدم البنية متعددة المستأجرين شكلا من أشكال نمذجة قاعدة البيانات الهرمية لتوزيع الاستعلامات عبر العقد في مجموعة الخادم. يعرف الجزء العلوي من التدرج الهرمي للبيانات باسم معرف المستأجر ويجب تخزينه في عمود على كل جدول.
يقوم Hyperscale (Citus) بفحص الاستعلامات لمعرفة معرف المستأجر الذي تتضمنه والعثور على شظايا الجدول المطابقة. يقوم بتوجيه الاستعلام إلى عقدة عامل واحدة تحتوي على الشظية. يسمى تشغيل استعلام مع وضع جميع البيانات ذات الصلة على نفس العقدة بالموقع المشترك.
يوضح الرسم التخطيطي التالي الموقع المشترك في نموذج البيانات متعدد المستأجرين. يحتوي على جدولين ، الحسابات والحملات ، كل منها موزع بواسطة account_id.
تمثل الصناديق المظللة شظايا. يتم تخزين الشظايا الخضراء معا على عقدة عامل واحدة ، ويتم تخزين الشظايا الزرقاء على عقدة عامل أخرى. لاحظ كيف يحتوي طلب طلب الانضمام بين الحسابات والحملات على جميع البيانات الضرورية معا في عقدة واحدة عندما يقتصر كلا الجدولين على نفس account_id.

لتطبيق هذا التصميم في المخطط الخاص بك، حدد ما يشكل مستأجرا في طلبك. تتضمن المثيلات الشائعة الشركة أو الحساب أو المؤسسة أو العميل. سيكون اسم العمود شيئا مثل company_id أو customer_id.
افحص كل استفسار من استفساراتك واسأل نفسك ، هل سيعمل إذا كان لديه المزيد من بنود WHERE لتقييد جميع الجداول المعنية بصفوف لها نفس معرف المستأجر؟ يتم تحديد نطاق الاستعلامات في النموذج متعدد المستأجرين إلى مستأجر. على سبيل المثال ، يتم تحديد نطاق الاستعلامات حول المبيعات أو المخزون داخل متجر معين.
أفضل الممارسات
- توزيع الجداول حسب عمود tenant_id شائع. على سبيل المثال ، في تطبيق SaaS حيث يكون المستأجرون شركات ، من المرجح أن تكون tenant_id هي company_id.
- تحويل الجداول الصغيرة عبر المستأجرين إلى جداول مرجعية. عندما يشارك عدة مستأجرين جدولا صغيرا من المعلومات، قم بتوزيعه كجدول مرجعي.
- تقييد تصفية جميع استعلامات التطبيق حسب tenant_id. يجب أن يطلب كل استعلام معلومات لمستأجر واحد في كل مرة.
اقرأ البرنامج التعليمي متعدد المستأجرين للحصول على مثال على كيفية إنشاء هذا النوع من التطبيقات.
التطبيقات في الوقت الحقيقي
تقدم البنية متعددة المستأجرين بنية هرمية وتستخدم الموقع المشترك للبيانات لتوجيه الاستعلامات لكل مستأجر. على النقيض من ذلك ، تعتمد البنى في الوقت الفعلي على خصائص توزيع محددة لبياناتها لتحقيق معالجة متوازية للغاية.
نستخدم "معرف الكيان" كمصطلح لأعمدة التوزيع في نموذج الوقت الفعلي. الكيانات النموذجية هي المستخدمون أو المضيفون أو الأجهزة.
عادة ما تطلب الاستعلامات في الوقت الفعلي تجميعات رقمية مجمعة حسب التاريخ أو الفئة. يرسل Hyperscale (Citus) هذه الاستفسارات إلى كل قطعة للحصول على نتائج جزئية ويجمع الإجابة النهائية على عقدة المنسق. تعمل الاستعلامات بشكل أسرع عندما يساهم أكبر عدد ممكن من العقد ، وعندما لا يجب على أي عقدة واحدة القيام بقدر غير متناسب من العمل.
أفضل الممارسات
- اختر عمودا ذا أهمية أساسية عالية كعمود توزيع. للمقارنة، يعد حقل الحالة في جدول أوامر يحتوي على قيم جديد ومدفوع ومشحون اختيارا سيئا لعمود التوزيع. يفترض فقط تلك القيم القليلة ، والتي تحد من عدد الشظايا التي يمكن أن تحتفظ بالبيانات ، وعدد العقد التي يمكنها معالجتها. من بين الأعمدة ذات الكاردينالية العالية ، من الجيد أيضا اختيار تلك الأعمدة التي يتم استخدامها بشكل متكرر في جمل مجمعة أو كمفاتيح صلة.
- اختر عمودا بتوزيع متساو. إذا قمت بتوزيع جدول على عمود منحرف إلى قيم شائعة معينة، فإن البيانات الموجودة في الجدول تميل إلى التراكم في شظايا معينة. العقد التي تحمل تلك الشظايا ينتهي بها الأمر إلى القيام بعمل أكثر من العقد الأخرى.
- توزيع جداول الحقائق والأبعاد على أعمدتها الشائعة. يمكن أن يحتوي جدول الحقائق الخاص بك على مفتاح توزيع واحد فقط. لن يتم وضع الجداول التي تنضم إلى مفتاح آخر مع جدول الحقائق. اختر بعدا واحدا لوضعه استنادا إلى عدد مرات انضمامه وحجم صفوف الانضمام.
- تغيير بعض جداول الأبعاد إلى جداول مرجعية. إذا تعذر وضع جدول أبعاد مع جدول الحقائق، فيمكنك تحسين أداء الاستعلام عن طريق توزيع نسخ من جدول الأبعاد على جميع العقد في شكل جدول مرجعي.
اقرأ البرنامج التعليمي للوحة القيادة في الوقت الفعلي للحصول على مثال على كيفية إنشاء هذا النوع من التطبيقات.
بيانات السلاسل الزمنية
في عبء عمل السلاسل الزمنية، تقوم التطبيقات بالاستعلام عن المعلومات الحديثة أثناء أرشفة المعلومات القديمة.
الخطأ الأكثر شيوعا في نمذجة معلومات السلاسل الزمنية في Hyperscale (Citus) هو استخدام الطابع الزمني نفسه كعمود توزيع. توزيع التجزئة على أساس الوقت يوزع الأوقات بشكل عشوائي على ما يبدو في شظايا مختلفة بدلا من الحفاظ على نطاقات الوقت معا في شظايا. تشير الاستعلامات التي تتضمن الوقت بشكل عام إلى نطاقات زمنية ، على سبيل المثال ، أحدث البيانات. هذا النوع من توزيع التجزئة يؤدي إلى النفقات العامة للشبكة.
أفضل الممارسات
- لا تختار طابعا زمنيا كعمود توزيع. اختر عمود توزيع مختلفا. في تطبيق متعدد المستأجرين، استخدم رقم تعريف المستأجر، أو في تطبيق في الوقت الفعلي استخدم رقم تعريف الكيان.
- استخدم تقسيم جدول PostgreSQL للوقت بدلا من ذلك. استخدم تقسيم الجدول لتقسيم جدول كبير من البيانات مرتبة زمنيا إلى جداول موروثة متعددة مع احتواء كل جدول على نطاقات زمنية مختلفة. يؤدي توزيع جدول مقسم بواسطة Postgres في Hyperscale (Citus) إلى إنشاء شظايا للجداول الموروثة.
الخطوات التالية
- تعرف على كيفية مساعدة الموقع المشترك بين البيانات الموزعة على تشغيل الاستعلامات بسرعة.
- اكتشف عمود التوزيع الخاص بجدول موزع واستعلامات تشخيصية مفيدة أخرى.