استعلام عن حاوية Azure Cosmos

ينطبق على: واجهة برمجة تطبيقات SQL

تشرح هذه المقالة كيفية الاستعلام عن حاوية (مجموعة أو رسم بياني أو جدول) في 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 والإصدارات الأحدث خيارات تنفيذ الاستعلام المتوازي. تتيح لك الاستعلامات المتوازية عبر الأقسام تنفيذ استعلامات بزمن انتقال منخفض وتقسيم مشترك.

يمكنك إدارة تنفيذ الاستعلام المتوازي عن طريق ضبط المعلمات التالية:

  • الحد الأقصى للتزامن: تعيين الحد الأقصى لعدد اتصالات الشبكة المتزامنة لأقسام الحاوية. إذا قمت بتعيين هذه الخاصية على -1، فإن SDK تدير درجة التوازي. إذا تم تعيين MaxConcurrency على 0، فهناك اتصال شبكة واحد لأقسام الحاوية.

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

نظراً لقدرة Azure Cosmos DB على موازاة استعلامات الأقسام المشتركة، فإن زمن انتقال الاستعلام سيتسع بشكل عام كما يضيف النظام أقساماً مادية. ومع ذلك، ستزداد رسوم وحدة الطلب بشكل ملحوظ مع زيادة العدد الإجمالي للأقسام المادية.

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

مثال مفيد

فيما يلي تشبيه لفهم استعلامات التقسيم المشترك بشكل أفضل:

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

يمكننا مقارنة استعلامات التقسيم والتقسيم المشترك باستخدام هذا المثال:

الاستعلام داخل القسم

إذا كان سائق التوصيل يعرف المجمع السكني الصحيح (القسم المادي)، فيمكنه القيادة على الفور إلى المبنى الصحيح. يمكن للسائق التحقق من قائمة المجمع السكني لأرقام الوحدات السكنية (الفهرس) وتسليم الحزم المناسبة بسرعة. في هذه الحالة، لا يضيع السائق أي وقت أو جهد في القيادة إلى مجمع سكني للتحقق ومعرفة ما إذا كان أي من المستلمين بالحزمة يعيشون هناك.

الاستعلام عبر التقسيم (توزيع المهام إلى عدة وجهات)

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

استعلام متعدد الأقسام (يتم تحديد نطاقه لعدد قليل من الأقسام المادية)

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

تجنب الاستعلامات المشتركة بين الأقسام

بالنسبة لمعظم الحاويات، من المحتم أن يكون لديك بعض استعلامات التقسيم المتقاطع. لا بأس بوجود بعض الاستفسارات عبر التقسيم! يتم دعم جميع عمليات الاستعلام تقريباً عبر الأقسام (كل من مفاتيح الأقسام المنطقية والأقسام المادية). يحتوي Azure Cosmos DB أيضاً على العديد من التحسينات في محرك الاستعلام ومجموعات SDK للعميل لموازاة تنفيذ الاستعلام عبر الأقسام المادية.

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

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

عدد الأقسام المادية مرتبط بمقدار وحدات الطلب المتوفرة. يسمح كل قسم مادي لما يصل إلى 10000 وحدة طلب متوفرة ويمكن تخزين ما يصل إلى 50 جيجابايت من البيانات. سيقوم Azure Cosmos DB تلقائياً بإدارة الأقسام المادية نيابة عنك. يعتمد عدد الأقسام المادية في الحاوية الخاصة بك على معدل النقل المقدم والتخزين المستهلك.

يجب أن تحاول تجنب الاستعلامات المشتركة بين الأقسام إذا كان حمل العمل لديك يفي بالمعايير أدناه:

  • أنت تخطط للحصول على أكثر من 30،000 وحدة طلب مُخصص
  • أنت تخطط لتخزين أكثر من 100 جيجابايت من البيانات

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

راجع المقالات التالية للتعرف على كيفية التقسيم في Azure Cosmos DB: