لم أعتد العمل على ORACLE، كانت قاعدة البيانات التي أستخدمها عادة هي mysql، لكن في وظيفتي الجديدة كان علي أن أعمل على جلب البيانات لبرنامجي من قاعدة أوراكل، كانت المشكلة هي في تحديد عدد الصفوف الناتجة عن عملية البحث، وهي ما يفترض بها أن تتم ببساطة عن طريق كلمة limit في نهاية جملة SQL.
إلا أنها لم تعمل اطلاقا، بقليل من البحث (ومساعدة من مدير قواعد البيانات) وجدت التالي:
في أوراكل تجعل جملتك بالكامل جملة فرعية داخل الجملة الأكبر التي تقوم بالتحديد، خذ باعتبارك أن كل صف في أوراكل يسبقه حقل ROWNUM المشير لرقم الحقل، قم بتضمينه في الجدول وأعطه اسما بديلا لتتمكن من التعاطي معه في جملة التحديد الخارجية.
مثلا، إذا كانت جملتك هي:
لننتقل إلى أسرع هذه الحلول مباشرة، وحسب تجاربي على جملة تعدت نتيجتها 110 ألف صف، كان الفارق حوالي ثانيتين في سرعة انجاز العملية، آخر شارك تجربة في الرابط السابق على تسعة ملايين صف وكان الفارق بالدقائق..
بالطبع تتفاوت السرعة حسب مدى البحث، البحث في آخر الجدول سيكون أبطأ من البحث في أوله، لكنه أسرع من الطريقة الأولى بفارق ملحوظ..
الخلاصة، لا تحاول استخدام كلمة limit عندما تكون قاعدة البيانات مكتوبة بأوراكل..
اقرأ أيضا:
إلا أنها لم تعمل اطلاقا، بقليل من البحث (ومساعدة من مدير قواعد البيانات) وجدت التالي:
في أوراكل تجعل جملتك بالكامل جملة فرعية داخل الجملة الأكبر التي تقوم بالتحديد، خذ باعتبارك أن كل صف في أوراكل يسبقه حقل ROWNUM المشير لرقم الحقل، قم بتضمينه في الجدول وأعطه اسما بديلا لتتمكن من التعاطي معه في جملة التحديد الخارجية.
مثلا، إذا كانت جملتك هي:
SELECT f1,f2,f3 FROM my_table
- عليك أولا أن تقوم باضافة حقل يحمل أرقام الصفوف كالتالي:
SELECT ROWNUM rn, f1, f2, f3 FROM my_table
- الآن صارت الجملة السابقة جدولا يمكنك وضعه كجملة فرعية في جملة تحديد أكبر، كالتالي:
SELECT * FROM (SELECT ROWNUM rn, f1, f2, f3 FROM my_table) WHERE rn BETWEEN :Min AND :Maxوهذه الطريقة ليست الأسرع وإن كانت الأوضح منطقيا في كتابتها، بهذه الطريقة يقوم محرك قاعدة البيانات بجلب الجدول كاملا ثم انتقاء الصفوف بين الحد الأدنى والحد الأعلى..على أحد المواقع وجدت حلولا أسرع..
لننتقل إلى أسرع هذه الحلول مباشرة، وحسب تجاربي على جملة تعدت نتيجتها 110 ألف صف، كان الفارق حوالي ثانيتين في سرعة انجاز العملية، آخر شارك تجربة في الرابط السابق على تسعة ملايين صف وكان الفارق بالدقائق..
- الآن معنا الجملة الداخلية مع حقل الأرقام:
SELECT ROWNUM rn, f1, f2, f3 FROM my_table
- قم بتحديد الحد الأقصى في نفس الجملة الداخلية، حيث يجب أن يصل الجدول بالطريقة التالية:
SELECT ROWNUM rn, f1, f2, f3 FROM my_table WHERE ROWNUM <= :Max
- والآن، قم بتحديد الحد الأدنى في الجملة الخارجية:
SELECT * FROM (SELECT ROWNUM rn, f1, f2, f3 FROM my_table WHERE ROWNUM <= :Max ) WHERE rn>= :Min
بالطبع تتفاوت السرعة حسب مدى البحث، البحث في آخر الجدول سيكون أبطأ من البحث في أوله، لكنه أسرع من الطريقة الأولى بفارق ملحوظ..
الخلاصة، لا تحاول استخدام كلمة limit عندما تكون قاعدة البيانات مكتوبة بأوراكل..
اقرأ أيضا:
- http://blog.lishman.com/2008/03/rownum.html
- http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
تعليقات
إرسال تعليق