الاستعلام عن حاوية Azure Cosmos DB
ينطبق على: NoSQL
تشرح هذه المقالة كيفية الاستعلام عن حاوية (مجموعة أو رسم بياني أو جدول) في Azure Cosmos DB. على وجه الخصوص، يغطي كيفية عمل استعلامات التقسيم والتقسيم المشترك في Azure Cosmos DB.
الاستعلام داخل القسم
عندما تقوم بالاستعلام عن بيانات من الحاويات، إذا كان الاستعلام يحتوي على عامل تصفية مفتاح قسم محدد، فإن Azure Cosmos DB يعمل تلقائياً على تحسين الاستعلام. يقوم بتوجيه الاستعلام إلى الأقسام الفعلية المقابلة لقيم مفتاح القسم المحددة في عامل التصفية.
على سبيل المثال، ضع في اعتبارك الاستعلام أدناه مع عامل تصفية المساواة على DeviceId
. إذا قمنا بتشغيل هذا الاستعلام على حاوية مقسمة على DeviceId
، يقوم هذا الاستعلام بالتصفية إلى قسم فعلي واحد.
SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'
كما هو الحال مع المثال السابق، يقوم هذا الاستعلام أيضا بالتصفية إلى قسم واحد. لا تؤدي إضافة عامل التصفية إلى Location
تغيير الاستعلام التالي:
SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'
إليك استعلام يحتوي على عامل تصفية نطاق على مفتاح القسم ولن يتم تحديد نطاقه لقسم مادي واحد. لكي يكون استعلاماً داخل القسم، يجب أن يحتوي الاستعلام على عامل تصفية مساواة يتضمن مفتاح القسم:
SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'
الاستعلام عبر التقسيم
لا يحتوي الاستعلام التالي على عامل تصفية على مفتاح القسم (DeviceId
). لذلك، يجب أن يتم توزيعه على جميع الأقسام المادية حيث يتم تشغيله مقابل فهرس كل قسم:
SELECT * FROM c WHERE c.Location = 'Seattle`
كل قسم مادي له فهرس خاص به. لذلك، عند تشغيل استعلام عبر الأقسام على حاوية، تقوم بتشغيل استعلام واحد بشكل فعال لكل قسم فعلي. يقوم Azure Cosmos DB تلقائيا بتجميع النتائج عبر أقسام مادية مختلفة.
الفهارس الموجودة في الأقسام المادية المختلفة مستقلة عن بعضها. لا يوجد فهرس عمومي في Azure Cosmos DB.
استعلام التقسيم الموازي
تدعم Azure Cosmos DB SDKs 1.9.0 والإصدارات الأحدث خيارات تنفيذ الاستعلام المتوازي. تتيح لك الاستعلامات المتوازية عبر الأقسام تنفيذ استعلامات بزمن انتقال منخفض وتقسيم مشترك.
يمكنك إدارة تنفيذ الاستعلام المتوازي عن طريق ضبط المعلمات التالية:
MaxConcurrency: تعيين الحد الأقصى لعدد اتصالات الشبكة المتزامنة إلى أقسام الحاوية. إذا قمت بتعيين هذه الخاصية إلى
-1
، فإن SDK تدير درجة التوازي.MaxConcurrency
إذا تم تعيين إلى0
، فهناك اتصال شبكة اتصال واحد بأقسام الحاوية.MaxBufferedItemCount: يتداول زمن انتقال الاستعلام مقابل استخدام الذاكرة من جانب العميل. إذا تم حذف هذا الخيار أو التعيين إلى -1، فإن SDK تدير عدد العناصر المخزنة مؤقتاً أثناء تنفيذ الاستعلام المتوازي.
نظرا لقدرة Azure Cosmos DB على موازاة الاستعلامات عبر الأقسام، فإن زمن انتقال الاستعلام يتوسع بشكل عام بالإضافة إلى أن النظام يضيف أقساما فعلية. ومع ذلك، تزداد رسوم وحدة الطلب بشكل كبير مع زيادة العدد الإجمالي للأقسام المادية.
عند تشغيل استعلام عبر الأقسام، فأنت تقوم أساسا باستعلام منفصل لكل قسم مادي فردي. بينما تستخدم الاستعلامات عبر الأقسام الفهرس، إذا كانت متوفرة، فإنها لا تزال غير فعالة تقريبا مثل الاستعلامات داخل القسم.
مثال مفيد
فيما يلي تشبيه لشرح الاستعلامات عبر الأقسام بشكل أفضل:
تخيل أنك سائق توصيل يجب عليه تسليم الحزم إلى مجمعات سكنية مختلفة. يحتوي كل مجمع سكني على قائمة في أماكن العمل تحتوي على جميع أرقام وحدات السكان. يمكننا مقارنة كل مجمع سكني بقسم مادي وكل قائمة بفهرس القسم المادي.
يمكننا مقارنة استعلامات التقسيم والتقسيم المشترك باستخدام هذا المثال:
استعلام داخل القسم (مثال)
إذا كان سائق التوصيل يعرف المجمع السكني الصحيح (القسم المادي)، فيمكنه القيادة على الفور إلى المبنى الصحيح. يمكن للسائق التحقق من قائمة المجمع السكني لأرقام وحدات السكان (الفهرس) وتسليم الحزم المناسبة بسرعة. في هذه الحالة، لا يضيع السائق أي وقت أو جهد في القيادة إلى مجمع سكني للتحقق مما إذا كان أي مستلمي الحزمة يعيشون هناك أم لا.
الاستعلام عبر التقسيم (توزيع المهام إلى عدة وجهات)
إذا كان سائق التوصيل لا يعرف المجمع السكني الصحيح (القسم المادي)، فإنهم بحاجة إلى القيادة إلى كل مبنى سكني واحد والتحقق من القائمة مع جميع أرقام وحدات السكان (الفهرس). بمجرد وصول السائق إلى كل مجمع سكني، سيظل قادرا على استخدام قائمة عناوين كل مقيم. ومع ذلك، يحتاجون إلى التحقق من قائمة كل مجمع سكني، سواء كان أي مستلمي الحزمة يعيشون هناك أم لا. هذا المثال هو كيفية عمل الاستعلامات عبر الأقسام. بينما يمكنهم استخدام الفهرس (بمعنى أنهم لا يحتاجون إلى طرق كل باب)، يجب عليهم التحقق بشكل منفصل من الفهرس لكل قسم مادي.
استعلام متعدد الأقسام (يتم تحديد نطاقه لعدد قليل من الأقسام المادية)
إذا كان سائق التسليم يعرف أن جميع مستلمي الحزمة يعيشون داخل بعض المجمعات السكنية، فلا يحتاجون إلى القيادة إلى كل واحد. في حين أن القيادة إلى عدد قليل من المجمعات السكنية لا تزال تتطلب عملا أكثر من زيارة مبنى واحد فقط، لا يزال سائق التوصيل يوفر وقتا وجهد كبيرين. إذا كان الاستعلام يحتوي على مفتاح القسم في عامل التصفية IN
الخاص به باستخدام الكلمة الأساسية ، فإنه يتحقق فقط من فهارس القسم المادي ذات الصلة للبيانات.
تجنب الاستعلامات عبر الأقسام
بالنسبة لمعظم الحاويات، فإن وجود بعض الاستعلامات عبر الأقسام أمر لا مفر منه، وهو أمر لا بأس به! يتم دعم جميع عمليات الاستعلام تقريبا عبر الأقسام، سواء لمفاتيح الأقسام المنطقية والأقسام المادية. يحتوي Azure Cosmos DB أيضاً على العديد من التحسينات في محرك الاستعلام ومجموعات SDK للعميل لموازاة تنفيذ الاستعلام عبر الأقسام المادية.
بالنسبة لمعظم السيناريوهات كثيفة القراءة، نوصي بتحديد الخاصية الأكثر شيوعا في عوامل تصفية الاستعلام. يجب عليك أيضا التأكد من أن مفتاح القسم الخاص بك يلتزم بأفضل ممارسات تحديد مفتاح القسم الأخرى.
عادةً ما يكون تجنب استعلامات التقسيم المتقاطع مهماً فقط مع الحاويات الكبيرة. تتم محاسبتك على ما لا يقل عن 2.5 وحدة طلب في كل مرة تتحقق فيها من فهرس القسم الفعلي للحصول على النتائج حتى إذا لم تتطابق أي عناصر في القسم الفعلي مع عامل تصفية الاستعلام. على هذا النحو، إذا كان لديك قسم مادي واحد فقط (أو عدد قليل فقط)، لا تستهلك الاستعلامات عبر الأقسام وحدات RU أكثر بكثير من الاستعلامات داخل القسم.
عدد الأقسام المادية مرتبط بمقدار وحدات الطلب المتوفرة. يسمح كل قسم مادي لما يصل إلى 10000 وحدة طلب متوفرة ويمكن تخزين ما يصل إلى 50 جيجابايت من البيانات. يدير Azure Cosmos DB الأقسام المادية تلقائيا نيابة عنك. يعتمد عدد الأقسام المادية في الحاوية الخاصة بك على معدل النقل المقدم والتخزين المستهلك.
يجب أن تحاول تجنب الاستعلامات عبر الأقسام إذا كان حمل العمل الخاص بك يفي بالمعايير التالية:
- أنت تخطط للحصول على أكثر من 30،000 وحدة طلب مُخصص
- أنت تخطط لتخزين أكثر من 100 جيجابايت من البيانات
الخطوات التالية
راجع المقالات التالية للتعرف على كيفية التقسيم في Azure Cosmos DB: