محرك تخزين قابل للتوسيع

محرك التخزين القابل للتوسيع ( ESE )، المعروف أيضًا باسم JET Blue ، هو تقنية تخزين بيانات من مايكروسوفت تعتمد على طريقة الوصول التسلسلي المفهرس ( ISAM ) . يُعد ESE جوهر خادم مايكروسوفت إكستشينج ، وخدمة Active Directory ، وبحث ويندوز . كما يُستخدم أيضًا من قِبل عدد من مكونات ويندوز، بما في ذلك عميل تحديثات ويندوز ومركز المساعدة والدعم . ويتمثل الغرض منه في تمكين التطبيقات من تخزين البيانات واسترجاعها عبر الوصول المفهرس والتسلسلي.

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

تم تضمين برنامج ESE Runtime (ESENT.DLL) في جميع إصدارات ويندوز منذ ويندوز 2000 ، مع توفير نسخة x64 أصلية منه في إصدارات x64 من ويندوز XP وويندوز سيرفر 2003. أما مايكروسوفت إكستشينج ، حتى إصدار 2003، فقد تم توفيره بنسخة 32 بت فقط، لكونها المنصة الوحيدة المدعومة. ومع إصدار 2007 ، أصبح متوفرًا بنسخة 64 بت.

قواعد البيانات

قاعدة البيانات عبارة عن تجميع للبيانات، ماديًا ومنطقيًا. تبدو قاعدة بيانات ESE كملف واحد لنظام التشغيل Windows. داخليًا، تتكون قاعدة البيانات من مجموعة من الصفحات بحجم 2 أو 4 أو 8 أو 16 أو 32 كيلوبايت (خيارات الصفحات بحجم 16 و32 كيلوبايت متوفرة فقط في Windows 7 وExchange 2010)، [ 1 ] مرتبة في بنية شجرة B متوازنة . [ 2 ] تحتوي هذه الصفحات على بيانات وصفية لوصف البيانات الموجودة داخل قاعدة البيانات، والبيانات نفسها، وفهارس لحفظ ترتيبات البيانات المهمة، ومعلومات أخرى. تتداخل هذه المعلومات داخل ملف قاعدة البيانات، ولكن تُبذل جهود للحفاظ على تجميع البيانات المستخدمة معًا داخل قاعدة البيانات. قد تحتوي قاعدة بيانات ESE على ما يصل إلى 232 صفحة ، أو 16 تيرابايت من البيانات، [ 3 ] للصفحات بحجم 8 كيلوبايت .

تُصنَّف قواعد بيانات ESE في مجموعات تُسمى مثيلات. تستخدم معظم التطبيقات مثيلًا واحدًا، ولكن يمكن لجميع التطبيقات استخدام مثيلات متعددة. تكمن أهمية المثيل في ربطه سلسلة سجلات استرداد واحدة بقاعدة بيانات واحدة أو أكثر. حاليًا، يمكن ربط ما يصل إلى 6 قواعد بيانات مستخدم بمثيل ESE في أي وقت. يمكن أن تحتوي كل عملية منفصلة تستخدم ESE على ما يصل إلى 1024 مثيلًا من مثيلات ESE.

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

الجداول

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

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

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

السجلات والأعمدة

السجل عبارة عن مجموعة من قيم الأعمدة المرتبطة. تُضاف السجلات وتُحدّث عبر عمليات التحديث، ويمكن حذفها عبر عمليات الحذف. تُعيّن الأعمدة وتُسترجع عبر عمليتي SetColumns وRetrieveColumns على التوالي. يبلغ الحد الأقصى لحجم السجل 8110 بايت للصفحات التي يبلغ حجمها 8 كيلوبايت، باستثناء أعمدة القيم الطويلة. لا تُساهم أنواع الأعمدة LongText وLongBinary بشكل كبير في هذا القيد على الحجم، ويمكن للسجلات أن تحتوي على بيانات أكبر بكثير من حجم صفحة قاعدة البيانات عند تخزين البيانات في أعمدة القيم الطويلة. عند تخزين مرجع قيمة طويلة في سجل، يلزم 9 بايت فقط من البيانات داخل السجل. قد يصل حجم هذه القيم الطويلة نفسها إلى 2 جيجابايت .

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

يدعم ESE نطاقًا واسعًا من قيم الأعمدة، تتراوح أحجامها من 1 بت إلى 2 جيجابايت. يُعد اختيار نوع العمود الصحيح أمرًا بالغ الأهمية، لأن نوع العمود يُحدد العديد من خصائصه، بما في ذلك ترتيبه في الفهارس. أنواع البيانات التالية مدعومة من قِبل ESE:

أنواع الأعمدة

اسموصف
قليلقيمة ثلاثية (NULL أو 0 أو 1)
بايت غير موقععدد صحيح غير مُوقّع بحجم بايت واحد
قصيرعدد صحيح مُوقّع من بايتين
قصير غير موقععدد صحيح غير مُوقّع من بايتين
طويلعدد صحيح موقع مكون من 4 بايت
غير موقع طويلعدد صحيح غير مُوقّع من 4 بايت
لونج لونجعدد صحيح موقع من 8 بايت
غير موقع طويل طويلعدد صحيح غير موقع بحجم 8 بايت
عملةعدد صحيح موقع من 8 بايت
IEEE Singleعدد عشري مكون من 4 بايت
IEEE Doubleعدد عشري مكون من 8 بايت
التاريخ والوقتتاريخ ووقت مكون من 8 بايت (تاريخ صحيح، وقت جزئي)
المعرف الفريد العالمي (GUID)معرّف فريد مكون من 16 بايت
ثنائيسلسلة ثنائية، طولها ≤ 255 بايت
نصسلسلة ANSI أو Unicode، طولها ≤ 255 بايت
ثنائي طويلسلسلة ثنائية كبيرة، طولها أقل من 2 جيجابايت
نص طويلسلسلة ANSI أو Unicode كبيرة، طولها أقل من 2 جيجابايت

الأعمدة الثابتة والمتغيرة والموسومة

يمكن لكل جدول ESE أن يحدد ما يصل إلى 127 عمودًا ثابت الطول، و128 عمودًا متغير الطول، و64993 عمودًا موسومًا.

  • الأعمدة الثابتة هي أعمدة تشغل نفس المساحة في كل سجل، بغض النظر عن قيمتها. تشغل هذه الأعمدة بتًا واحدًا لتمثيل قيمة العمود الفارغة، ومساحة ثابتة في كل سجل يتم فيه تعيين قيمة هذا العمود، أو قيمة عمود ثابت يتم تحديده لاحقًا.
  • الأعمدة المتغيرة هي أعمدة تشغل مساحة متغيرة في كل سجل يتم تعيينها فيه، وذلك تبعًا لحجم قيمة العمود. تشغل هذه الأعمدة بايتين لتحديد ما إذا كانت القيمة فارغة (NULLity) أم لا، بالإضافة إلى مساحة متغيرة في كل سجل يتم تعيينها فيه.
  • Tagged columns are columns that take no space whatsoever if they are not set in a record. They may be single valued but can also be multi-valued. The same tagged column may have multiple values in a single record. When tagged columns are set in a record, each instance of a tagged column takes approximately 4-bytes of space in addition to the size of the tagged column instance value. When the number of instances of a single tagged column is large, the overhead per tagged column instance is approximately 2-bytes. Tagged columns are ideal for sparse columns because they take no space whatsoever if they are not set. If a multi-valued tagged column is indexed, the index will contain one entry for the record for each value of the tagged column.

For a given table, columns fall into one of two categories: those which either occur exactly once in each of the records, with possibly a few NULL values; and those which occur rarely, or which may have multiple occurrences in a single record. Fixed and variable columns belong to the former category, while tagged columns belong to the latter. The internal representation of the two column categories is different, and it is important to understand the trade offs between the column categories. Fixed and variable columns are typically represented in every record, even when the occurrence has a NULL value. These columns can be quickly addressed via an offset table. Tagged column occurrences are preceded by a column identifier and the column is located by binary searching the set of tagged columns.

