إدارة قواعد البيانات والتحليل الإحصائي, برمجة SAS

كيفية إنشاء جداول في SAS (مع أمثلة)


تُعد بيئة نظام التحليل الإحصائي SAS (Statistical Analysis System) إحدى أكثر المنصات البرمجية رسوخاً وموثوقية في مجالات معالجة البيانات الضخمة، والتحليلات الإحصائية المتقدمة، وذكاء الأعمال عبر مختلف القطاعات الحيوية مثل الرعاية الصحية، والقطاع المالي والمصرفي، والأبحاث الأكاديمية والتطبيقية. ويُمثل الفهم العميق لآليات بناء وهندسة جداول البيانات الركيزة الجوهرية لأي محلل بيانات أو مهندس برمجيات يعمل داخل هذه البيئة؛ إذ إن جودة التحليلات الإحصائية وكفاءة النماذج التنبؤية تعتمدان بصورة مباشرة على سلامة الهيكل الإنشائي لقواعد البيانات وتنسيقها المنطقي والفيزيائي.

تتميز لغة SAS بمرونتها الفائقة في التعامل مع البيانات، حيث تتيح للمطورين مسارين رئيسيين لإنشاء الجداول وإدارتها: المسار التقليدي المتمثل في خطوة البيانات (DATA Step) ذات الطبيعة الإجرائية السطرية، والمسار العلائقي المتقدم المستند إلى لغة الاستعلامات البنيوية عبر إجراء PROC SQL. يجمع هذا التكامل بين القوة التحليلية والسرعة الفائقة في تنفيذ العمليات المعقدة، مما يمنح الممارسين قدرة لا تضاهى على تصميم الهياكل الجدولية، وتطبيق التحويلات الرياضية، وإدراج القيود والمعايير الوصفية بدقة متناهية.

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

1. مقدمة شاملة حول بنية البيانات وتخزين الجداول في بيئة SAS

1.1 مفهوم مجموعات البيانات والجداول في نظام SAS

في لغة SAS، يُستخدم مصطلح “مجموعة بيانات SAS” (SAS Dataset) ومصطلح “الجدول” (Table) بشكل تبادلي في معظم السياقات التحليلية، إلا أن هناك أبعاداً مفاهيمية وهندسية دقيقة تفصل بينهما. يُشير الجدول في البيئات العلائقية القياسية إلى هيكل ثنائي الأبعاد يتكون من صفوف (Rows) تمثل السجلات أو الملاحظات الفردية، وأعمدة (Columns) تمثل المتغيرات أو السمات المقاسة. بينما تُمثل مجموعة بيانات SAS الهيكل التخزيني المتكامل الذي يُديره محرك البيانات الخاص بالنظام، والذي يجمع بين البيانات الفعلية والمعلومات الوصفية المرتبطة بها في ملف موحد يحمل الامتداد .sas7bdat.

تتألف مجموعة بيانات SAS داخلياً من جزأين أساسيين لا ينفصلان: جزء الواصف (Descriptor Portion) وجزء البيانات (Data Portion). يحتوي جزء الواصف على البيانات الوصفية (Metadata) الخاصة بالملف بأكمله، بما في ذلك اسم مجموعة البيانات، وتاريخ ووقت الإنشاء، وآخر تعديل، وعدد الملاحظات، وعدد المتغيرات، بالإضافة إلى سمات كل متغير مثل الاسم، والنوع (عددي أو نصي)، والطول، والتسمية التوضيحية (Label)، وصيغ العرض والإدخال (Formats and Informats). أما جزء البيانات، فيحتوي على القيم الفعلية المخزنة في شكل مصفوفة متتابعة من السجلات.

تكمن أهمية تنظيم البيانات في جداول مهيكلة بدقة في تمكين محركات SAS التحليلية من الوصول السريع والمباشر إلى السجلات أثناء تنفيذ الخوارزميات الإحصائية المتقدمة. يُدير نظام SAS عمليات الإدخال والإخراج عبر طبقة متطورة تُعرف باسم محركات البيانات (Data Engines)، مثل محرك V9 الافتراضي، والتي تتولى إدارة تخصيص الذاكرة المؤقتة (Buffer Management) وتقليل عمليات القراءة والكتابة المادية على الأقراص الصلبة، مما يضمن كفاءة استثنائية عند التعامل مع مجموعات بيانات تتجاوز ملايين السجلات.

1.2 دور إجراء PROC SQL في معالجة وهندسة الجداول

يُمثل إجراء PROC SQL واجهة تنفيذية متكاملة تتيح للمبرمجين ومحللي البيانات تطبيق معايير لغة الاستعلامات البنيوية (ANSI SQL) مباشرة داخل جلسات عمل SAS. يُعد هذا الإجراء جسراً برمجياً يربط بين الفلسفة العلائقية القائمة على معالجة المجموعات (Set-based Processing) والبيئة الإحصائية المتطورة لنظام SAS. من خلال PROC SQL، يمكن للمستخدمين إنشاء الجداول، وتعديل بنيتها، والاستعلام عنها، ودمجها دون الحاجة إلى كتابة خطوات إجرائية متعددة.

تختلف فلسفة المعالجة في PROC SQL جوهرياً عن خطوة البيانات الكلاسيكية (DATA Step). فبينما تعتمد خطوة البيانات على معالجة الملاحظات سجلاً تلو الآخر عبر حلقة تكرارية ضمنية يُديرها متجه برنامج البيانات (Program Data Vector – PDV)، يعتمد PROC SQL على معالجة الجداول كوحدات بيانية متكاملة دفعة واحدة من خلال مُحسِّن استعلامات داخلي يقوم بتحليل الكود وبناء خطة تنفيذ مُثلى تحدد أفضل مسارات استرجاع البيانات ومعالجتها.

يوفر إجراء PROC SQL مرونة فائقة في التعامل مع كل من الجداول المؤقتة اللازمة للتحليلات اللحظية والجداول الدائمة الموجهة للتخزين طويل الأمد. وعلاوة على ذلك، يتيح الإجراء التفاعل المباشر مع قواعد البيانات الخارجية مثل Oracle و SQL Server و PostgreSQL عبر تقنية SAS/ACCESS، مما يُمكّن المهندسين من تنفيذ استعلامات متقدمة وإنشاء الجداول على خوادم قواعد البيانات البعيدة باستخدام نفس الصياغة البرمجية المألوفة.

1.3 المتطلبات الأساسية وبيئة العمل لتنفيذ الشيفرات البرمجية

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

