الانتقال إلى المحتوى

شرح موضوع High Performance Sql Tuning


omar-alreyati

Recommended Posts

الموضوع الذي سوف أتطرق له هو كيفية عمل tuning لجمل الSQL لزيادة سرعة اخراج المخرجات ، لا أريد أن اطيل عليكم والآن دعونا نبدأ بالخطوات العملية والتي سوف تتركز على المثلة قدر الأمكان:-

# القانون الأول : أستخدام Where لفلترة الصفوف:-
يتم استخدام where لاخراج البيانات بناء على شرط معين ، واليك المثال الأتي ليتضح الأمر أكثر

SELECT *
FROM customers;

CUSTOMER_ID FIRST_NAME LAST_NAME  DOB	   PHONE
----------- ---------- ---------- --------- ------------
	  1 John	   Brown	  01-JAN-65 800-555-1211
	  2 Cynthia	Green	  05-FEB-68 800-555-1212
	  3 Steve	  White	  16-MAR-71 800-555-1213
	  4 Gail	   Black				800-555-1214
	  5 Doreen	 Blue	   20-MAY-70


هذا المثال أخرج جميع الصفوف من جدول الcustomers والآن ماذا سيحصل لو تم اضافة شرط where

SELECT *
FROM customers
WHERE customer_id IN (1, 2);

CUSTOMER_ID FIRST_NAME LAST_NAME  DOB	   PHONE
----------- ---------- ---------- --------- ------------
	  1 John	   Brown	  01-JAN-65 800-555-1211
	  2 Cynthia	Green	  05-FEB-68 800-555-1212


الآن أنظر الى النتائج لقد تم فلترتها بناءً على الشرط where

هذا ما لدي في القانون الاول للSQL tuning اعلم انه قانون يعلمه الكل لكن أنظرني في الدرس القادم .
لدي طلب بسيط جداًًًًااااااااااااااااًً وهو (الدعاء لي ولجميع مرضى المسلمين بالشفاء العاجل )لاني والله محتاج للدعااااااااااااااااااااااااااااااااااء الخالص الصادق

رابط هذا التعليق
شارك

تكملةً للموضوع السابق :[/code]
الموضوع : أستعمال Table Joins أكثر من Multiple Queries:
اليكم الشرح بالأمثلة .
المثال الأول : يسترجع الname و product_type_id من جدول products للproduct =1
المثال الثاني : يستعمل الproduct_type_id لاسترجاع ال name من جدول product_types

SELECT name, product_type_id
FROM products
WHERE product_id = 1;

NAME						   PRODUCT_TYPE_ID
------------------------------ ---------------
Modern Science							   1


SELECT name
FROM product_types
WHERE product_type_id = 1;

NAME
----------
Book



والآن ما رأيكم في دمج هذان الاستعلامين في أتعلام واحد لزيادة الفعالية للنتائج وتقليل عمليات جلب البيانات وكما يلي وباستخدام join بين جدولي products و product_types لاستخراج نفس النتيجة السابقة :-

SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME						   NAME
------------------------------ ----------
Modern Science				 Book


هذا الاستعلام ارجع نفس نتيجة الأستعلامين (الاول والثاني)
وبشكل عام : حاول قدر الأمكان استعمال (ONE QUERY) أكثر من (TWO QUERY)
انتهى القانون الثاني ، وسوف يكون هناك المزيد أن شاء الله

رابط هذا التعليق
شارك

حياكم الله مجدداً أتمنى أن تكون الدروس مفيد قدر المستطاع (تذكر أني أشرح كيفية عمل tuning لجمل الSQL)
القانون الثالث:- استخدام Fully Qualified للأعمدة في حالة أستعمال الJoin:-
للوهلة الأولى ربما أن مصطلح Fully Qualified جديد على البعض لكن مع الأمثلة سيتضح الأمر أكثر ، اليك الأمثلة ليتضح الأمر :
المثال الأول :- يستخدم جدولي products و product_types ويعطيمهما alias بالترتيب p و pt

SELECT p.name, pt.name, description, price
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME						   NAME
------------------------------ ----------
DESCRIPTION											 PRICE
-------------------------------------------------- ----------
Modern Science				 Book
A description of modern science						 19.95


أنظر الى الأعمدة description و price لم يتم أضافة alias الخاص بهما أي أن هذا الأستعلام ليس Fully Qualified (مؤهل بالكامل) لجميع الأعمدة ، ربما يسأل أحد ما فائدة وضع جميع الأعمدة في حالة Fully Qualified ، الجواب أن قاعدة البيانات سوف تهدر المزيد من الوقت لكي تبحث عن الأعمدة التي ليس معرف بها الalias لكي تعرف لمن ترجع هذا الأعمدة في الجدوال ، ربما يسأل آخر وهل هذا الوقت الى الدرجة من الأهمية ، الجواب نعم لا، هناك من الأستعلامات من يأخد وقت طويل جداً (5 دقائق مثلاً) فما بالك لو أن الاستعلام كان يحوي العديد من الجدوال والأعمدة ولم يتم استعمال Fully Qualified بشكله الصحيح أكيد أن الوقت سوف يهدر للبحث عن مطابقة الأعمدة مع الجدوال.

المثال الثاني : نفس المثال السابق لكن مع أضافة الalias =p للأعمدة description و price :-

SELECT p.name, pt.name, p.description, p.price
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME						   NAME
------------------------------ ----------
DESCRIPTION											 PRICE
-------------------------------------------------- ----------
Modern Science				 Book
A description of modern science						 19.95


لاحظ أن النتائج في الأستعلامين متساوين ، ولكن الاستعلام الأول سوف يأخد وقت أكثر من الأستعلام الثاني وذلك لعدم أستعمال Fully Qualified في الاستعلام الاول ز

خلاصة: في حالة استخدام استعلام يحوي Join Table يجب تطبيق نظرية Fully Qualified في الأعمدة .
أتمنى أن أكون قدر أوصلت الفكرة ، وأي استفسار بخصوص هذا الدرس أو الدروس السابقة أنا جاهز أن شاء الله

والسلام عليكم

رابط هذا التعليق
شارك

القانون الرابع: أستخدام تعابير CASE بدلاً Multiple Queries (الإستفسارات المتعدّدة):-
خلينا نفهم هالقانون بالأمثلة حتى يتضح الأمر أكثر.
المثال الأول :- هذا المثال يستخدم Multiple Queries لحساب عدد المنتجات خلال أسعار مختلفة :

(أيجاد عدد المنتجات التي سعرها أقل من 13)
SELECT COUNT(*)
FROM products
WHERE price < 13;

 COUNT(*)
----------
	 2
(إيجاد عدد المنتجات التي سعرها بين 13 و 15)
SELECT COUNT(*)
FROM products
WHERE price BETWEEN 13 AND 15;

 COUNT(*)
----------
	 5
(إيجاد المنتجات التي سعرها أكبر من 15)
SELECT COUNT(*)
FROM products
WHERE price > 15;

 COUNT(*)
----------
	 5



ما رأيك الآن لو قمنا بدمج هذه الأستفسارات الثلاث في أستفسار واحد بإستخدام الCASE لزيادة الPerformance :

SELECT
COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,
COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,
COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high
FROM products;

   LOW		MED	   HIGH
---------- ---------- ----------
	 2		  5		  5


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

رابط هذا التعليق
شارك

الله ينور عليك و يزيدك كمان وكمان
فعلا الموضوع مهم و المفروض كل اللي بيتعامل مع الاوراكل يقراة كويس

الف شكر ليك يا اخ عمر و ربنا يشفيك و يشفي مرضي المسلمين و يعفوا عنك باذنة

رابط هذا التعليق
شارك

القانون الخامس:- أستخدام Where بدلاً من الHaving
كما هو معلوم لدى الجميع أن Where تقوم بفلترة الصفوف rows والHaving قتوم بفلترة مجموعات الصفوف Groups of Rows .
ملحوظة : الHaving تقوم بفلترة مجموعات الصفوف بعد أن تقوم بتجميعها كمجموعات وهذا يأخذ بعض الوقت ، لذا يفضل استخدام Where لفلترة الصفوف قدر الأمكان .
والآن دعنا نذهب للأمثلة ليتضح الأمر أكثر:-
المثال الأول : يسترجع product_type_id ومعدل سعر المنتجات التي product_type_id =1 or 2 :-

SELECT product_type_id, AVG(price)
FROM products
GROUP BY product_type_id
HAVING product_type_id IN (1, 2);

PRODUCT_TYPE_ID AVG(PRICE)
--------------- ----------
		  1	 24.975
		  2	  26.22


هذا المثال قام بتجميع الproduct_type_id كمجموعات ثم قام بفلترتها بإستخدام Having وهذا أخذ بعض الوقت ، ما رأيك بإستخراج نفس النتائج ولكن بإستخدام Where والتي تأخذ وقت أقل من الوقت المستغرق بإستخدام Having، اليك المثال :-

SELECT product_type_id, AVG(price)
FROM products
WHERE product_type_id IN (1, 2)
GROUP BY product_type_id;

PRODUCT_TYPE_ID AVG(PRICE)
--------------- ----------
		  1	 24.975
		  2	  26.22


لاحظ ان هذا المثال قام بالفلترة بإستخدام where ثم بعدها قام بتجميعها وهذا قلل الوقت قدر الأمكان.

خلاصة : حاول استخدام where لفلترة الصفوف بدلاً من having (قدر الأمكان)

أنتهى الدرس والسلام عليكم.

رابط هذا التعليق
شارك

# القانون السادس : أستخدام UNION ALL بدلاً من UNION :-
كما هو معلوم لدى الجميع أن الUNION ALL يستخدم أستعلامين لجلب جميع الصفوف ومن ضمنها الصفوف المكررة ، لكن الUNION لجلب الصفوف من غير تكرار ، ومن هنا يتضح لنا الUNION تقوم بحذف الصفوف المكررة وهذا يحتاج الى بعض الوقت وهذا هو مربط الفرس أن عملية الUNION تحتاج الى وقت أكثر في التنفيذ من الUNION ALL لان الUNION تحتاج بعض الوقت لحذ الصفوف المكررة.
الآن دعنا نذهب الى الأمثلة لتتضح الصورة أكثر.
الاستعلام الأتي يستخدم الUNION لجلب الصفوف من جدول products وجدول more_products

SELECT product_id, product_type_id, name
FROM products
UNION
SELECT prd_id, prd_type_id, name
FROM more_products;

PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- -------------------
	 1			   1 Modern Science
	 2			   1 Chemistry
	 3			   2 Supernova
	 3				 Supernova
	 4			   2 Lunar Landing
	 4			   2 Tank War
	 5			   2 Submarine
	 5			   2 Z Files
	 6			   2 2412: The Return
	 7			   3 Space Force 9
	 8			   3 From Another Planet
	 9			   4 Classical Music
	10			   4 Pop 3
	11			   4 Creative Yell
	12				 My Front Line


لاحظ ان هذا الأستعلام جلب الصفوف من غير تكرار ، أما الأستعلام التالي يستخدم UNION ALL يستخدم جدولي products و more_products لجلب جميع الصفوف بما فيها المكرر :-

SELECT product_id, product_type_id, name
FROM products
UNION ALL
SELECT prd_id, prd_type_id, name
FROM more_products;

PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- ------------------------------
	 1			   1 Modern Science
	 2			   1 Chemistry
	 3			   2 Supernova
	 4			   2 Tank War
	 5			   2 Z Files
	 6			   2 2412: The Return
	 7			   3 Space Force 9
	 8			   3 From Another Planet
	 9			   4 Classical Music
	10			   4 Pop 3
	11			   4 Creative Yell
	12				 My Front Line
	 1			   1 Modern Science
	 2			   1 Chemistry
	 3				 Supernova
	 4			   2 Lunar Landing
	 5			   2 Submarine