Long values

Column types of Long Text and Long Binary are large binary objects. They are stored in separate B+tree from the clustered index keyed by long value id and byte offset. ESE supports append, byte range overwrite, and set size for these columns. Also, ESE has a single instance store feature where multiple records may reference the same large binary object, as though each record had its own copy of the information, i.e. without inter-record locking conflicts. The maximum size of a Long Text or Long Binary column value is 2 GB.

Version, auto-increment and escrow columns

Version columns are automatically incremented by ESE each time a record containing this column is modified via an Update operation. This column cannot be set by the application, but can only be read. Applications of version columns include being used to determine if an in-memory copy of a given record needs to be refreshed. If the value in a table record is greater than the value in a cached copy then the cached copy is known to be out of date. Version columns must be of type Long.

تُعيّن ESE أعمدة الترقيم التلقائي تلقائيًا بحيث تكون القيمة الموجودة في العمود فريدة لكل سجل في الجدول. لا يمكن للتطبيق تعيين هذه الأعمدة، مثل أعمدة الإصدار. أعمدة الترقيم التلقائي للقراءة فقط، ويتم تعيينها تلقائيًا عند إدراج سجل جديد في الجدول عبر عملية تحديث. تبقى القيمة في العمود ثابتة طوال مدة بقاء السجل، ويُسمح بعمود ترقيم تلقائي واحد فقط لكل جدول. قد تكون أعمدة الترقيم التلقائي من نوع Long أو Currency.

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

الفهارس

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

الفهارس المجمعة

يمكن تحديد فهرس واحد كفهرس مُجمّع، أو فهرس أساسي. في ESE، يجب أن يكون الفهرس المُجمّع فريدًا ويُشار إليه بالفهرس الأساسي. أما الفهارس الأخرى فتُسمى فهارس غير مُجمّعة، أو فهارس ثانوية. تختلف الفهارس الأساسية عن الفهارس الثانوية في أن مدخل الفهرس هو السجل نفسه، وليس مؤشرًا منطقيًا إليه. تحتوي الفهارس الثانوية على مفاتيح أساسية في أوراقها للربط المنطقي بالسجل في الفهرس الأساسي. بعبارة أخرى، يتم تجميع الجدول فعليًا وفقًا لترتيب الفهرس الأساسي. عادةً ما يكون استرجاع بيانات السجلات غير المفهرسة بترتيب الفهرس الأساسي أسرع بكثير من استرجاعها بترتيب الفهرس الثانوي. وذلك لأن عملية وصول واحدة إلى القرص يمكن أن تُحضر إلى الذاكرة سجلات متعددة سيتم الوصول إليها في أوقات متقاربة. تُلبي عملية الوصول نفسها إلى القرص عمليات الوصول إلى سجلات متعددة. مع ذلك، قد يكون إدراج سجل في منتصف الفهرس، وفقًا لترتيب الفهرس الأساسي، أبطأ بكثير من إضافته إلى نهاية الفهرس. يجب مراعاة معدل التحديث بعناية مقابل أنماط الاسترجاع عند تصميم الجدول. إذا لم يُعرَّف فهرس أساسي لجدول ما، فسيتم إنشاء فهرس أساسي ضمني يُسمى فهرس مفتاح قاعدة البيانات (DBK). مفتاح قاعدة البيانات هو ببساطة رقم تصاعدي فريد يُزاد مع كل سجل يُضاف. ونتيجةً لذلك، يكون الترتيب الفعلي للسجلات في فهرس مفتاح قاعدة البيانات هو ترتيب الإدخال الزمني، وتُضاف السجلات الجديدة دائمًا في نهاية الجدول. إذا رغب تطبيق ما في تجميع البيانات على فهرس غير فريد، فيمكنه ذلك بإضافة عمود ترقيم تلقائي إلى نهاية تعريف الفهرس غير الفريد.

الفهرسة على الأعمدة متعددة القيم

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

الفهارس المتفرقة

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

فهارس الصفوف

يمكن أيضًا تعريف الفهارس لتضمين مدخل واحد لكل سلسلة فرعية من عمود نصي أو نص طويل. تُسمى هذه الفهارس بفهارس الصفوف. تُستخدم لتسريع الاستعلامات التي تعتمد على مطابقة السلاسل الفرعية. لا يمكن تعريف فهارس الصفوف إلا لأعمدة النصوص. على سبيل المثال، إذا كانت قيمة عمود نصي هي "أحب JET Blue" ، وتم تكوين الفهرس بحيث يكون الحد الأدنى لحجم الصف 4 أحرف والحد الأقصى لطول الصف 10 أحرف، فسيتم فهرسة السلاسل الفرعية التالية:

"أحب جيت"

"أحب جيت" "أحب جيت ب" "أحب جيت ب ل" "أحب جيت بلو" "إي جيت بلو" "جيت بلو" "جيت بلو" "جيت بلو" "إي تي بلو" "تي بلو" "بلو" " بلو" "بلو"

على الرغم من أن فهارس الصفوف قد تكون كبيرة جدًا، إلا أنها تُسرّع بشكل ملحوظ الاستعلامات من النوع: البحث عن جميع السجلات التي تحتوي على "JET Blue" . يمكن استخدامها للسلاسل الفرعية الأطول من الحد الأقصى لطول الصف، وذلك بتقسيم سلسلة البحث الفرعية إلى سلاسل بحث بطول الصف الأقصى، ثم تقاطع النتائج. كما يمكن استخدامها للمطابقات التامة للسلاسل التي يصل طولها إلى الحد الأقصى لطول الصف، أو التي لا يتجاوز طولها الحد الأدنى لطول الصف، دون الحاجة إلى تقاطع الفهارس. لمزيد من المعلومات حول إجراء تقاطع الفهارس في ESE، راجع قسم "تقاطع الفهارس" . لا تُسرّع فهارس الصفوف الاستعلامات التي تكون فيها سلسلة البحث أقصر من الحد الأدنى لطول الصف.

المعاملات

المعاملة هي وحدة معالجة منطقية محددة بعمليتي بدء المعاملة (BeginTransaction) وإتمامها (CommitTransaction) أو التراجع عنها (Rollback). جميع التحديثات التي تُجرى أثناء المعاملة ذرية؛ إما أن تظهر جميعها في قاعدة البيانات في الوقت نفسه أو لا يظهر أي منها. أي تحديثات لاحقة من معاملات أخرى تكون غير مرئية للمعاملة. مع ذلك، لا يمكن للمعاملة تحديث سوى البيانات التي لم تتغير في هذه الأثناء؛ وإلا تفشل العملية فورًا دون انتظار. معاملات القراءة فقط لا تحتاج أبدًا إلى الانتظار، ويمكن لمعاملات التحديث أن تتداخل فقط مع معاملات التحديث الأخرى. المعاملات التي تُنهى بالتراجع عنها، أو بسبب عطل في النظام، لا تترك أي أثر في قاعدة البيانات. بشكل عام، تُستعاد حالة البيانات عند التراجع عنها إلى ما كانت عليه قبل بدء المعاملة.

