المؤشر في SQL Server هو d كائن قاعدة البيانات الذي يسمح لنا باسترداد كل صف في وقت واحد ومعالجة بياناته . المؤشر ليس أكثر من مؤشر إلى صف. يتم استخدامه دائمًا مع عبارة SELECT. عادة ما تكون عبارة عن مجموعة من SQL المنطق الذي يتكرر عبر عدد محدد مسبقًا من الصفوف واحدًا تلو الآخر. مثال بسيط للمؤشر هو عندما يكون لدينا قاعدة بيانات واسعة لسجلات العمال ونريد حساب راتب كل عامل بعد خصم الضرائب والإجازات.
خادم SQL الغرض من المؤشر هو تحديث صف البيانات تلو الآخر أو تغييره أو إجراء عمليات حسابية غير ممكنة عندما نقوم باسترداد جميع السجلات مرة واحدة . كما أنه مفيد لأداء المهام الإدارية مثل النسخ الاحتياطية لقاعدة بيانات SQL Server بترتيب تسلسلي. تُستخدم المؤشرات بشكل أساسي في عمليات التطوير وDBA وETL.
تشرح هذه المقالة كل ما يتعلق بمؤشر SQL Server، مثل دورة حياة المؤشر، ولماذا ومتى يتم استخدام المؤشر، وكيفية تنفيذ المؤشرات، وقيودها، وكيف يمكننا استبدال المؤشر.
دورة حياة المؤشر
يمكننا وصف دورة حياة المؤشر في خمسة أقسام مختلفة على النحو التالي:
1: أعلن المؤشر
الخطوة الأولى هي الإعلان عن المؤشر باستخدام عبارة SQL أدناه:
تاريخ السلسلة
DECLARE cursor_name CURSOR FOR select_statement;
يمكننا الإعلان عن المؤشر عن طريق تحديد اسمه بنوع البيانات CURSOR بعد الكلمة الأساسية DECLARE. بعد ذلك، سنكتب عبارة SELECT التي تحدد مخرجات المؤشر.
2: فتح المؤشر
إنها الخطوة الثانية التي نفتح فيها المؤشر لتخزين البيانات المستردة من مجموعة النتائج. يمكننا القيام بذلك باستخدام عبارة SQL أدناه:
OPEN cursor_name;
3: جلب المؤشر
إنها خطوة ثالثة يمكن من خلالها جلب الصفوف واحدًا تلو الآخر أو في كتلة للقيام بمعالجة البيانات مثل عمليات الإدراج والتحديث والحذف على الصف النشط حاليًا في المؤشر. يمكننا القيام بذلك باستخدام عبارة SQL أدناه:
FETCH NEXT FROM cursor INTO variable_list;
يمكننا أيضًا استخدام @@وظيفة FETCHSTATUS في SQL Server للحصول على حالة مؤشر عبارة FETCH الأحدث الذي تم تنفيذه مقابل المؤشر. ال أحضر كانت العبارة ناجحة عندما يعطي @@FETCHSTATUS ناتجًا صفرًا. ال بينما يمكن استخدام العبارة لاسترداد كافة السجلات من المؤشر. الكود التالي يشرح ذلك بشكل أكثر وضوحا:
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END;
4: إغلاق المؤشر
إنها الخطوة الرابعة التي يجب فيها إغلاق المؤشر بعد أن ننتهي من العمل بالمؤشر. يمكننا القيام بذلك باستخدام عبارة SQL أدناه:
CLOSE cursor_name;
5: إلغاء تخصيص المؤشر
إنها الخطوة الخامسة والأخيرة التي سنقوم فيها بمسح تعريف المؤشر وتحرير كافة موارد النظام المرتبطة بالمؤشر. يمكننا القيام بذلك باستخدام عبارة SQL أدناه:
DEALLOCATE cursor_name;
استخدامات مؤشر SQL Server
نحن نعلم أن أنظمة إدارة قواعد البيانات العلائقية، بما في ذلك SQL Server، ممتازة في التعامل مع البيانات في مجموعة من الصفوف تسمى مجموعات النتائج. على سبيل المثال ، لدينا طاولة Product_table الذي يحتوي على أوصاف المنتج. إذا أردنا تحديث سعر للمنتج، ثم أدناه ' تحديث' سيقوم الاستعلام بتحديث كافة السجلات التي تطابق الشرط الموجود في ' أين' بند:
UPDATE product_table SET unit_price = 100 WHERE product_id = 105;
في بعض الأحيان يحتاج التطبيق إلى معالجة الصفوف بطريقة مفردة، أي على أساس صف تلو الآخر بدلاً من مجموعة النتائج بأكملها مرة واحدة. يمكننا القيام بهذه العملية باستخدام المؤشرات في SQL Server. قبل استخدام المؤشر، يجب أن نعرف أن أداء المؤشرات سيئ جدًا، لذلك يجب استخدامها دائمًا فقط عندما لا يكون هناك خيار سوى المؤشر.
يستخدم المؤشر نفس التقنية التي نستخدم بها حلقات مثل FOREACH، FOR، WHILE، DO WHILE لتكرار كائن واحد في كل مرة بجميع لغات البرمجة. وبالتالي، يمكن اختياره لأنه يطبق نفس منطق عملية التكرار في لغة البرمجة.
أنواع المؤشرات في SQL Server
فيما يلي الأنواع المختلفة للمؤشرات في SQL Server المدرجة أدناه:
- المؤشرات الثابتة
- المؤشرات الديناميكية
- المؤشرات للأمام فقط
- مؤشرات مجموعة المفاتيح
المؤشرات الثابتة
مجموعة النتائج التي يظهرها المؤشر الثابت تكون دائمًا هي نفسها التي كانت عند فتح المؤشر لأول مرة. نظرًا لأن المؤشر الثابت سيقوم بتخزين النتيجة tempdb ، هم دائما يقرأ فقط . يمكننا استخدام المؤشر الثابت للتحرك للأمام والخلف. وعلى النقيض من المؤشرات الأخرى، فهو أبطأ ويستهلك المزيد من الذاكرة. ونتيجة لذلك، لا يمكننا استخدامه إلا عندما يكون التمرير ضروريًا، وعندما تكون المؤشرات الأخرى غير مناسبة.
يعرض هذا المؤشر الصفوف التي تمت إزالتها من قاعدة البيانات بعد فتحها. لا يمثل المؤشر الثابت أية عمليات إدراج أو تحديث أو حذف (ما لم يتم إغلاق المؤشر وإعادة فتحه).
المؤشرات الديناميكية
المؤشرات الديناميكية عكس المؤشرات الثابتة التي تسمح لنا بإجراء عمليات تحديث البيانات وحذفها وإدراجها أثناء فتح المؤشر. إنها قابلة للتمرير بشكل افتراضي . يمكنه اكتشاف جميع التغييرات التي تم إجراؤها على الصفوف والترتيب والقيم في مجموعة النتائج، سواء حدثت التغييرات داخل المؤشر أو خارجه. خارج المؤشر، لا يمكننا رؤية التحديثات حتى يتم الالتزام بها.
المؤشرات للأمام فقط
إنه نوع المؤشر الافتراضي والأسرع بين جميع المؤشرات. يطلق عليه مؤشر للأمام فقط لأنه يتحرك للأمام فقط من خلال مجموعة النتائج . هذا المؤشر لا يدعم التمرير. يمكنه فقط استرداد الصفوف من البداية إلى نهاية مجموعة النتائج. يسمح لنا بإجراء عمليات الإدراج والتحديث والحذف. هنا، يكون تأثير عمليات الإدراج والتحديث والحذف التي أجراها المستخدم والتي تؤثر على الصفوف في مجموعة النتائج مرئيًا عند جلب الصفوف من المؤشر. عند جلب الصف، لا يمكننا رؤية التغييرات التي تم إجراؤها على الصفوف من خلال المؤشر.
يتم تصنيف المؤشرات للأمام فقط إلى ثلاثة أنواع:
شار وكثافة العمليات جافا
- مجموعة المفاتيح Forward_Only
- للأمام_فقط ثابت
- Fast_Forward
المؤشرات التي تعتمد على مجموعة المفاتيح
وظيفة المؤشر هذه يقع بين المؤشر الثابت والديناميكي فيما يتعلق بقدرته على اكتشاف التغييرات. لا يمكنه دائمًا اكتشاف التغييرات في عضوية مجموعة النتائج وترتيبها مثل المؤشر الثابت. يمكنه اكتشاف التغييرات في قيم صفوف مجموعة النتائج مثل المؤشر الديناميكي. لا يمكن إلا الانتقال من الأول إلى الأخير ومن الأخير إلى الصف الأول . يتم إصلاح الطلب والعضوية كلما تم فتح هذا المؤشر.
يتم تشغيله بواسطة مجموعة من المعرفات الفريدة مثل المفاتيح الموجودة في مجموعة المفاتيح. يتم تحديد مجموعة المفاتيح بواسطة كافة الصفوف التي تؤهل عبارة SELECT عند فتح المؤشر لأول مرة. ويمكنه أيضًا اكتشاف أي تغييرات في مصدر البيانات، مما يدعم عمليات التحديث والحذف. إنه قابل للتمرير بشكل افتراضي.
تنفيذ المثال
دعونا ننفذ مثال المؤشر في خادم SQL. يمكننا القيام بذلك عن طريق إنشاء جدول باسم '' أولاً عميل 'باستخدام العبارة أدناه:
CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL );
بعد ذلك، سوف نقوم بإدراج القيم في الجدول. يمكننا تنفيذ العبارة أدناه لإضافة البيانات إلى جدول:
INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California');
يمكننا التحقق من البيانات عن طريق تنفيذ يختار إفادة:
SELECT * FROM customer;
بعد تنفيذ الاستعلام، يمكننا أن نرى الإخراج أدناه حيث لدينا ثمانية صفوف في الجدول:
الآن، سنقوم بإنشاء مؤشر لعرض سجلات العملاء. تشرح مقتطفات الكود أدناه جميع خطوات إعلان المؤشر أو إنشائه من خلال تجميع كل شيء معًا:
باش إذا الشرط
--Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers
بعد تنفيذ المؤشر سنحصل على النتيجة التالية:
حدود مؤشر SQL Server
يحتوي المؤشر على بعض القيود بحيث يجب استخدامه دائمًا فقط عندما لا يكون هناك خيار سوى المؤشر. هذه القيود هي:
- يستهلك المؤشر موارد الشبكة من خلال طلب رحلة ذهابًا وإيابًا عبر الشبكة في كل مرة يقوم فيها بإحضار سجل.
- المؤشر عبارة عن مجموعة من المؤشرات الموجودة في الذاكرة، مما يعني أنه يستهلك بعض الذاكرة التي يمكن أن تستخدمها العمليات الأخرى على أجهزتنا.
- يفرض أقفالًا على جزء من الجدول أو الجدول بأكمله عند معالجة البيانات.
- يكون أداء المؤشر وسرعته أبطأ لأنهما يقومان بتحديث سجلات الجدول صفًا واحدًا في كل مرة.
- المؤشرات أسرع من الحلقات التكرارية، لكنها تحتوي على حمل أكبر.
- يعد عدد الصفوف والأعمدة التي يتم إدخالها إلى المؤشر جانبًا آخر يؤثر على سرعة المؤشر. يشير إلى مقدار الوقت المستغرق لفتح المؤشر وتنفيذ عبارة الجلب.
كيف يمكننا تجنب المؤشرات؟
الوظيفة الرئيسية للمؤشرات هي اجتياز الجدول صفًا تلو الآخر. أسهل طريقة لتجنب المؤشرات موضحة أدناه:
باستخدام SQL أثناء الحلقة
أسهل طريقة لتجنب استخدام المؤشر هي استخدام حلقة while التي تسمح بإدراج مجموعة النتائج في الجدول المؤقت.
وظائف محددة من قبل المستخدم
في بعض الأحيان يتم استخدام المؤشرات لحساب مجموعة الصفوف الناتجة. يمكننا تحقيق ذلك باستخدام وظيفة محددة من قبل المستخدم تلبي المتطلبات.
استخدام الصلات
يعالج الانضمام فقط تلك الأعمدة التي تستوفي الشرط المحدد، وبالتالي يقلل من سطور التعليمات البرمجية التي توفر أداء أسرع من المؤشرات في حالة الحاجة إلى معالجة السجلات الضخمة.