لاحظ ان هذا الاستعلام قام بجلب جميع الصفوف بما فيها المكرر.
ملاحظة بسيطة : نحن هنا نشرح كيفية عمل tuning لجمل الSQL لذا فإذا أقتضى البرنامج جلب البيانات من غير تكرار فيجب هنا استخدام الUNION مع أنها تحتاج بعض الوقت لحذف المكرر لكن حاجة البرنامج هنا أهم .

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

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته

اخي الكريم omar-alreyati

جزاك الله كل خير علي هذا الشرح الرائع والواضح

وأسأل الله العظيم أن يشفيك ويشفي جميع مرضى المسلمين

والرابط التالي يحتوي علي ملف متعلق بنفس الموضوع


http://www.araboug.org/ib/index.php?showtopic=3389


جزاكم الله كل خير

رابط هذا التعليق
شارك

  • بعد 2 شهور...
  • بعد 2 أسابيع...

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

SELECT product_id, name
FROM products 
WHERE product_id IN
 (SELECT product_id
  FROM purchases);

PRODUCT_ID NAME
---------- -----------------------------
	 1 Modern Science
	 2 Chemistry
	 3 Supernova



ما رأيك لو أعدنا كتابة هذا الجملة بإستخدام EXISTS

SELECT product_id, name
FROM products outer
WHERE EXISTS
 (SELECT 1
  FROM purchases inner
  WHERE inner.product_id = outer.product_id);

PRODUCT_ID NAME
---------- -----------------------------
	 1 Modern Science
	 2 Chemistry
	 3 Supernova


والخلاصة حاول أستخدام EXISTS بدلاً من IN في حالة استعمال subqueries .
أنتهى الدرس متمنياً للجميع التوفيق والنجاح . وجزاكم الله خيراً

رابط هذا التعليق
شارك

القانون الثامن : أستخدم EXISTS بدلاً من DISTINCT
من المعلوم لدى الجميع أن DISTINCT تستخدم لحذف الصفوف المكررة ، بينما أن EXISTS تستخدم لعمل تشيك لوجود صفوف معينة ، لعل البعض يسأل ما مدى علاقة ذلك بموضوع Performance Sql Tuning ، ولفهم ذلك أقول أنه يجب أستخدام EXISTS بدلاً من DISTINCT (وذلك لأن الDISTINCT تقوم بترتيب الصفوف المسترجعة قبل أجراء حذف للصفوف المكررة وهذا يأخد بعض الوقت وهنا مربط الفرس) وليتضح الأمر أنظر الى المثال الأتي :-
* هذا المثال يستخدم DISTINCT لأسترجاع المنتجات التي تم شرائها :-

SELECT DISTINCT pr.product_id, pr.name
FROM products pr, purchases pu
WHERE pr.product_id = pu.product_id;

PRODUCT_ID NAME
---------- -----------------------------
	 1 Modern Science
	 2 Chemistry
	 3 Supernova



ولو حاولنا أعادة المثال بإستخدام EXISTS فسوف يأخد وقت اقل من الDISTINCT

SELECT product_id, name
FROM products outer
WHERE EXISTS
 (SELECT 1
  FROM purchases inner
  WHERE inner.product_id = outer.product_id);

PRODUCT_ID NAME
---------- -----------------------------
	 1 Modern Science
	 2 Chemistry
	 3 Supernova


الخلاصة : حاول أستخدم EXISTS بدلاً من DISTINCT لأن عملية الDISTINCT تأخد بعض الوقت (ترتيب الصوف ثم حذف الصفوف المكررة)

وفي نهاية شرح هذا الموضوع أشكر كل من ساهم انجاز هذا العمل
والسلام عليكم ورحمة الله وبركاته

رابط هذا التعليق
شارك

  • بعد 1 شهر...
  • بعد 1 سنة...
  • بعد 4 أسابيع...

اللهم يارب يا خالق الاكوان وخالق بحار ومثبت الجبار اشفي أخانا عمر وحباً بسيد عمر (محمد سيد البشر وصلى الله عليه وسلم )

رابط هذا التعليق
شارك

  • بعد 8 شهور...

ربنا يبارك فيك ودى
فكره عمل SQL TUNING على TOAD شرح فديو من quest power
من هنا

تم تعديل بواسطة ahmed_saeed_2010
رابط هذا التعليق
شارك

اللهم أشفي مرضى المسلمين
وجزاك الله خير أخي على عملك وحرصك على الدعاء للمسلمين

رابط هذا التعليق
شارك

  • بعد 4 شهور...
  • بعد 8 شهور...

الموضوع الذي سوف أتطرق له هو كيفية عمل tuning لجمل الSQL لزيادة سرعة اخراج المخرجات ، لا أريد أن اطيل عليكم والآن دعونا نبدأ بالخطوات العملية والتي سوف تتركز على المثلة قدر الأمكان:-

# القانون الأول : أستخدام Where لفلترة الصفوف:-
يتم استخدام where لاخراج البيانات بناء على شرط معين ، واليك المثال الأتي ليتضح الأمر أكثر
SELECT *
FROM customers;

CUSTOMER_ID FIRST_NAME LAST_NAME  DOB       PHONE
----------- ---------- ---------- --------- ------------
  	1 John       Brown  	01-JAN-65 800-555-1211
  	2 Cynthia	Green  	05-FEB-68 800-555-1212
  	3 Steve  	White  	16-MAR-71 800-555-1213
  	4 Gail       Black				800-555-1214
  	5 Doreen     Blue       20-MAY-70


هذا المثال أخرج جميع الصفوف من جدول الcustomers والآن ماذا سيحصل لو تم اضافة شرط where

SELECT *
FROM customers
WHERE customer_id IN (1, 2);

CUSTOMER_ID FIRST_NAME LAST_NAME  DOB       PHONE
----------- ---------- ---------- --------- ------------
  	1 John       Brown  	01-JAN-65 800-555-1211
  	2 Cynthia	Green  	05-FEB-68 800-555-1212


الآن أنظر الى النتائج لقد تم فلترتها بناءً على الشرط where

هذا ما لدي في القانون الاول للSQL tuning اعلم انه قانون يعلمه الكل لكن أنظرني في الدرس القادم .
لدي طلب بسيط جداًًًًااااااااااااااااًً وهو (الدعاء لي ولجميع مرضى المسلمين بالشفاء العاجل )لاني والله محتاج للدعااااااااااااااااااااااااااااااااااء الخالص الصادق





تكملةً للموضوع السابق :[/code]
الموضوع : أستعمال Table Joins أكثر من Multiple Queries:
اليكم الشرح بالأمثلة .
المثال الأول : يسترجع الname و product_type_id من جدول products للproduct =1
المثال الثاني : يستعمل الproduct_type_id لاسترجاع ال name من جدول product_types
SELECT name, product_type_id
FROM products
WHERE product_id = 1;

NAME					       PRODUCT_TYPE_ID
------------------------------ ---------------
Modern Science						       1


SELECT name
FROM product_types
WHERE product_type_id = 1;

NAME
----------
Book



والآن ما رأيكم في دمج هذان الاستعلامين في أتعلام واحد لزيادة الفعالية للنتائج وتقليل عمليات جلب البيانات وكما يلي وباستخدام join بين جدولي products و product_types لاستخراج نفس النتيجة السابقة :-

SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME					       NAME
------------------------------ ----------
Modern Science			     Book


هذا الاستعلام ارجع نفس نتيجة الأستعلامين (الاول والثاني)
وبشكل عام : حاول قدر الأمكان استعمال (ONE QUERY) أكثر من (TWO QUERY)
انتهى القانون الثاني ، وسوف يكون هناك المزيد أن شاء الله





حياكم الله مجدداً أتمنى أن تكون الدروس مفيد قدر المستطاع (تذكر أني أشرح كيفية عمل tuning لجمل الSQL)
القانون الثالث:- استخدام Fully Qualified للأعمدة في حالة أستعمال الJoin:-
للوهلة الأولى ربما أن مصطلح Fully Qualified جديد على البعض لكن مع الأمثلة سيتضح الأمر أكثر ، اليك الأمثلة ليتضح الأمر :
المثال الأول :- يستخدم جدولي products و product_types ويعطيمهما alias بالترتيب p و pt
SELECT p.name, pt.name, description, price
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME					       NAME
------------------------------ ----------
DESCRIPTION										     PRICE
-------------------------------------------------- ----------
Modern Science			     Book
A description of modern science					     19.95