يمكن تداخل المعاملات حتى 7 مستويات، مع تخصيص مستوى إضافي للاستخدام الداخلي لـ ESE. هذا يعني أنه يمكن التراجع عن جزء من المعاملة دون الحاجة إلى التراجع عن المعاملة بأكملها؛ إذ يشير أمر CommitTransaction الخاص بمعاملة متداخلة إلى نجاح مرحلة واحدة من المعالجة، وقد تفشل المعاملة الخارجية. تُحفظ التغييرات في قاعدة البيانات فقط عند حفظ المعاملة الخارجية. يُعرف هذا بالالتزام بمستوى المعاملة 0. عند الالتزام بمستوى المعاملة 0، تُرسل البيانات التي تصف المعاملة بشكل متزامن إلى سجل المعاملات لضمان إتمامها حتى في حالة حدوث عطل لاحق في النظام. يضمن إرسال سجل المعاملات بشكل متزامن استمرارية معاملات ESE. مع ذلك، في بعض الحالات، ترغب التطبيقات في ترتيب تحديثاتها، ولكن دون ضمان تنفيذ التغييرات فورًا. هنا، يمكن للتطبيقات حفظ التغييرات باستخدام JET_bitIndexLazyFlush.

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

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

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

التنقل بالمؤشر ومخزن النسخ المؤقت

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

يحتوي كل مؤشر على مخزن نسخ مؤقت لإنشاء سجل جديد أو تعديل سجل موجود، عمودًا تلو الآخر. هذا مخزن داخلي يمكن تغيير محتوياته باستخدام عمليات SetColumns. لا تؤدي تعديلات مخزن النسخ المؤقت إلى تغيير البيانات المخزنة تلقائيًا. يمكن نسخ محتويات السجل الحالي إلى مخزن النسخ المؤقت باستخدام عملية PrepareUpdate، وتقوم عمليات Update بتخزين محتويات مخزن النسخ المؤقت كسجل. يتم مسح مخزن النسخ المؤقت ضمنيًا عند إتمام المعاملة أو التراجع عنها، وكذلك عند عمليات التنقل. يمكن استخدام RetrieveColumns لاسترداد بيانات الأعمدة إما من السجل أو من مخزن النسخ المؤقت، إن وجد.

معالجة الاستعلامات

تستعلم تطبيقات ESE عن بياناتها بشكل دائم. يصف هذا القسم من الوثيقة الميزات والتقنيات اللازمة لكتابة منطق معالجة الاستعلامات على ESE.

فرز وطاولات مؤقتة

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

تغطية المؤشرات

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

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

تقاطع المؤشر

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

يُعدّ تقاطع الفهارس آلية استعلام مهمة، حيث تُستخدم فهارس متعددة معًا لمعالجة القيود المعقدة بكفاءة أكبر. فبدلًا من استخدام فهرس واحد فقط، تُدمج نطاقات الفهارس الموجودة على فهارس متعددة، مما ينتج عنه عدد أقل بكثير من السجلات التي يمكن تطبيق أي شرط متبقٍ عليها. تُسهّل ESE هذه العملية من خلال توفير عملية IntersectIndexes. تقبل هذه العملية سلسلة من نطاقات الفهارس الموجودة على فهارس من نفس الجدول، وتُعيد جدولًا مؤقتًا للمفاتيح الأساسية التي يمكن استخدامها للتنقل إلى سجلات الجدول الأساسي التي تُحقق جميع شروط الفهرس.

الجداول المدمجة مسبقًا

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

تسجيل الأحداث واستعادة البيانات بعد الأعطال

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

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

النسخ الاحتياطي والاستعادة

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

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

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

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

النسخ الاحتياطي والاستعادة على أجهزة مختلفة

عند إنشاء قاعدة بيانات ESENT، يتم تخزين حجم قطاع القرص الفعلي مع قاعدة البيانات. من المتوقع أن يظل حجم القطاع الفعلي ثابتًا بين الجلسات؛ وإلا، سيتم الإبلاغ عن خطأ. عند استنساخ محرك أقراص فعلي أو استعادته من صورة محرك أقراص إلى محرك أقراص يستخدم حجم قطاع فعلي مختلف ( محركات الأقراص ذات التنسيق المتقدم )، سيُبلغ ESENT عن أخطاء. [ 4 ]

هذه مشكلة معروفة، وقد وفرت مايكروسوفت تحديثات عاجلة لإصلاحها. بالنسبة لنظامي التشغيل ويندوز فيستا وويندوز سيرفر 2008، راجع KB2470478. [ 5 ] أما بالنسبة لنظامي التشغيل ويندوز 7 وويندوز سيرفر 2008 R2، فراجع KB982018. [ 6 ]