من الركائز الأساسية في بيئة SAS التمييز الدقيق بين مكتبة العمل المؤقتة المدمجة (Work Library) والمكتبات الدائمة المعرفة من قبل المستخدم. تُعد مكتبة Work المستودع الافتراضي المؤقت لأي جدول يتم إنشاؤه دون تحديد مسار صريح؛ ويتميز هذا المستودع بأنه يُحذف بالكامل وبشكل تلقائي بمجرد إنهاء جلسة العمل أو إغلاق البرنامج. في المقابل، تُستخدم المكتبات الدائمة، التي يتم ربطها بمجلدات فيزيائية عبر نظام التشغيل، لضمان استمرارية تخزين الجداول والرجوع إليها في جلسات لاحقة.

تقتضي معايير الجودة والأداء البرمجي في بيئات العمل الاحترافية اتباع أفضل الممارسات عند كتابة الشيفرات. يشمل ذلك استخدام أسماء معبرة وواضحة للجداول والمتغيرات، والتوثيق المنهجي للأكواد عبر التعليقات، والمراقبة المستمرة لنافذة سجل العمليات (SAS Log) للتأكد من خلو التنفيذ من رسائل الخطأ (Errors) أو التحذيرات (Warnings) أو الملاحظات الحرجة (Notes) التي قد تؤثر على دقة وموثوقية النتائج النهائية.

2. الأسس الهيكلية لإنشاء الجداول باستخدام إجراء PROC SQL

2.1 الصيغة العامة لبيان CREATE TABLE

يُعد بيان CREATE TABLE الأداة النحوية الرئيسية داخل إجراء PROC SQL لتعريف وتشييد الجداول الجديدة. يتبع هذا البيان قواعد صارمة محددة في معايير لغة SAS، حيث يبدأ الإجراء بطلب استدعاء PROC SQL; متبوعاً ببيان CREATE TABLE واسم الجدول المراد إنشاؤه، ثم تحديد الخصائص الهيكلية للجدول سواء بتعريف الأعمدة يدوياً أو باشتقاقها من استعلام SELECT، ويُختتم الإجراء بالبيان الإنهائي QUIT; الذي يحرر الموارد ويغلق بيئة SQL التفاعلية.

تخضع تسمية الجداول والأعمدة في SAS لقواعد معيارية دقيقة؛ إذ يجب ألا يتجاوز طول الاسم 32 محرفاً، ويجب أن يبدأ بحرف أبجدي إنجليزي أو شرطة سفلية (_)، على أن تتكون بقية المحارف من أحرف أو أرقام أو شرطات سفلية فقط، مع تجنب استخدام المسافات أو الرموز الخاصة إلا في حال تفعيل خيار الأسماء الممتدة (VALIDVARNAME=ANY). ويُعد الالتزام بهذه القواعد أمراً حيوياً لضمان توافق الجداول مع كافة الإجراءات الإحصائية الأخرى في النظام.

تتميز لغة SAS باعتماد الفاصلة المنقوطة (;) كعلامة حتمية لإنهاء كل جملة برمجية. وفي سياق PROC SQL، فإن إغفال الفاصلة المنقوطة يؤدي إلى أخطاء تركيبية تمنع تنفيذ الاستعلام. وعند إرسال الكود للمعالجة، يقوم مترجم SAS بفحص البنية النحوية وتوليد تقرير فوري في نافذة سجل العمليات (SAS Log) يوضح نجاح إنشاء الجدول، وعدد الأعمدة التي تم تعريفها، والمساحة التخزينية المستهلكة، مما يوفر وسيلة موثوقة للتحقق الفوري من سلامة البناء الهيكلي.

2.2 أنواع البيانات الأولية المدعومة في جداول SAS عبر SQL

على خلاف أنظمة إدارة قواعد البيانات العلائقية الأخرى التي تدعم عشرات الأنواع المتباينة من البيانات، يعتمد محرك البيانات الأساسي في SAS على نوعين رئيسيين فقط من البيانات الأولية: البيانات العددية (Numeric) والبيانات النصية (Character). عند استخدام إجراء PROC SQL، يتم تعيين وتفسير أنواع بيانات SQL القياسية تلقائياً وربطها بهذين النوعين الأساسيين لضمان التوافق الداخلي للنظام.

تُخزن المتغيرات العددية (NUMERIC) في SAS باستخدام تمثيل النقطة العائمة ذي الدقة المزدوجة وفق معيار IEEE (Double-precision floating-point format)، مما يمنحها حجماً افتراضياً قدره 8 بايت. يتيح هذا التنسيق تخزين الأرقام الصحيحة والكسور العشرية بدقة تصل إلى ما بين 16 إلى 17 رقماً معنوياً. تندرج أنواع SQL العددية مثل INTEGER و SMALLINT و DECIMAL و FLOAT جميعها تحت المظلة العددية العامة في SAS بمجرد تخزينها في الجدول.

أما المتغيرات النصية (CHARACTER أو CHAR)، فتُستخدم لتخزين سلاسل المحارف والرموز والأرقام التي لا تدخل في العمليات الحسابية (مثل أرقام الهواتف أو الرموز البريدية). يتطلب تعريف العمود النصي تحديد طوله الأقصى من المحارف، مثل CHAR(20)، حيث يخصص النظام مساحة بايت واحد لكل محرف وفق نظام الترميز المستخدم. وتجدر الإشارة إلى أن التواريخ والأوقات في SAS ليست نوعاً منفصلاً من البيانات، بل هي في الحقيقة متغيرات عددية تمثل عدد الأيام المنقضية منذ الأول من يناير عام 1960، ويتم عرضها بصيغ زمنية مفهومة عبر التنسيقات المخصصة.

2.3 السمات المتقدمة للأعمدة: التسميات والتنسيقات

يتيح إجراء PROC SQL للمطورين إمكانية إثراء البنية الهيكلية للجداول عبر إرفاق سمات متقدمة بكل عمود أثناء مرحلة الإنشاء، مما يرفع من القيمة الوصفية للبيانات ويسهل تفسيرها واستعراضها في التقارير الإحصائية. تشمل هذه السمات التسميات الوصفية (Labels)، وصيغ العرض (Formats)، وصيغ الإدخال (Informats)، بالإضافة إلى التحكم الدقيق في الطول التخزيني (Length).

تُستخدم سمة LABEL لتعيين وصف نصي مطول للعمود يصل إلى 256 محرفاً، مما يحل مشكلة قيود أسماء المتغيرات المختصرة؛ فعلى سبيل المثال، يمكن تسمية المتغير emp_sal وإرفاق تسمية وصفية له تقول: “الراتب الشهري الأساسي للموظف بالدولار”. تُعرض هذه التسميات تلقائياً في التقارير الإحصائية والمخرجات الجرافيكية الناتجة عن إجراءات مثل PROC PRINT و PROC REPORT، مما يلغي الحاجة إلى إعادة تسمية الأعمدة يدوياً عند إعداد الوثائق النهائية.

أما سمتي FORMAT و INFORMAT، فهما المسؤولتان عن تحديد كيفية قراءة البيانات وتفسيرها وكيفية عرضها للمستخدم النهائي دون تغيير القيمة الرقمية الأساسية المخزنة في القرص الصلب. على سبيل المثال، يضمن تطبيق التنسيق DOLLAR12.2 عرض القيم العددية مع رمز العملة والفواصل العشرية، بينما يضمن التنسيق DATE9. عرض الأرقام الزمنية بصيغة تقويمية مقروءة مثل 01JAN2025. يُسهم ضبط هذه السمات الهيكلية مبكراً في الحفاظ على اتساق البيانات وجودتها التنظيمية عبر كامل مسار المعالجة التحليلية.

3. الطريقة الأولى: إنشاء جدول فارغ من البداية (Create Table from Scratch)

create table in SAS
create table in SAS

3.1 بناء الهيكل الإنشائي للجدول وتحديد الأعمدة

يُمثل إنشاء جدول فارغ تماماً الخطوة الأولى الكلاسيكية في تصميم قواعد البيانات داخل SAS عندما يتطلب المشروع بناء مخطط بيانات (Schema) مخصص قبل استقبال المدخلات أو تدفقات السجلات الخارجية. يتم هذا الإجراء عبر تعريف أسماء الأعمدة، وأنواعها، ومحددات أطوالها بدقة داخل قوسي بيان CREATE TABLE دون ربطه بأي استعلام استرجاع خارجي.

لتوضيح ذلك بمثال عملي وتطبيقي، لنفترض أننا بصدد إنشاء جدول إحصائي لمتابعة أداء الفرق الرياضية في دوري كرة السلة، حيث يتضمن الجدول اسم الفريق (team)، وإجمالي النقاط المسجلة (points)، وإجمالي المرتدات الدفاعية والهجومية (rebounds). يتم كتابة الكود البرمجي باستدعاء PROC SQL، ثم صياغة الجملة CREATE TABLE basketball_stats (team char(20), points num, rebounds num); ثم إنهاء الإجراء ببيان QUIT;. يقوم هذا الأمر بتأسيس الهيكل الوصفي للجدول في الذاكرة وتخصيص جزء الواصف الخاص به دون تخصيص مساحة للسجلات بعد.

عقب إرسال هذا الأمر للتنفيذ، يتوجب على المحلل مراجعة نافذة السجل (SAS Log) بعناية؛ حيث سيقوم النظام بطباعة ملاحظة تأكيدية تفيد بنجاح إنشاء الجدول WORK.BASKETBALL_STATS واحتوائه على 3 أعمدة و 0 صفوف. يُعد هذا التأكيد دليلاً قاطعاً على سلامة الصياغة النحوية وموافقة النظام على إنشاء الكيان الهيكلي الجديد في بيئة التخزين المؤقتة.

3.2 إدارة القيود والمحددات أثناء التصميم الأولي

تتطلب مرحلة التصميم الأولي للجداول اتخاذ قرارات حاسمة تتعلق بتحديد قيود السعة التخزينية لكل عمود، وتحديداً الأعمدة النصية. عند تعريف عمود نصي مثل CHAR(10)، يتم حجز 10 بايتات لكل سجل بشكل ثابت في جزء البيانات؛ فإذا كانت النصوص المدخلة أقصر من 10 محارف، يقوم النظام بملء المساحة المتبقية بمسافات فارغة (Trailing Blanks)، أما إذا كانت النصوص أطول، فسيحدث اقتطاع قسري للبيانات (Data Truncation) يؤدي إلى فقدان الأحرف الزائدة.

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

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

3.3 التحقق من هيكل الجدول الفارغ عبر الإجراءات الوصفية

بعد إنشاء الجدول الفارغ، تبرز الحاجة التقنية للتحقق من دقته الهيكلية والتأكد من مطابقة المتغيرات للمواصفات التصميمية الموضوعة قبل الانتقال إلى مرحلة تغذيته بالبيانات. توفر بيئة SAS أدوات متعددة لتشخيص وقراءة جزء الواصف الخاص بالجداول، يأتي في مقدمتها إجراء المحتويات الشهير PROC CONTENTS وبيان DESCRIBE TABLE الداخلي في SQL.

يمكن تنفيذ إجراء فحص المحتويات بكتابة الكود التالي: PROC CONTENTS DATA=basketball_stats; RUN;. يُنتج هذا الإجراء تقريراً تحليلياً مفصلاً يشتمل على اسم الجدول، والمكتبة التابع لها، ونوع نظام الملفات، وعدد المتغيرات (3)، وعدد الملاحظات (0)، بالإضافة إلى جدول هجائي يستعرض أسماء الأعمدة، وأنواعها، وأطوالها التخزينية، وأي سمات وصفية مرتبطة بها، مما يتيح للمطور مراجعة معمارية الجدول بصرياً والتأكد من خلوها من أي عيوب.

كذلك يوفر إجراء PROC SQL أداة مباشرة فائقة الكفاءة تتمثل في بيان DESCRIBE TABLE basketball_stats;. عند تنفيذ هذا البيان، يقوم محرك SQL بطباعة الصياغة البرمجية الكاملة للجدول في نافذة السجل بالصيغة القياسية لإنشاء الجداول، مما يمنح المبرمج وسيلة فورية للتأكد من أن الجدول مهيأ تماماً وبشكل صحيح لاستقبال عمليات الإدراج دون أي تعارضات بنائية.

4. تغذية الجداول المنشأة بالبيانات عبر عبارة INSERT INTO

4.1 إدراج السجلات الفردية والمتعددة باستخدام بند VALUES

بمجرد إنشاء الهيكل الأساسي للجدول، تصبح الخطوة التالية هي ملء هذا الهيكل بالبيانات الفعلية. يُوفر إجراء PROC SQL عبارة INSERT INTO المقترنة ببند VALUES كأداة قياسية لإضافة السجلات والصفوف إلى الجداول القائمة، سواء كان الإدراج يتم على مستوى سجل فردي في كل معاملة أو عبر إدراج دفعات متعددة من السجلات في خطوة تنفيذية واحدة.

يتميز إدراج السجلات المتعددة دفعة واحدة بكفاءته العالية وتوفيره للوقت الحوسبي؛ حيث يقوم المطور بكتابة عبارة INSERT INTO basketball_stats VALUES (‘Mavs’, 98, 45) VALUES (‘Hawks’, 105, 42) VALUES (‘Hornets’, 92, 38) VALUES (‘Lakers’, 114, 51) VALUES (‘Warriors’, 120, 49); متبوعة بالفاصلة المنقوطة. تتطلب هذه العملية مطابقة دقيقة ومباشرة بين ترتيب القيم المدخلة وترتيب الأعمدة المعرفة في هيكل الجدول الأصلي، مع وضع النصوص والتواريخ الحرفية بين علامات تنصيص مفردة أو مزدوجة وكتابة الأرقام مجردة.

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

4.2 معالجة القيم المفقودة (Missing Values) أثناء الإدخال

تُعد معالجة البيانات غير المكتملة أو المفقودة (Missing Data) أحد التحديات الجوهرية في إدارة قواعد البيانات الإحصائية. يمتلك نظام SAS منهجية متكاملة وفريدة للتعامل مع القيم المفقودة تعتمد على نوع البيانات الأساسي للعمود المستهدف أثناء تنفيذ عبارة INSERT INTO.

بالنسبة للأعمدة العددية، يتم تمثيل القيمة المفقودة برمز النقطة (.) داخل بند VALUES، ويُعاملها النظام كقيمة عددية أصغر من أي رقم حقيقي سالب عند إجراء عمليات الترتيب والمقارنة. أما بالنسبة للأعمدة النصية، فيتم تمثيل القيمة المفقودة بسلسلة نصية فارغة تُكتب في صورة علامتي تنصيص متتاليتين دون مسافة بينهما (”) أو بمسافة مفردة (‘ ‘)، حيث يفسرها النظام كمحارف خالية من المحتوى.

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

4.3 استعراض والتحقق من صحة البيانات المدرجة

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

تتمثل الطريقة الأكثر شيوعاً داخل PROC SQL في استخدام استعلام الاسترجاع البسيط: SELECT * FROM basketball_stats;. يقوم هذا الاستعلام بسحب كافة الأعمدة والصفوف المخزنة وعرضها في نافذة النتائج (Results Window) في شكل جدول إلكتروني منسق، مما يسمح للمحلل بفحص السجلات والتأكد من مطابقة الإحصائيات الخاصة بكل فريق رياضي مع المدخلات المستهدفة.

إلى جانب استعلامات SQL، يمكن استخدام إجراء الطباعة الكلاسيكي PROC PRINT عبر الكود: PROC PRINT DATA=basketball_stats NOOBS; RUN;، حيث يُلغي خيار NOOBS ترقيم الملاحظات الافتراضي لتوفير مخرجات بصرية أنيقة وسهلة القراءة. تضمن هذه الخطوة التحققية اكتمال دورة حياة إنشاء وتغذية الجدول بنجاح قبل الانتقال إلى خطوات المعالجة والتحليل اللاحقة.

5. الطريقة الثانية: إنشاء جدول مشتق استناداً إلى بيانات موجودة مسبقاً (CTAS)

5.1 بناء الجداول عبر أسلوب CREATE TABLE AS SELECT

يُعد أسلوب إنشاء الجداول كاستعلام استرجاعي والمعروف اختصاراً بـ CTAS (Create Table As Select) إحدى أقوى وأسرع التقنيات البرمجية المتاحة في هندسة البيانات داخل بيئة SAS. يتيح هذا النمط للمطورين استنساخ الجداول القائمة، أو إنشاء جداول فرعية جديدة مشتقة، في خطوة برمجية واحدة تدمج بين إنشاء الهيكل وتعبئته بالبيانات المعالجة بصورة متزامنة وتلقائية.

تكمن قوة هذا الأسلوب في قدرته على استخلاص البيانات من جدول مصدر، وإجراء العمليات الحسابية والتحويلية عليها، وحفظ النتيجة النهائية في جدول جديد مستقر دون الحاجة إلى تعريف مسبق للأعمدة أو استخدام عبارات الإدراج اليدوية. على سبيل المثال، يمكن إنشاء نسخة طبق الأصل من جدول إحصائيات الفرق الرياضية باستخدام الكود: CREATE TABLE basketball_copy AS SELECT * FROM basketball_stats;، حيث يتولى محرك SQL تلقائياً استنساخ كافة السمات الوصفية، والأنواع، والأطوال، والبيانات من الجدول الأصلي إلى الجدول الجديد.

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

5.2 إنشاء أعمدة حسابية ومشتقة أثناء بناء الجدول

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

لإيضاح ذلك، لنفترض أننا نرغب في إنشاء جدول جديد يشتمل على مؤشر تحليلي يحسب “معدل النقاط لكل مرتدة” (Points per Rebound) لكل فريق رياضي. يتم صياغة الاستعلام باستخدام التعبير الرياضي المباشر: CREATE TABLE team_metrics AS SELECT team, points, rebounds, (points / rebounds) AS pts_per_reb FORMAT=6.2 FROM basketball_stats;. تقوم الكلمة المفتاحية AS بتسمية العمود المشتق الجديد، بينما يضمن تطبيق التنسيق FORMAT=6.2 عرض النتيجة برقمين عشريين منسقين.

يتيح PROC SQL أيضاً تطبيق كافة دوال SAS القياسية الرياضية، والنصية، والإحصائية، والزمنية داخل استعلام البناء، مثل دوال SUM, MEAN, LOG, SUBSTR, SCAN, TODAY وغيرها. يقوم النظام باستنتاج نوع البيانات وطول العمود الناتج تلقائياً بناءً على مخرجات المعادلة الحسابية، مما يوفر مرونة استثنائية في بناء المتغيرات التنبؤية والمؤشرات المركبة المعقدة في خطوة واحدة فائقة الإحكام.

5.3 إعادة هيكلة الأعمدة وإسقاط المتغيرات غير المطلوبة

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

يسمح أسلوب CTAS بالاختيار الانتقائي للأعمدة وترتيبها داخل عبارة SELECT؛ فالأعمدة تظهر في الجدول الجديد بنفس الترتيب الذي كُتبت به في الاستعلام، مما يُمكّن المبرمج من إعادة تنظيم بنية الجدول بسهولة تامة. علاوة على ذلك، يمكن استخدام خيارات مجموعات بيانات SAS المتقدمة مثل DROP= و KEEP= مباشرة بجانب اسم الجدول المستهدف لتحديد المتغيرات المضمنة أو المستبعدة بدقة متناهية.

على سبيل المثال، يتيح تنفيذ الكود: CREATE TABLE basketball_summary(DROP=rebounds) AS SELECT team, points, rebounds FROM basketball_stats; استخدام عمود المرتدات أثناء المعالجة الحسابية ثم إسقاطه نهائياً من الهيكل الفيزيائي للجدول الناتج. تضمن هذه المرونة المعمارية تصميم جداول نهائية مدمجة تلبي المعايير الدقيقة لقواعد البيانات المهيأة للأبحاث والنمذجة الإحصائية المتقدمة.

6. تطبيق التصفية والفرز والتجميع أثناء إنشاء الجداول

6.1 تصفية الصفوف باستخدام عبارة WHERE

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

تستند عبارة WHERE إلى منطق بولين (Boolean Logic)، وتدعم باقة واسعة من العوامل المقارنة مثل المساواة (=)، وعدم المساواة (^= أو <>)، والمدى BETWEEN … AND، ومطابقة القوائم IN، والبحث النصي النمطي LIKE، بالإضافة إلى الروابط المنطقية AND و OR و NOT. على سبيل المثال، لإنشاء جدول يحتوي فقط على الفرق الهجومية القوية التي تجاوزت نقاطها حاجز 100 نقطة، نستخدم الكود: CREATE TABLE high_scoring_teams AS SELECT team, points, rebounds FROM basketball_stats WHERE points > 100;.

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

6.2 فرز البيانات داخل الجدول الجديد عبر ORDER BY

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

تُستخدم عبارة ORDER BY داخل استعلام بناء الجداول لفرز الملاحظات المخزنة تصاعدياً ASC (وهو الخيار الافتراضي) أو تنازلياً DESC بناءً على عمود واحد أو عدة أعمدة متتالية. فعلى سبيل المثال، يمكن إنشاء جدول لترتيب الفرق الرياضية تنازلياً حسب نقاطها المسجلة، وعند تساوي النقاط يتم الترتيب تصاعدياً حسب اسم الفريق، عبر الكود: CREATE TABLE ranked_teams AS SELECT * FROM basketball_stats ORDER BY points DESC, team ASC;.

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

6.3 تلخيص وتجميع البيانات عبر GROUP BY و HAVING

يُعد تلخيص البيانات وحساب المؤشرات التجميعية من أهم مراحل هندسة البيانات التحليلية لنقل مستوى التحليل من السجلات الفردية الدقيقة إلى مستوى الفئات والمجموعات الإحصائية الشاملة. توفر لغة SQL في SAS عبارة GROUP BY لإجراء التجميعات الفئوية مقترنة بالدوال التجميعية القياسية مثل SUM, AVG, COUNT, MIN, MAX, STD.

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

لتوضيح ذلك، لنفترض وجود جدول يتضمن مؤتمرات الفرق الرياضية (Conferences) ونرغب في بناء جدول يوضح إجمالي النقاط ومعدل المرتدات لكل مؤتمر، بشرط ألا يتضمن الجدول النهائي إلا المؤتمرات التي يتجاوز متوسط نقاط فرقها 100 نقطة؛ يتم صياغة الاستعلام كالتالي: CREATE TABLE conf_summary AS SELECT conference, COUNT(team) AS total_teams, SUM(points) AS conf_points, AVG(rebounds) AS avg_rebounds FROM basketball_all GROUP BY conference HAVING AVG(points) > 100;. يُنتج هذا الاستعلام جدولاً مدمجاً عالي القيمة الإحصائية يلخص الأداء العام بأسلوب تحليلي محكم.

7. دمج وربط الجداول المتعددة لإنشاء جداول مركبة

7.1 الربط الداخلي (INNER JOIN) في إنشاء الجداول

في قواعد البيانات العلائقية وأنظمة مستودعات البيانات المؤسسية، نادراً ما توجد كافة البيانات التحليلية في جدول واحد منعزل؛ بل تكون موزعة عبر جداول متعددة مرتبطة بمفاتيح تعريفية مشتركة (Common Keys). يُعد الربط الداخلي INNER JOIN الآلية الأساسية لدمج السجلات من جدولين أو أكثر استناداً إلى تطابق تام في قيم المفاتيح المحددة.

عند بناء جدول مركب باستخدام الربط الداخلي، يتم استدعاء عبارة CREATE TABLE AS SELECT مع تحديد مصادر البيانات واستخدام بند ON لتعريف شرط التطابق بين المفاتيح، مع تجنب الصيغ القديمة التي تدمج الجداول في بند FROM وتضع الشروط في بند WHERE لتفادي الوقوع في خطأ الجداء الديكارتي (Cartesian Product) الذي يؤدي إلى تضخم السجلات واستهلاك الذاكرة.

على سبيل المثال، لدمج جدول إحصائيات الفرق basketball_stats مع جدول معلومات المدربين team_coaches الذي يحتوي على عمودي اسم الفريق team واسم المدرب coach_name، نكتب الكود التالي: CREATE TABLE team_full_info AS SELECT a.team, a.points, a.rebounds, b.coach_name FROM basketball_stats AS a INNER JOIN team_coaches AS b ON a.team = b.team;. يُنتج هذا الربط جدولاً جديداً يشتمل فقط على الفرق التي تمتلك سجلات مطابقة في كلا الجدولين، مما يضمن تكامل البيانات واتساقها التحليلي.

7.2 الربط الخارجي (LEFT, RIGHT, FULL OUTER JOIN)

تتطلب السيناريوهات التحليلية في كثير من الأحيان الاحتفاظ بسجلات معينة حتى وإن لم تكن تمتلك قيماً مطابقة في الجداول المقابلة. هنا تبرز أهمية أنواع الربط الخارجي المتقدمة: الربط الخارجي الأيسر (LEFT JOIN)، والربط الخارجي الأيمن (RIGHT JOIN)، والربط الخارجي الكامل (FULL OUTER JOIN).

يضمن LEFT JOIN الاحتفاظ بكافة الملاحظات القادمة من الجدول الأيسر بالكامل، وجلب القيم المتطابقة من الجدول الأيمن؛ وفي حال عدم وجود تطابق للقيم، يقوم محرك SAS تلقائياً بتعبئة أعمدة الجدول الأيمن بقيم مفقودة (. للأرقام و ” للنصوص). أما FULL JOIN، فيقوم بدمج كافة الملاحظات من كلا الجدولين مع وضع قيم مفقودة في أي موقع يفتقر إلى التطابق، مما يوفر سجلاً شاملاً لا يستثني أي كيان تحليلي.

تتجلى الأهمية التطبيقية للربط الخارجي في تشخيص الثغرات والبيانات الناقصة في خطوط المعالجة؛ حيث يمكن بناء جدول للفرق التي تفتقر إلى تعيين مدربين عبر استعلام LEFT JOIN متبوعاً بشرط WHERE b.coach_name IS MISSING. تُمكّن هذه الاستراتيجيات الهندسية المطورين من بناء قواعد بيانات متسقة ومرنة قادرة على التعامل مع الطبيعة المعقدة للبيانات الواقعية.

7.3 دمج الجداول عمودياً عبر عمليات المجموعات (UNION)

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

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

علاوة على ذلك، يتيح SAS استخدام المعامل الإضافي CORR (Corresponding) مع عمليات المجموعات، مثل UNION CORR، والذي يوجه المحرك إلى مطابقة الأعمدة استناداً إلى أسمائها الحرفية فقط بدلاً من مطابقتها بناءً على موقعها الترتيبي في الاستعلام، مع إمكانية إسقاط الأعمدة غير المشتركة تلقائياً. يمثل هذا التنوع أداة معمارية حاسمة لتوحيد البيانات الدورية الشهرية أو السنوية في جداول تاريخية مركزية متكاملة.

8. مقارنة متقدمة: إنشاء الجداول عبر PROC SQL مقابل خطوة البيانات (DATA Step)

8.1 إنشاء الجداول في خطوة البيانات (DATA Step) الكلاسيكية

تُمثل خطوة البيانات DATA Step القلب النابض التاريخي لنظام SAS والعمود الفقري لمعالجة الملفات في البيئات الإحصائية. تعتمد خطوة البيانات على معمارية معالجة برمجية فريدة تُعرف باسم “متجه برنامج البيانات” (Program Data Vector – PDV)، وهو منطقة ذاكرة مؤقتة تستقبل وتُعالج البيانات سجلاً تلو الآخر عبر حلقة تكرارية ضمنية تستمر حتى نهاية الملف.

يتم إنشاء الجداول في خطوة البيانات إما بإدخال البيانات الخام المباشرة باستخدام عبارات CARDS أو DATALINES، أو باستنساخ وتعديل مجموعات البيانات الموجودة عبر تعليمة SET. على سبيل المثال، يمكن إنشاء نفس جدول إحصائيات الفرق الرياضية بكتابة: DATA basketball_ds; INPUT team $ points rebounds; DATALINES; Mavs 98 45 Hawks 105 42 ; RUN;. يوضح هذا الكود الطبيعة السطرية الإجرائية لخطوة البيانات مقارنة بالطبيعة التصريحية التجميعية لعبارات SQL.

تتميز خطوة البيانات بقدراتها المتقدمة في التحكم الدقيق في تدفق السجلات وتخصيص المتغيرات المؤقتة، والتعامل مع المصفوفات متعددة الأبعاد (Arrays)، وتنفيذ شروط التكرار والحلقات المعقدة عبر أوامر DO LOOPS، مما يمنح المبرمج تحكماً كاملاً في كل عملية حسابية تتم على مستوى كل صف داخل الجدول أثناء بنائه.

8.2 تحليل الأداء والكفاءة الحاسوبية (Performance Benchmark)

تُعد المفاضلة بين PROC SQL و DATA Step من أكثر المواضيع نقاشاً بين مهندسي البيانات في بيئة SAS، حيث يتفوق كل أسلوب في سياقات هندسية محددة اعتماداً على بنية البيانات ونوع المعالجة المطلوبة، واستهلاك الذاكرة العشوائية (RAM)، وحجم عمليات الإدخال والإخراج المادية (Disk I/O).

تتفوق خطوة البيانات (DATA Step) بشكل ساحق عند تنفيذ المعالجات السطرية التكرارية، وحساب الفروق الزمنية بين الصفوف المتتالية عبر دوال مثل LAG و LEAD، وعند قراءة ومعالجة الملفات النصية غير المهيكلة. كما تتميز بانخفاض استهلاك الذاكرة في العمليات البسيطة؛ لأنها تقرأ وتكتب سجلاً واحداً في الذاكرة في كل لحظة، مما يحمي النظام من نفاد موارد الذاكرة عند معالجة ملفات عملاقة.

في المقابل، يتفوق إجراء PROC SQL تفوقاً كبيراً في عمليات الربط المعقدة متعددة الأطراف (Many-to-Many Merges)، وتنفيذ الاستعلامات الفرعية المتداخلة (Subqueries)، وتلخيص البيانات الفئوية في خطوة واحدة دون الحاجة إلى فرز مسبق للبيانات. يرجع هذا التفوق إلى امتلاك PROC SQL لمُحسّن استعلامات ذكي يختار أفضل خوارزميات الربط (مثل Hash Joins أو Sort-Merge Joins) بناءً على أحجام الجداول المتاحة في الذاكرة.

8.3 معايير الاختيار الهندسي بين الأسلوبين في المشاريع الضخمة

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

في الفرق التحليلية التي تضم مهندسين ذوي خلفيات تقنية متنوعة في لغات SQL وقواعد البيانات العلائقية، يُفضل استخدام PROC SQL لتقليل منحنى التعلم وتسهيل ترحيل الأكواد والاستعلامات من وإلى منصات إدارة قواعد البيانات الضخمة مثل Teradata و Snowflake و Oracle. كما أن الصياغة التصريحية لـ SQL تجعل الكود أكثر إيجازاً وقابلية للقراءة عند إجراء التحويلات التجميعية وعمليات الفلترة والربط المعقدة.

ومع ذلك، تعتمد خطوط الأنابيب البرمجية الأكثر كفاءة في المشاريع الضخمة على نهج هجين (Hybrid Approach) يجمع بين القوتين؛ حيث يتم توظيف PROC SQL لإجراء عمليات الربط والتلخيص الأولي من مصادر البيانات المتعددة، ثم تمرير الجداول الناتجة إلى خطوة DATA Step لتطبيق القواعد الإجرائية المعقدة والحسابات الرياضية السطرية المتقدمة، مما يحقق أقصى درجات الكفاءة والمرونة المعمارية.

9. إدارة الجداول المؤقتة والجداول الدائمة عبر مكتبات SAS (Libraries)

9.1 التعامل مع مكتبة العمل المؤقتة Work

تُعد مكتبة Work المساحة التخزينية الافتراضية الأكثر استخداماً داخل جلسات SAS اليومية؛ حيث يُخزن فيها أي جدول يتم إنشاؤه باسم أحادي المستوى (مثل basketball_stats بدلاً من mylib.basketball_stats). تُدار هذه المكتبة في مسار مادي مؤقت يُخصصه نظام التشغيل لكل جلسة عمل SAS مستقلة.

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

ومع ذلك، يجب على مهندسي البيانات مراقبة المساحة المتاحة في مكتبة Work بعناية، خصوصاً عند التعامل مع مجموعات بيانات ضخمة (Big Data)؛ إذ إن تراكم الجداول المؤقتة غير المحذوفة قد يؤدي إلى استهلاك كامل المساحة المخصصة لقرص النظام المؤقت، مما يتسبب في توقف تنفيذ العمليات البرمجية وانهيار الجلسة التحليلية.

9.2 إنشاء جداول دائمة باستخدام تعليمة LIBNAME

لحفظ الجداول بصورة دائمة وضمان إمكانية استرجاعها واستخدامها عبر جلسات عمل متعددة أو مشاركتها مع مستخدمين آخرين على شبكة المؤسسة، يجب ربط وتخزين الجداول داخل مكتبات SAS دائمة باستخدام تعليمة LIBNAME.

تقوم تعليمة LIBNAME بتعيين اسم مرجعي للمكتبة (Libref) لا يتجاوز 8 محارف، وربطه بمسار فيزيائي على نظام الملفات (مثل مجلد على الخادم أو القرص الصلب). يتم كتابة التعليمة كالتالي: LIBNAME mylib ‘/data/analytics/project/’;. بمجرد تنفيذ هذا الربط، يمكن إنشاء جدول دائم باستخدام التسمية ثنائية المستوى (Two-level Name) عبر الكود: CREATE TABLE mylib.permanent_teams AS SELECT * FROM basketball_stats;.

يتم حفظ هذا الجدول على القرص الصلب كملف مادي يحمل اسم permanent_teams.sas7bdat داخل المسار المحدد. يتميز هذا التنسيق التخزيني بالأمان والتكامل الهيكلي المرتفع، والقدرة على استيعاب الفهارس والسمات الوصفية، مع إمكانية تشفير الملف وحمايته بكلمات مرور لمنع الوصول غير المصرح به وضمان الالتزام بمعايير أمن البيانات المؤسسية.

9.3 إدارة وصيانة مساحات التخزين ومسح الجداول

تقتضي إدارة قواعد البيانات في بيئات العمل الاحترافية الحفاظ المستمر على نظافة المكتبات التخزينية ومسح الجداول المؤقتة أو التالفة دورياً لتحرير الموارد التخزينية وتجنب تجاوز الحصص المخصصة (Disk Quotas).

يتيح إجراء PROC SQL حذف الجداول غير الضرورية بشكل مباشر وسريع عبر استخدام بيان DROP TABLE، مثل: DROP TABLE basketball_copy, temp_metrics;. يقوم هذا الأمر بحذف جزء الواصف وجزء البيانات للملفات المحددة فوراً وتحرير مساحتها على القرص.

إلى جانب ذلك، يوفر إجراء إدارة مجموعات البيانات PROC DATASETS أداة إدارية شاملة ومتقدمة لصيانة المكتبات بأكملها؛ حيث يُمكّن مسؤولي قواعد البيانات من حذف مجموعات كاملة من الجداول، أو إعادة تسميتها، أو تعديل سماتها الوصفية دون الحاجة إلى إعادة قراءة أو معالجة البيانات الفعلية، مما يجعله الإجراء القياسي المعتمد لصيانة وإدارة البنية التحتية التخزينية في SAS.

10. تعديل هياكل الجداول القائمة وإدارتها بعد الإنشاء

10.1 إضافة وتعديل الأعمدة عبر ALTER TABLE

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

يدعم بيان ALTER TABLE ثلاثة إجراءات هيكلية رئيسية: إضافة أعمدة جديدة عبر بند ADD، وتعديل سمات الأعمدة القائمة عبر بند MODIFY، وحذف أعمدة محددة من الهيكل عبر بند DROP. على سبيل المثال، لإضافة عمود جديد يمثل المؤتمر الرياضي وتعديل طول عمود اسم الفريق في جدولنا القائم، نكتب الكود التالي: ALTER TABLE basketball_stats ADD conference char(10) MODIFY team char(30);.

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

10.2 تحديث قيم البيانات داخل الجدول باستخدام UPDATE

إلى جانب التعديلات الهيكلية على الأعمدة، تبرز الحاجة المستمرة لتعديل وتحديث القيم المخزنة داخل خلايا محددة في الجدول استجابة للمتغيرات والمعاملات الجديدة. يُوفر إجراء PROC SQL بيان UPDATE لتنفيذ هذه المهمة بدقة متناهية.

يرتبط بيان UPDATE ببند SET لتحديد الأعمدة المراد تغيير قيمها، متبوعاً بحتمية استخدام عبارة WHERE لتحديد الصفوف المستهدفة بدقة. إن إغفال عبارة WHERE يؤدي إلى تطبيق التعديل بشكل كارثي على كافة صفوف الجدول بلا استثناء. على سبيل المثال، لتحديث نقاط فريق Lakers عقب انتهاء مباراة جديدة، نكتب: UPDATE basketball_stats SET points = points + 15 WHERE team = ‘Lakers’;.

علاوة على ذلك، يدعم بيان UPDATE في SAS التحديثات الديناميكية المركبة بالاعتماد على استعلامات فرعية مترابطة (Correlated Subqueries)، حيث يمكن سحب القيم الجديدة مباشرة من جداول وسيطة أخرى وتحديث الجدول الرئيسي استناداً إلى تطابق مفاتيح التعريف، مما يجعله أداة محورية في الحفاظ على تحديث واستقرار مستودعات البيانات المؤسسية.

10.3 حذف سجلات محددة عبر بيان DELETE FROM

تُمثل تصفية وحذف السجلات القديمة، أو المعيبة، أو الملغاة خطوة أساسية في إدارة دورة حياة البيانات داخل الجداول المؤسسية. يوفر إجراء PROC SQL بيان DELETE FROM كأداة قياسية لحذف صفوف محددة بناءً على معايير منطقية مشروطة.

يتبع بيان الحذف الصياغة النحوية التالية: DELETE FROM basketball_stats WHERE rebounds < 40;. يقوم هذا الأمر بفحص سجلات الجدول وحذف أي فريق يسجل مرتدات تقل عن 40 مرتدة، مع الإبقاء على باقي السجلات سليمة دون المساس بالهيكل الإنشائي العام للجدول.

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

11. استكشاف الأخطاء الشائعة وحلولها عند إنشاء الجداول في SAS

11.1 أخطاء عدم تطابق أنواع البيانات والتحويل التلقائي

يُعد عدم تطابق أنواع البيانات (Type Mismatch) أحد أكثر الأخطاء الشائعة التي يواجهها مبرمجو SAS، ويحدث ذلك عند محاولة إسناد قيم نصية إلى أعمدة تم تعريفها كأعمدة عددية، أو العكس، سواء أثناء تنفيذ عبارات INSERT INTO أو خلال عمليات الربط والتجميع المشتقة.

عند حدوث هذا التعارض، يحاول محرك SAS في بعض الحالات إجراء ما يُعرف بـ “التحويل الضمني” (Implicit Type Conversion)، حيث يقوم النظام تلقائياً بمحاولة تحويل السلسلة النصية إلى رقم عددي، ويُصدر في الوقت ذاته رسالة تحذيرية صريحة في نافذة السجل (SAS Log) تفيد بإجراء التحويل. على الرغم من أن هذا التحويل قد ينجح إذا كانت النصوص تحتوي على أرقام فقط، إلا أنه يمثل ممارسة برمجية خطيرة قد تؤدي إلى تشويه البيانات وتوليد قيم مفقودة غير متوقعة إذا احتوت النصوص على أحرف أو رموز خاصة.

لتفادي هذه المشكلات وضمان أعلى درجات الموثوقية، يجب على المطورين استخدام دوال التحويل الصريح المعيارية في SAS؛ مثل استخدام دالة INPUT لتحويل المتغيرات النصية إلى عددية مع تحديد صيغة الإدخال المناسبة، واستخدام دالة PUT لتحويل المتغيرات العددية إلى نصوص منسقة. يضمن هذا التحويل الصريح خلو سجلات التنفيذ من رسائل التحذير والحفاظ على السلامة الرياضية للبيانات.

11.2 أخطاء تجاوز طول السلاسل النصية واقتطاع البيانات

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

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

يتمثل الحل الهندسي لهذه المشكلة في استخدام دالة LENGTH لتحديد أطوال المتغيرات مسبقاً، أو فرض طول صريح للعمود المشتق الجديد داخل استعلام SQL باستخدام بند LENGTH= أو دالة التحويل PUT المحددة بالسعة الكافية، بالإضافة إلى مراجعة سجل العمليات بدقة لاكتشاف أي ملاحظات تشير إلى حدوث اقتطاع للمحارف لمعالجة الهيكل على الفور.

11.3 مشكلات قفل الجداول وتضارب الوصول (Locking Issues)

في بيئات التطوير التشاركية متعددة المستخدمين (Multi-user Environments)، أو عند فتح مجموعات البيانات واستعراضها في نوافذ العرض المرئية داخل SAS Enterprise Guide أو SAS Studio، يواجه المطورون بشكل متكرر خطأ تعذر الوصول إلى الجدول وفشل تعديله بسبب تطبيق نظام القفل الحصري للملفات (File Locking).

يقوم محرك SAS افتراضياً بوضع قفل حصري على ملف مجموعة البيانات بمجرد قيام أي إجراء بفتحه للقراءة أو الكتابة، أو عند قيام المستخدم بفتح الجدول في واجهة العرض التفاعلية. فإذا حاول كود برمجي آخر في نفس اللحظة تنفيذ بيان CREATE TABLE لإعادة كتابة الجدول أو تعديله عبر ALTER TABLE، يفشل التنفيذ فوراً وتظهر رسالة خطأ شهيرة في السجل تفيد بأن: “The table is locked by another process”.

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

12. أفضل الممارسات والاعتبارات المتقدمة لتحسين كفاءة الجداول في SAS

12.1 إنشاء الفهارس (Indexes) لتسريع الاستعلامات والبحث

تُمثل الفهارس (Indexes) هياكل بيانات تكميلية متطورة يتم إنشاؤها وربطها بجداول SAS لتسريع استرجاع السجلات وتحسين أداء عمليات التصفية عبر عبارات WHERE وعمليات الربط السريع للجداول الضخمة دون الحاجة إلى إجراء مسح تسلسلي كامل (Full Table Scan) لملايين الصفوف.

يوفر إجراء PROC SQL بيان CREATE INDEX لإنشاء فهارس بسيطة (Simple Index) تستند إلى عمود واحد، أو فهارس مركبة (Composite Index) تجمع بين متغيرات متعددة. على سبيل المثال، لإنشاء فهرس على عمود اسم الفريق، نكتب: CREATE INDEX team ON basketball_stats(team);. كما يمكن إنشاء فهرس فريد CREATE UNIQUE INDEX لضمان عدم تكرار قيم المفاتيح التعريفية داخل الجدول.

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

12.2 تحسين استخدام الذاكرة وضغط البيانات (Data Compression)

تتطلب معالجة مجموعات البيانات الضخمة (Enterprise Big Data) في SAS تخطيطاً دقيقاً لتقليل استهلاك المساحات التخزينية على الأقراص الصلبة وتحسين كفاءة استخدام ذاكرة التخزين المؤقت (RAM Buffers) من خلال تقنيات ضغط البيانات المتقدمة وتعديل أحجام الصفحات.

يوفر نظام SAS خيار الضغط عالي الكفاءة COMPRESS=YES (أو COMPRESS=CHAR لضغط النصوص، و COMPRESS=BINARY لضغط الملفات التي تهيمن عليها الأرقام). عند تفعيل هذا الخيار أثناء إنشاء الجدول، مثل: CREATE TABLE big_table(COMPRESS=YES) AS SELECT * FROM source_data;، يقوم النظام بضغط السجلات وتقليص حجم الملف الفيزيائي بنسب قد تصل إلى أكثر من 70%، مما يقلل بشكل هائل من عمليات الإدخال والإخراج المادية على الأقراص ويسرع نقل البيانات عبر الشبكات.

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

12.3 التوثيق المعياري وتطبيق معايير الحوكمة البرمجية

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

تقتضي أفضل الممارسات توثيق الأكواد البرمجية عبر استخدام كتل التعليقات المنظمة (/* Block Comments */) لشرح الغرض المعماري من إنشاء كل جدول، وتحديد مصادر البيانات الأصلية، وتوثيق تواريخ التعديل والمنطق الرياضي المستخدم في اشتقاق المتغيرات الجديدة. كما يجب الالتزام الصارم بدليل تسمية موحد للمؤسسة (Naming Conventions) لتسمية الجداول والمتغيرات والمكتبات بأسماء واضحة تعكس محتواها الوظيفي بدقة.

وأخيراً، يجب إخضاع كافة الشيفرات البرمجية المسؤولة عن إنشاء الجداول لمراجعات دورية لجودة الكود (Code Reviews)، والتأكد من مطابقتها لأعلى معايير الأمان والامتثال التنظيمي، وضمان تطبيق السمات الوصفية الكاملة (Labels and Formats) على كافة الأعمدة لضمان جاهزية الجداول للاستخدام المباشر في أدوات التقارير وذكاء الأعمال دون الحاجة إلى معالجات لاحقة.

خاتمة شاملة

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

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

References

  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute Inc. https://support.sas.com/en/books.html
  • Lafler, K. P. (2013). PROC SQL: Beyond the Basics Using SAS (2nd ed.). SAS Institute Inc. https://support.sas.com/pubndx/13768.html
  • SAS Institute Inc. (2020). SAS 9.4 SQL Procedure User’s Guide (4th ed.). SAS Institute Inc. https://documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=default&docsetId=sqlproc&docpartId=title.htm
  • SAS Institute Inc. (2021). Base SAS 9.4 Procedures Guide (7th ed.). SAS Institute Inc. https://documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=default&docsetId=proc&docpartId=title.htm
  • Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS (3rd ed.). SAS Institute Inc. https://support.sas.com/en/books/cody.html

اقتباس هذا المقال

looti, M. (2026, سبتمبر 2). كيفية إنشاء جداول في SAS (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/how-to-create-tables-in-sas-with-examples/
looti, Mohammed. “كيفية إنشاء جداول في SAS (مع أمثلة).” عرب سايكلوجي, 2 سبتمبر 2026, https://arabpsychology.com/how-to-create-tables-in-sas-with-examples/.
looti, Mohammed. “كيفية إنشاء جداول في SAS (مع أمثلة).” عرب سايكلوجي. سبتمبر 2, 2026. https://arabpsychology.com/how-to-create-tables-in-sas-with-examples/.