أنظر الى الأعمدة description و price لم يتم أضافة alias الخاص بهما أي أن هذا الأستعلام ليس Fully Qualified (مؤهل بالكامل) لجميع الأعمدة ، ربما يسأل أحد ما فائدة وضع جميع الأعمدة في حالة Fully Qualified ، الجواب أن قاعدة البيانات سوف تهدر المزيد من الوقت لكي تبحث عن الأعمدة التي ليس معرف بها الalias لكي تعرف لمن ترجع هذا الأعمدة في الجدوال ، ربما يسأل آخر وهل هذا الوقت الى الدرجة من الأهمية ، الجواب نعم لا، هناك من الأستعلامات من يأخد وقت طويل جداً (5 دقائق مثلاً) فما بالك لو أن الاستعلام كان يحوي العديد من الجدوال والأعمدة ولم يتم استعمال Fully Qualified بشكله الصحيح أكيد أن الوقت سوف يهدر للبحث عن مطابقة الأعمدة مع الجدوال.

المثال الثاني : نفس المثال السابق لكن مع أضافة الalias =p للأعمدة description و price :-

SELECT p.name, pt.name, p.description, p.price
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 1;

NAME					       NAME
------------------------------ ----------
DESCRIPTION										     PRICE
-------------------------------------------------- ----------
Modern Science			     Book
A description of modern science					     19.95


لاحظ أن النتائج في الأستعلامين متساوين ، ولكن الاستعلام الأول سوف يأخد وقت أكثر من الأستعلام الثاني وذلك لعدم أستعمال Fully Qualified في الاستعلام الاول ز

خلاصة: في حالة استخدام استعلام يحوي Join Table يجب تطبيق نظرية Fully Qualified في الأعمدة .
أتمنى أن أكون قدر أوصلت الفكرة ، وأي استفسار بخصوص هذا الدرس أو الدروس السابقة أنا جاهز أن شاء الله

والسلام عليكم





القانون الرابع: أستخدام تعابير CASE بدلاً Multiple Queries (الإستفسارات المتعدّدة):-
خلينا نفهم هالقانون بالأمثلة حتى يتضح الأمر أكثر.
المثال الأول :- هذا المثال يستخدم Multiple Queries لحساب عدد المنتجات خلال أسعار مختلفة :
(أيجاد عدد المنتجات التي سعرها أقل من 13)
SELECT COUNT(*)
FROM products
WHERE price < 13;

 COUNT(*)
----------
     2
(إيجاد عدد المنتجات التي سعرها بين 13 و 15)
SELECT COUNT(*)
FROM products
WHERE price BETWEEN 13 AND 15;

 COUNT(*)
----------
     5
(إيجاد المنتجات التي سعرها أكبر من 15)
SELECT COUNT(*)
FROM products
WHERE price > 15;

 COUNT(*)
----------
     5



ما رأيك الآن لو قمنا بدمج هذه الأستفسارات الثلاث في أستفسار واحد بإستخدام الCASE لزيادة الPerformance :

SELECT
COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,
COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,
COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high
FROM products;

      LOW		MED       HIGH
---------- ---------- ----------
     2	  	5	  	5


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





القانون الخامس:- أستخدام Where بدلاً من الHaving
كما هو معلوم لدى الجميع أن Where تقوم بفلترة الصفوف rows والHaving قتوم بفلترة مجموعات الصفوف Groups of Rows .
ملحوظة : الHaving تقوم بفلترة مجموعات الصفوف بعد أن تقوم بتجميعها كمجموعات وهذا يأخذ بعض الوقت ، لذا يفضل استخدام Where لفلترة الصفوف قدر الأمكان .
والآن دعنا نذهب للأمثلة ليتضح الأمر أكثر:-
المثال الأول : يسترجع product_type_id ومعدل سعر المنتجات التي product_type_id =1 or 2 :-
SELECT product_type_id, AVG(price)
FROM products
GROUP BY product_type_id
HAVING product_type_id IN (1, 2);