تاريخ

طُوِّرَتْ JET Blue في الأصل من قِبَل مايكروسوفت كترقية مُحتملة لمحرك قاعدة بيانات JET Red في مايكروسوفت أكسس ، ولكنها لم تُستخدم لهذا الغرض. بدلاً من ذلك، استُخدِمت من قِبَل خادم Exchange، وActive Directory، وخدمة نسخ الملفات (FRS)، ومحرر تكوين الأمان، وخدمات الشهادات، وخدمة أسماء الإنترنت في ويندوز (WINS)، ومجموعة كبيرة من خدمات مايكروسوفت وتطبيقاتها ومكونات ويندوز الأخرى. [ 7 ] لسنوات، كانت واجهة برمجة تطبيقات خاصة بمايكروسوفت فقط، ولكنها أصبحت منذ ذلك الحين واجهة برمجة تطبيقات عامة يُمكن لأي شخص استخدامها.

بدأ العمل على محرك الوصول إلى البيانات (DAE) في مارس 1989 بانضمام ألين رايتر إلى مايكروسوفت. وعلى مدار العام التالي، عمل فريق من أربعة مطورين تحت إشراف ألين لإنجاز جزء كبير من نظام إدارة قواعد البيانات (ISAM). كانت مايكروسوفت تمتلك بالفعل نظام إدارة قواعد البيانات BC7 ISAM (المعروف باسم JET Red)، لكنها بدأت العمل على محرك الوصول إلى البيانات (DAE) لبناء محرك قواعد بيانات أكثر قوة، وذلك كخطوة أولى في مجال بنية العميل والخادم الجديدة آنذاك. في ربيع عام 1990، تم دمج فريقي BC7 ISAM وDAE لتشكيل مشروع تقنية المحرك المشترك (JET)، المسؤول عن إنتاج محركين: الإصدار الأول ( JET Red ) والإصدار الثاني (JET Blue)، واللذان يتوافقان مع نفس مواصفات واجهة برمجة التطبيقات (JET API). أصبح اسم DAE هو JET Blue نسبةً إلى لون علم إسرائيل، بينما أصبح اسم BC7 ISAM هو JET Red نسبةً إلى لون علم روسيا. على الرغم من أن JET Blue وJET Red كُتبا وفقًا لنفس مواصفات واجهة برمجة التطبيقات، إلا أنهما لم يشتركا في أي جزء من كود ISAM. كلاهما كان يدعم معالج استعلام مشترك، وهو QJET، والذي أصبح فيما بعد مرادفًا لـ JET Red، إلى جانب BC7 ISAM.

تم إطلاق JET Blue لأول مرة عام 1994 كأداة ISAM لخدمات WINS وDHCP وخدمات RPL ( التي توقفت عن العمل الآن ) في نظام التشغيل Windows NT 3.5. ثم أُعيد إطلاقه كمحرك تخزين لـ Microsoft Exchange عام 1996. واختارت خدمات Windows أخرى JET Blue كتقنية تخزين لها، وبحلول عام 2000، أصبح JET Blue مُدمجًا في جميع إصدارات Windows. استُخدم JET Blue في Active Directory وأصبح جزءًا من مجموعة خاصة من أكواد Windows تُسمى Trusted Computing Base (TCB). ولا يزال عدد تطبيقات Microsoft التي تستخدم JET Blue في ازدياد، وقد نُشرت واجهة برمجة تطبيقات JET Blue (JET Blue API) عام 2005 لتسهيل استخدامه من قِبل عدد متزايد من التطبيقات والخدمات داخل Windows وخارجه.

ذكرت مدونة Microsoft Exchange Web Blog [ 8 ] أن المطورين الذين ساهموا في JET Blue يشملون تشين لياو، وستيفن هيشت، وماثيو بيلو، وإيان خوسيه، وإدوارد "إيدي" جيلبرت، وكينيث كين لوم، وبالاسوبرامانيان سريرام، وجوناثان ليم، وأندرو جودسيل، ولوريون بورشال، وأندريه مارينسكو، وآدم فوكسمان، وإيفان ترينديف، وسبنسر لو، وبريت شيرلي.

في يناير 2021، أتاحت مايكروسوفت برنامج ESE كمصدر مفتوح. [ 9 ] تم نشره على GitHub بترخيص MIT المتساهل .

مقارنة بـ JET Red

على الرغم من أنهما يشتركان في سلالة مشتركة، إلا أن هناك اختلافات شاسعة بين JET Red و ESE.

  • JET Red هي تقنية لمشاركة الملفات، بينما تم تصميم ESE ليتم تضمينها في تطبيق خادم، ولا تقوم بمشاركة الملفات.
  • يبذل برنامج JET Red قصارى جهده لاستعادة الملفات، بينما يتميز برنامج ESE بتسجيل الكتابة المسبقة وعزل اللقطات لضمان استعادة الملفات بعد الأعطال.
  • يدعم JET Red قبل الإصدار 4.0 قفل مستوى الصفحة فقط، بينما يدعم ESE و JET Red الإصدار 4.0 قفل مستوى السجل.
  • يدعم JET Red مجموعة واسعة من واجهات الاستعلام، بما في ذلك ODBC و OLE DB . أما ESE فلا يأتي مزودًا بمحرك استعلام، بل يعتمد على التطبيقات لكتابة استعلاماتها الخاصة باستخدام لغة C ISAM.
  • يبلغ الحد الأقصى لحجم ملف قاعدة البيانات في JET Red 2 جيجابايت ، بينما يبلغ الحد الأقصى لحجم ملف قاعدة البيانات في ESE 8 تيرابايت مع صفحات بحجم 4 كيلوبايت ، و16 تيرابايت مع صفحات بحجم 8 كيلوبايت.

مراجع

  1. في هذا السياق، 1 كيلوبايت = 1024 بايت
  2. "بنية محرك التخزين القابلة للتوسيع" . TechNet . تم الاسترجاع في 18-06-2007 .
  3. في هذا السياق، 1 تيرابايت =1024 بايت
  4. "منتجات أكرونيس: قد لا تعمل التطبيقات المبنية على ESENT والتي تعمل على أنظمة التشغيل Windows Vista وWindows Server 2008 وWindows 7 بشكل صحيح بعد الاستعادة أو الاستنساخ إلى محرك أقراص ذي قطاعات فعلية مختلفة | قاعدة المعرفة" . kb.acronis.com
  5. قد لا تعمل التطبيقات المبنية على ESENT والتي تعمل على جهاز كمبيوتر بنظام Windows Vista أو Windows Server 2008 بشكل صحيح بعد تغيير حجم القطاع الفعلي المُبلغ عنه لجهاز التخزين . مؤرشف من الأصل بتاريخ 28 فبراير 2015. تم الاطلاع عليه بتاريخ 19 نوفمبر 2014 .
  6. يتوفر تحديث لتحسين توافق نظامي التشغيل Windows 7 وWindows Server 2008 R2 مع أقراص التنسيق المتقدم . support.microsoft.com
  7. "محرك التخزين القابل للتوسيع" . مايكروسوفت .
  8. "محرك تخزين قابل للتوسيع" . تم الاطلاع عليه بتاريخ 19-12-2008 .
  9. "Microsoft Open Sources ESE, Extensible Storage Engine" . 3 فبراير 2021. تم الاطلاع عليه بتاريخ 5 فبراير 2021 .
  • "مصطلحات التبادل" . مؤرشف من الأصل بتاريخ 9 نوفمبر 2008. تم الاطلاع عليه بتاريخ 20 أغسطس 2015 .
  • "فهم أساسيات مخزن المعلومات" . مؤرشف من الأصل في 9 يونيو 2007. تم الاطلاع عليه بتاريخ 18 يونيو 2007 .