PRODUCT_TYPE_ID AVG(PRICE)
--------------- ----------
	  	1     24.975
	  	2  	26.22


هذا المثال قام بتجميع الproduct_type_id كمجموعات ثم قام بفلترتها بإستخدام Having وهذا أخذ بعض الوقت ، ما رأيك بإستخراج نفس النتائج ولكن بإستخدام Where والتي تأخذ وقت أقل من الوقت المستغرق بإستخدام Having، اليك المثال :-

SELECT product_type_id, AVG(price)
FROM products
WHERE product_type_id IN (1, 2)
GROUP BY product_type_id;

PRODUCT_TYPE_ID AVG(PRICE)
--------------- ----------
	  	1     24.975
	  	2  	26.22


لاحظ ان هذا المثال قام بالفلترة بإستخدام where ثم بعدها قام بتجميعها وهذا قلل الوقت قدر الأمكان.

خلاصة : حاول استخدام where لفلترة الصفوف بدلاً من having (قدر الأمكان)

أنتهى الدرس والسلام عليكم.





# القانون السادس : أستخدام UNION ALL بدلاً من UNION :-
كما هو معلوم لدى الجميع أن الUNION ALL يستخدم أستعلامين لجلب جميع الصفوف ومن ضمنها الصفوف المكررة ، لكن الUNION لجلب الصفوف من غير تكرار ، ومن هنا يتضح لنا الUNION تقوم بحذف الصفوف المكررة وهذا يحتاج الى بعض الوقت وهذا هو مربط الفرس أن عملية الUNION تحتاج الى وقت أكثر في التنفيذ من الUNION ALL لان الUNION تحتاج بعض الوقت لحذ الصفوف المكررة.
الآن دعنا نذهب الى الأمثلة لتتضح الصورة أكثر.
الاستعلام الأتي يستخدم الUNION لجلب الصفوف من جدول products وجدول more_products
SELECT product_id, product_type_id, name
FROM products
UNION
SELECT prd_id, prd_type_id, name
FROM more_products;

PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- -------------------
     1		       1 Modern Science
     2		       1 Chemistry
     3		       2 Supernova
     3			     Supernova
     4		       2 Lunar Landing
     4		       2 Tank War
     5		       2 Submarine
     5		       2 Z Files
     6		       2 2412: The Return
     7		       3 Space Force 9
     8		       3 From Another Planet
     9		       4 Classical Music
	10		       4 Pop 3
	11		       4 Creative Yell
	12			     My Front Line


لاحظ ان هذا الأستعلام جلب الصفوف من غير تكرار ، أما الأستعلام التالي يستخدم UNION ALL يستخدم جدولي products و more_products لجلب جميع الصفوف بما فيها المكرر :-

SELECT product_id, product_type_id, name
FROM products
UNION ALL
SELECT prd_id, prd_type_id, name
FROM more_products;

PRODUCT_ID PRODUCT_TYPE_ID NAME
---------- --------------- ------------------------------
     1		       1 Modern Science
     2		       1 Chemistry
     3		       2 Supernova
     4		       2 Tank War
     5		       2 Z Files
     6		       2 2412: The Return
     7		       3 Space Force 9
     8		       3 From Another Planet
     9		       4 Classical Music
	10		       4 Pop 3
	11		       4 Creative Yell
	12			     My Front Line
     1		       1 Modern Science
     2		       1 Chemistry
     3			     Supernova
     4		       2 Lunar Landing
     5		       2 Submarine


لاحظ ان هذا الاستعلام قام بجلب جميع الصفوف بما فيها المكرر.
ملاحظة بسيطة : نحن هنا نشرح كيفية عمل tuning لجمل الSQL لذا فإذا أقتضى البرنامج جلب البيانات من غير تكرار فيجب هنا استخدام الUNION مع أنها تحتاج بعض الوقت لحذف المكرر لكن حاجة البرنامج هنا أهم .

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





القانون السابع : أستخدام EXISTS بدلاً من IN
لنرى ما قصة هذا القانون : أن IN تستخدم لعمل تشيك في حالة كون القيمة موجودة في قائمة(list) ، ولكن EXISTS تختلف حيث تعمل تشيك لوجود الصفوف بينما أن IN تشيك القيم الفعلية ، لذا فإن EXISTS تعطي كفاءة أفضل من IN في حالة استخدام subqueries . واليك الأمثلة ليتضح الأمر أكثر :-
اليك هذا الأستعلام الذي يستخدم IN لأسترجاع المنتجات التي تم شرائها.
SELECT product_id, name
FROM products 
WHERE product_id IN
 (SELECT product_id
  FROM purchases);

PRODUCT_ID NAME
---------- -----------------------------
     1 Modern Science
     2 Chemistry
     3 Supernova



ما رأيك لو أعدنا كتابة هذا الجملة بإستخدام EXISTS

SELECT product_id, name
FROM products outer
WHERE EXISTS
 (SELECT 1
  FROM purchases inner
  WHERE inner.product_id = outer.product_id);

PRODUCT_ID NAME
---------- -----------------------------
     1 Modern Science
     2 Chemistry
     3 Supernova


والخلاصة حاول أستخدام EXISTS بدلاً من IN في حالة استعمال subqueries .
أنتهى الدرس متمنياً للجميع التوفيق والنجاح . وجزاكم الله خيراً





القانون الثامن : أستخدم EXISTS بدلاً من DISTINCT
من المعلوم لدى الجميع أن DISTINCT تستخدم لحذف الصفوف المكررة ، بينما أن EXISTS تستخدم لعمل تشيك لوجود صفوف معينة ، لعل البعض يسأل ما مدى علاقة ذلك بموضوع Performance Sql Tuning ، ولفهم ذلك أقول أنه يجب أستخدام EXISTS بدلاً من DISTINCT (وذلك لأن الDISTINCT تقوم بترتيب الصفوف المسترجعة قبل أجراء حذف للصفوف المكررة وهذا يأخد بعض الوقت وهنا مربط الفرس) وليتضح الأمر أنظر الى المثال الأتي :-
* هذا المثال يستخدم DISTINCT لأسترجاع المنتجات التي تم شرائها :-
SELECT DISTINCT pr.product_id, pr.name
FROM products pr, purchases pu
WHERE pr.product_id = pu.product_id;

PRODUCT_ID NAME
---------- -----------------------------
     1 Modern Science
     2 Chemistry
     3 Supernova



ولو حاولنا أعادة المثال بإستخدام EXISTS فسوف يأخد وقت اقل من الDISTINCT

SELECT product_id, name
FROM products outer
WHERE EXISTS
 (SELECT 1
  FROM purchases inner
  WHERE inner.product_id = outer.product_id);

PRODUCT_ID NAME
---------- -----------------------------
     1 Modern Science
     2 Chemistry
     3 Supernova


الخلاصة : حاول أستخدم EXISTS بدلاً من DISTINCT لأن عملية الDISTINCT تأخد بعض الوقت (ترتيب الصوف ثم حذف الصفوف المكررة)

وفي نهاية شرح هذا الموضوع أشكر كل من ساهم انجاز هذا العمل
والسلام عليكم ورحمة الله وبركاته



بسم الله الرحمن الرحيم
بجد ما اجمل هذة الدروس فعلا روعة
ياريت يا جماعة اى عضو عندة فكرة عن Tuning انا عملت Search على المنتدى مفيش مشاركات كتير او مفيش مشاركة حلوة غير المشاركة دى فقط
ياريت اى عضو عن فكرة يعمل لينا مواضيع او مشاركات مميزة مثل هذة المشاركة دى

وكمان عاوزين حاجات ليها علاقة Order فى ترتيب اى Table يشتغل الاول وكمان فية حاجات اسمها Full index وكمان ترتيب Index وحاجات كتير فى Tuning علشان انا معرفش حاجة فى المجال دة ومطلوبة فى شغلى جدا اليومين دول

والله المستعان
رابط هذا التعليق
شارك

  • بعد 4 سنة...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية