یکی از مهم ترین بخش های زبان کوئری نویسی SQL قسمت WHERE JOIN هست از هر دو میتوان برای کوئری زدن روی دو و یا چند جدول استفاده کرد اما تفاوت هایی با هم خواهند داشت با ذکر یک مثال این مورد را بیشتر توضیح میدهیم.
دو جدول فرضی را در نظر بگیرید
۱. جدول User با مقادیر Id, user_name , phone_number
۲.جدول Book با مقادیر Id, name, price, phone_number
(در واقعیت جدول Book به جدول User با کلید خارجی متصل میشود ولی در این مثال از این مورد چشم پوشی شده است )
اگر بخواهیم با استفاده از WHERE اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم، میتوانیم از کوئری زیر استفاده کنیم:
SELECT *
FROM User, Book
WHERE User.phone_number = Book.phone_number;
این کوئری تمام رکوردهایی را انتخاب میکند که مقدار phone_number آنها در هر دو جدول یکسان است.
همچنین، میتوانیم با استفاده از JOIN اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم. این مثال را با استفاده از JOIN به صورت زیر توسعه میدهیم:
SELECT *
FROM User
JOIN Book ON User.phone_number = Book.phone_number;
این کوئری نیز تمام رکوردهایی را انتخاب میکند که مقدار phone_number آنها در هر دو جدول یکسان است. با استفاده از JOIN، ما رکوردهای مشابه را از دو جدول به هم متصل میکنیم تا نتایج را بدست آوریم.
تفاوت اصلی در استفاده از WHERE و JOIN در این مثال، در نحوه نوشتن کوئری است. استفاده از JOIN به صورت مستقیم تر و خواناتر است و به طور ضمنی بهینهترین روش اتصال دو جدول را انتخاب میکند. همچنین، استفاده از JOIN معمولاً در کوئریهای پیچیدهتر و وابستگیهای بیشتر بین جداول مفیدتر است، زیرا به شما امکان اتصال جدولها بر اساس شرایط مشترک را میدهد و نتایج را به صورت یکپارچهتر و منظمتر برگرداند.
#SQL
@code_crafters
دو جدول فرضی را در نظر بگیرید
۱. جدول User با مقادیر Id, user_name , phone_number
۲.جدول Book با مقادیر Id, name, price, phone_number
(در واقعیت جدول Book به جدول User با کلید خارجی متصل میشود ولی در این مثال از این مورد چشم پوشی شده است )
اگر بخواهیم با استفاده از WHERE اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم، میتوانیم از کوئری زیر استفاده کنیم:
SELECT *
FROM User, Book
WHERE User.phone_number = Book.phone_number;
این کوئری تمام رکوردهایی را انتخاب میکند که مقدار phone_number آنها در هر دو جدول یکسان است.
همچنین، میتوانیم با استفاده از JOIN اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم. این مثال را با استفاده از JOIN به صورت زیر توسعه میدهیم:
SELECT *
FROM User
JOIN Book ON User.phone_number = Book.phone_number;
این کوئری نیز تمام رکوردهایی را انتخاب میکند که مقدار phone_number آنها در هر دو جدول یکسان است. با استفاده از JOIN، ما رکوردهای مشابه را از دو جدول به هم متصل میکنیم تا نتایج را بدست آوریم.
تفاوت اصلی در استفاده از WHERE و JOIN در این مثال، در نحوه نوشتن کوئری است. استفاده از JOIN به صورت مستقیم تر و خواناتر است و به طور ضمنی بهینهترین روش اتصال دو جدول را انتخاب میکند. همچنین، استفاده از JOIN معمولاً در کوئریهای پیچیدهتر و وابستگیهای بیشتر بین جداول مفیدتر است، زیرا به شما امکان اتصال جدولها بر اساس شرایط مشترک را میدهد و نتایج را به صورت یکپارچهتر و منظمتر برگرداند.
#SQL
@code_crafters
👍4❤1🔥1
از جدول "CITY"، برای تمام شهرهای ایران که جمعیت آنها بیشتر از 120000 نفر است، فیلد "NAME" را استعلام کنید. کد کشور برای ایران "IR" است.
سطح : بسیار آسان
راهنمایی :استفاده از WHERE !!!
#SQL
@Code_Crafters
سطح : بسیار آسان
راهنمایی :
#SQL
@Code_Crafters
CodeCrafters
از جدول "CITY"، برای تمام شهرهای ایران که جمعیت آنها بیشتر از 120000 نفر است، فیلد "NAME" را استعلام کنید. کد کشور برای ایران "IR" است. سطح : بسیار آسان راهنمایی : استفاده از WHERE !!! #SQL @Code_Crafters
با توجه به جدول City :
سوال :فهرست نامهای CITY که با حروف صدادار (یعنی a، e، i، o یا u) شروع میشوند را از STATION جستجو کنید. نتیجه شما نمی تواند حاوی موارد تکراری باشد.
سطح : آسان
راهنمایی :جز استفاده از WHERE که برای ایجاد شرط در SQL است باید از تابع های درونی مثل RIGHT یا LEFT استفاده کنید. میتوانید در بعضی پایگاه داده ها مثل MySQL نیز از RLIKE استفاده کنید که براساس ReGex بررسی میکند البته از LIKE نیز میتواند استفاده کرد . برای بخش جلوگیری از موارد تکراری میتوانید از Distinct استفاده کنید .در کل این کوئری را به روش های زیادی میتوان نوشت !!
#SQL
@Code_Crafters
سوال :فهرست نامهای CITY که با حروف صدادار (یعنی a، e، i، o یا u) شروع میشوند را از STATION جستجو کنید. نتیجه شما نمی تواند حاوی موارد تکراری باشد.
سطح : آسان
راهنمایی :
#SQL
@Code_Crafters
پرسش: با توجه به جداول CITY و COUNTRY، نام همه قارهها (COUNTRY.Continent) و میانگین جمعیت شهر مربوطه (CITY.Population) را که به نزدیکترین عدد صحیح گرد شده است، جستجو کنید.
نکته :از CITY.CountryCode و COUNTRY.Code برای JOIN زدن استفاده کنید.
سطح : متوسط
راهنمایی : استفاده از تابع های درونی AVG برای میانگین گیری و FLOOR برای گرفتن نزدیک ترین عدد صحیح و همچنین JOIN زدن بین دو جدول و در نهایت استفاده از GROUP .
#SQL
@Code_Crafters
نکته :از CITY.CountryCode و COUNTRY.Code برای JOIN زدن استفاده کنید.
سطح : متوسط
راهنمایی :
#SQL
@Code_Crafters
سطح : پیشرفته - چالشی
شکل زیر :
را در نظر بگیرید که تابع P(5)را نشان میدهد
شما کوئری را بنویسید که این شکل را تا ۲۰ ستاره یا P(20 )را پرینت کند
راهنمایی :میتوان از WITH و UNION ALL برای ایجاد یک جدول مجازی استفاده کرد که حاوی تمام حالتهای ممکن از تعداد ستارهها است. سپس، میتوان از تابع REPEAT در MySQL برای تکرار این چرخه تا زمانی که تعداد ستارهها به ۲۰ برسد، استفاده کرد.
#SQL
@Code_Crafters
شکل زیر :
sql
*****
****
***
**
*
را در نظر بگیرید که تابع P(5)را نشان میدهد
شما کوئری را بنویسید که این شکل را تا ۲۰ ستاره یا P(20 )را پرینت کند
راهنمایی :
#SQL
@Code_Crafters
نکته ای باید در نظر بگیرد این است که به صورت پیشفرض پایگاه داده MySQL در نظر گرفته شده است .
و اینکه طبقه بندی ها بر اساس دانش لازم از SQL است .
جواب ها تا فردا یا اگر تعداد زیادی سوال را جواب دادند زودتر قرار خواهد گرفت .
راهنمایی ها سعی بر روشن کردن مسیر بوده و جواب نهایی نیستند!!!
جوابتون را کامنت کنید تست میکنم
#SQL
@Code_Crafters
و اینکه طبقه بندی ها بر اساس دانش لازم از SQL است .
جواب ها تا فردا یا اگر تعداد زیادی سوال را جواب دادند زودتر قرار خواهد گرفت .
راهنمایی ها سعی بر روشن کردن مسیر بوده و جواب نهایی نیستند!!!
جوابتون را کامنت کنید تست میکنم
#SQL
@Code_Crafters
❤3
راههایی برای بهینهسازی کوئریهای SQL
پایگاه داده جزء ضروری بسیاری از سازمانها در دنیای دادهمحور امروزی تبدیل شدهاند. با توجه به اینکه بسیاری از شرکتها دادههای خود را در فضای ابری پردازش و ذخیره میکنند، بهینهسازی کوئریها از اهمیت بیشتری برای بهبود عملکرد و کاهش هزینهها برخوردار شده است.
در این مقاله، به بررسی تکنیکهای موثری برای افزایش سرعت عملکرد کوئریهای SQL میپردازیم. چندین راه برای بهینهسازی کوئریهای SQL وجود دارد که در ادامه توضیح داده شدهاند.
1. کاهش استفاده از کاراکترهای وایلدکارت (wildcard)
استفاده از کاراکترهای وایلدکارت مانند % و _ در کوئریهای SQL میتواند عملکرد کوئری را کند کند. زمانی که از کاراکترهای وایلدکارت استفاده میشود، پایگاه داده باید کل جدول را برای یافتن دادههای مرتبط بررسی کند. برای بهینهسازی کوئریهای SQL، لازم است استفاده از کاراکترهای وایلدکارت را به حداقل برسانیم و تنها در مواقع ضروری از آنها استفاده کنیم.
به عنوان مثال، برای یافتن تمام مشتریانی که نام خانوادگی شهرشان با حرف "P" شروع میشود، کوئری زیر استفاده میشود:
این کوئری کار میکند، اما کندتر از کوئری است که از ایندکس (Index) استفاده میکند. میتوان کوئری را با افزودن ایندکس به ستون last_name_city بهبود بخشید و آن را به شکل زیر نوشت:
این کوئری از ایندکس استفاده میکند و سریعتر از کوئری قبلی خواهد بود.
2. افزایش عملکرد کوئری با استفاده از ایندکسها
استفاده از ایندکسها میتواند سرعت کوئریهای SQL را افزایش دهد، زیرا پایگاه داده میتواند به سرعت ورودیهایی را که با معیارهای خاصی مطابقت دارند پیدا کند. ایندکسگذاری فرآیندی است که مقادیر یک یا چند ستون از یک جدول را به یک مقدار منحصر به فرد نقشهبرداری میکند که جستجوی ردیفهایی که با یک مقدار خاص یا محدودهای از مقادیر مطابقت دارند را آسان میکند.
برای بهبود کوئریهای SQL، میتوان ایندکسهایی بر روی ستونهایی که به طور مکرر در عبارات WHERE، JOIN و ORDER BY استفاده میشوند ایجاد کرد. اما ایجاد ایندکسهای زیاد میتواند عملیات اصلاح دادهها مانند INSERT، UPDATE و DELETE را کند کند. در انتخاب ستونهایی که باید ایندکس شوند و نوع ایندکسهایی که باید استفاده شوند، باید تعادلی بین عملکرد خواندن و نوشتن برقرار کرد.
برای یافتن تمام سفارشهایی که توسط یک مشتری خاص انجام شدهاند، میتوان از کوئری زیر استفاده کرد:
اگر جدول سفارشها حاوی تعداد زیادی رکورد باشد، این کوئری ممکن است زمان زیادی طول بکشد زیرا پایگاه داده باید کل جدول را برای یافتن ورودیهای مطابق با شماره مشتری جستجو کند. میتوان یک ایندکس بر روی ستون customer_number ایجاد کرد تا کوئری بهبود یابد:
این ایندکس بر روی ستون customer_number جدول orders ایجاد میشود. حالا وقتی کوئری را اجرا میکنید، پایگاه داده میتواند با استفاده از ایندکس، به سرعت ردیفهایی که با شماره مشتری مطابقت دارند را پیدا کند که میتواند عملکرد کوئری را بهبود بخشد.
3. استفاده از نوع دادههای مناسب
استفاده از نوع دادههای مناسب برای ستونها در یک پایگاه داده میتواند به طور قابل توجهی عملکرد کوئریها را بهبود بخشد. به عنوان مثال، استفاده از نوع داده عددی برای ستونی که حاوی مقادیر عددی است میتواند باعث شود کوئریها سریعتر از زمانی که نوع داده متنی استفاده میشود اجرا شوند. استفاده از نوع داده صحیح همچنین به تضمین یکپارچگی دادهها کمک میکند و میتواند از خطاهای تبدیل داده جلوگیری کند.
فرض کنید جدولی داریم که هر ردیف آن نمایانگر جزئیات سفارشهای یک فروشگاه خردهفروشی است. این جدول ستونهایی برای شناسه سفارش، شناسه مشتری، تاریخ سفارش و مجموع سفارش دارد. ستون مجموع سفارش حاوی مقادیر عددی است. اگر ستون مجموع سفارش به عنوان نوع داده متنی ذخیره شود، کوئریهایی که محاسبات روی مجموع سفارش انجام میدهند کندتر از زمانی خواهد بود که ستون به عنوان نوع داده عددی ذخیره شده باشد.
#SQL
@Code_Crafters
پایگاه داده جزء ضروری بسیاری از سازمانها در دنیای دادهمحور امروزی تبدیل شدهاند. با توجه به اینکه بسیاری از شرکتها دادههای خود را در فضای ابری پردازش و ذخیره میکنند، بهینهسازی کوئریها از اهمیت بیشتری برای بهبود عملکرد و کاهش هزینهها برخوردار شده است.
در این مقاله، به بررسی تکنیکهای موثری برای افزایش سرعت عملکرد کوئریهای SQL میپردازیم. چندین راه برای بهینهسازی کوئریهای SQL وجود دارد که در ادامه توضیح داده شدهاند.
1. کاهش استفاده از کاراکترهای وایلدکارت (wildcard)
استفاده از کاراکترهای وایلدکارت مانند % و _ در کوئریهای SQL میتواند عملکرد کوئری را کند کند. زمانی که از کاراکترهای وایلدکارت استفاده میشود، پایگاه داده باید کل جدول را برای یافتن دادههای مرتبط بررسی کند. برای بهینهسازی کوئریهای SQL، لازم است استفاده از کاراکترهای وایلدکارت را به حداقل برسانیم و تنها در مواقع ضروری از آنها استفاده کنیم.
به عنوان مثال، برای یافتن تمام مشتریانی که نام خانوادگی شهرشان با حرف "P" شروع میشود، کوئری زیر استفاده میشود:
SELECT * FROM customers WHERE last_name_city LIKE 'P%';
این کوئری کار میکند، اما کندتر از کوئری است که از ایندکس (Index) استفاده میکند. میتوان کوئری را با افزودن ایندکس به ستون last_name_city بهبود بخشید و آن را به شکل زیر نوشت:
SELECT * FROM customers WHERE last_name_city >= 'P' AND last_name < 'Q';
این کوئری از ایندکس استفاده میکند و سریعتر از کوئری قبلی خواهد بود.
2. افزایش عملکرد کوئری با استفاده از ایندکسها
استفاده از ایندکسها میتواند سرعت کوئریهای SQL را افزایش دهد، زیرا پایگاه داده میتواند به سرعت ورودیهایی را که با معیارهای خاصی مطابقت دارند پیدا کند. ایندکسگذاری فرآیندی است که مقادیر یک یا چند ستون از یک جدول را به یک مقدار منحصر به فرد نقشهبرداری میکند که جستجوی ردیفهایی که با یک مقدار خاص یا محدودهای از مقادیر مطابقت دارند را آسان میکند.
برای بهبود کوئریهای SQL، میتوان ایندکسهایی بر روی ستونهایی که به طور مکرر در عبارات WHERE، JOIN و ORDER BY استفاده میشوند ایجاد کرد. اما ایجاد ایندکسهای زیاد میتواند عملیات اصلاح دادهها مانند INSERT، UPDATE و DELETE را کند کند. در انتخاب ستونهایی که باید ایندکس شوند و نوع ایندکسهایی که باید استفاده شوند، باید تعادلی بین عملکرد خواندن و نوشتن برقرار کرد.
برای یافتن تمام سفارشهایی که توسط یک مشتری خاص انجام شدهاند، میتوان از کوئری زیر استفاده کرد:
SELECT * FROM orders WHERE customer_number = 2154;
اگر جدول سفارشها حاوی تعداد زیادی رکورد باشد، این کوئری ممکن است زمان زیادی طول بکشد زیرا پایگاه داده باید کل جدول را برای یافتن ورودیهای مطابق با شماره مشتری جستجو کند. میتوان یک ایندکس بر روی ستون customer_number ایجاد کرد تا کوئری بهبود یابد:
CREATE INDEX idx_orders_customer_number ON orders (customer_id);
این ایندکس بر روی ستون customer_number جدول orders ایجاد میشود. حالا وقتی کوئری را اجرا میکنید، پایگاه داده میتواند با استفاده از ایندکس، به سرعت ردیفهایی که با شماره مشتری مطابقت دارند را پیدا کند که میتواند عملکرد کوئری را بهبود بخشد.
3. استفاده از نوع دادههای مناسب
استفاده از نوع دادههای مناسب برای ستونها در یک پایگاه داده میتواند به طور قابل توجهی عملکرد کوئریها را بهبود بخشد. به عنوان مثال، استفاده از نوع داده عددی برای ستونی که حاوی مقادیر عددی است میتواند باعث شود کوئریها سریعتر از زمانی که نوع داده متنی استفاده میشود اجرا شوند. استفاده از نوع داده صحیح همچنین به تضمین یکپارچگی دادهها کمک میکند و میتواند از خطاهای تبدیل داده جلوگیری کند.
فرض کنید جدولی داریم که هر ردیف آن نمایانگر جزئیات سفارشهای یک فروشگاه خردهفروشی است. این جدول ستونهایی برای شناسه سفارش، شناسه مشتری، تاریخ سفارش و مجموع سفارش دارد. ستون مجموع سفارش حاوی مقادیر عددی است. اگر ستون مجموع سفارش به عنوان نوع داده متنی ذخیره شود، کوئریهایی که محاسبات روی مجموع سفارش انجام میدهند کندتر از زمانی خواهد بود که ستون به عنوان نوع داده عددی ذخیره شده باشد.
#SQL
@Code_Crafters
🔥4
4. اجتناب از استفاده از زیرکوئریها (subqueries)
زیرکوئریها میتوانند عملکرد کوئری را کند کنند، به خصوص زمانی که در عبارات WHERE یا HAVING استفاده میشوند. لازم است تا حد ممکن از زیرکوئریها اجتناب شود و از JOIN یا تکنیکهای دیگر استفاده شود.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند، کوئری زیر از یک زیرکوئری برای یافتن تمامی شناسههای سفارش در 30 روز گذشته استفاده میکند:
این کوئری کار میکند، اما کندتر از کوئری است که از JOIN برای یافتن دادههای مرتبط استفاده میکند. کوئری زیر از JOIN برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند استفاده میکند:
این کوئری جدول customers را با جدول orders پیوند میدهد و اطلاعات تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند را بازیابی میکند. این کوئری سریعتر از کوئری قبلی خواهد بود زیرا از زیرکوئری استفاده نمیکند.
5. استفاده از LIMIT یا TOP برای محدود کردن تعداد ردیفهای بازگشتی
باید از عبارت LIMIT یا TOP برای محدود کردن تعداد ردیفهای بازگشتی در کوئریهای SQL استفاده شود. این کار باعث میشود دادههای کمتری پردازش و بازگردانده شود.
(این مورد بستگی به نوع پایگاه داده دارد مثلا SQL Server از Top پشتیبانی میکند در حالی که PostgreSQL و MySQL از Limit پشتیبانی میکنند )
برای مثال، اگر بخواهیم تمامی مشتریانی که در 27 روز گذشته سفارشی ثبت کردهاند را پیدا کنیم و تعداد زیادی از مشتریان در این مدت سفارش دادهاند، کوئری میتواند تعداد زیادی ردیف بازگرداند. این کوئری را میتوان با استفاده از LIMIT یا TOP بهینه کرد. کوئری زیر تعداد ردیفهای بازگشتی را به 10 محدود میکند:
این کوئری تنها 10 ردیف اولی که با معیارها مطابقت دارند را بازمیگرداند که باعث بهبود عملکرد کوئری خواهد شد.
6. اجتناب از استفاده از SELECT *
استفاده از عبارت SELECT * میتواند عملکرد کوئری را کند کند زیرا تمامی ستونهای یک جدول را بازمیگرداند، حتی آنهایی که برای کوئری لازم نیستند. برای بهینهسازی کوئریهای SQL، مهم است که تنها ستونهایی را که برای کوئری لازم هستند انتخاب کنید.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند، کوئری زیر تمامی ستونها از جدول customers را انتخاب میکند:
برای بهینهسازی این کوئری، میتوان عبارت SELECT را تغییر داد تا تنها ستونهای مورد نیاز را انتخاب کند:
این کوئری تنها ستونهای customer_id، first_name و last_name را انتخاب میکند که عملکرد کوئری را بهبود میبخشد.
#SQL
@Code_Crafters
زیرکوئریها میتوانند عملکرد کوئری را کند کنند، به خصوص زمانی که در عبارات WHERE یا HAVING استفاده میشوند. لازم است تا حد ممکن از زیرکوئریها اجتناب شود و از JOIN یا تکنیکهای دیگر استفاده شود.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند، کوئری زیر از یک زیرکوئری برای یافتن تمامی شناسههای سفارش در 30 روز گذشته استفاده میکند:
```
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));
این کوئری کار میکند، اما کندتر از کوئری است که از JOIN برای یافتن دادههای مرتبط استفاده میکند. کوئری زیر از JOIN برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند استفاده میکند:
SELECT DISTINCT c.* FROM customers c JOIN orders o ON c.customer_id = o.customer_id WHERE o.order_date >= DATEADD(day, -30, GETDATE());
این کوئری جدول customers را با جدول orders پیوند میدهد و اطلاعات تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند را بازیابی میکند. این کوئری سریعتر از کوئری قبلی خواهد بود زیرا از زیرکوئری استفاده نمیکند.
5. استفاده از LIMIT یا TOP برای محدود کردن تعداد ردیفهای بازگشتی
باید از عبارت LIMIT یا TOP برای محدود کردن تعداد ردیفهای بازگشتی در کوئریهای SQL استفاده شود. این کار باعث میشود دادههای کمتری پردازش و بازگردانده شود.
(این مورد بستگی به نوع پایگاه داده دارد مثلا SQL Server از Top پشتیبانی میکند در حالی که PostgreSQL و MySQL از Limit پشتیبانی میکنند )
برای مثال، اگر بخواهیم تمامی مشتریانی که در 27 روز گذشته سفارشی ثبت کردهاند را پیدا کنیم و تعداد زیادی از مشتریان در این مدت سفارش دادهاند، کوئری میتواند تعداد زیادی ردیف بازگرداند. این کوئری را میتوان با استفاده از LIMIT یا TOP بهینه کرد. کوئری زیر تعداد ردیفهای بازگشتی را به 10 محدود میکند:
SELECT TOP 10 * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -27, GETDATE()));
این کوئری تنها 10 ردیف اولی که با معیارها مطابقت دارند را بازمیگرداند که باعث بهبود عملکرد کوئری خواهد شد.
6. اجتناب از استفاده از SELECT *
استفاده از عبارت SELECT * میتواند عملکرد کوئری را کند کند زیرا تمامی ستونهای یک جدول را بازمیگرداند، حتی آنهایی که برای کوئری لازم نیستند. برای بهینهسازی کوئریهای SQL، مهم است که تنها ستونهایی را که برای کوئری لازم هستند انتخاب کنید.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند، کوئری زیر تمامی ستونها از جدول customers را انتخاب میکند:
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));
برای بهینهسازی این کوئری، میتوان عبارت SELECT را تغییر داد تا تنها ستونهای مورد نیاز را انتخاب کند:
SELECT customer_id, first_name, last_name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));
این کوئری تنها ستونهای customer_id، first_name و last_name را انتخاب میکند که عملکرد کوئری را بهبود میبخشد.
#SQL
@Code_Crafters
❤2
یه مورد دیگه ای هم خودم اضافه کنم که به نظرم لازمه گاهی اوقات لازمه که یک همچنین کوئری بزنید که بررسی کند که یک مقداری وجود دارد یا خیر که در نوشتن پروسیجر ها بسیار مرسوم است:
در حالی که شما هیچ نیازی به موارد پاس داده شده از طرف جدول ندارید
پس میتوانید کوئری خود را به این صورت اصلاح کنید که بهتر است
به جای عملکرد * از عدد یا حروف به شکل 'A' میتوان استفاده کرد که اگر مقداری با شرط ما پیدا کرد را برگرداند که عملکرد بهتری دارد
در این کد بخش های پرینت و شرط و.. T- SQL است و به موضوع پست مربوط نیست تنها قصدم نشان دادن کاربردی تره موضوع بود.
#SQL
@Code_Crafters
IF EXISTS(SELECT * FROM dbo.Employee AS em WHERE em.Id = 1)
BEGIN
PRINT('exist')
RETURN;
END
PRINT('not found')
در حالی که شما هیچ نیازی به موارد پاس داده شده از طرف جدول ندارید
پس میتوانید کوئری خود را به این صورت اصلاح کنید که بهتر است
IF EXISTS(SELECT 1 FROM dbo.Employee AS em WHERE em.Id = 1)
BEGIN
PRINT('exist')
RETURN ;
END
PRINT('not found')
به جای عملکرد * از عدد یا حروف به شکل 'A' میتوان استفاده کرد که اگر مقداری با شرط ما پیدا کرد را برگرداند که عملکرد بهتری دارد
#SQL
@Code_Crafters
❤2👍2😁1
7. استفاده از EXISTS به جای IN
عبارت IN یک مقدار را با لیستی از مقادیر بازگشتی از یک زیرکوئری مقایسه میکند. با این حال، استفاده از IN میتواند عملکرد کوئری را کند کند زیرا نیازمند اسکن کامل جدول بر روی زیرکوئری است. برای بهینهسازی کوئریهای SQL، میتوان از EXISTS به جای IN استفاده کرد.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند:
این کوئری از IN برای مقایسه شناسه مشتری با لیست شناسههای مشتری بازگشتی از زیرکوئری
استفاده میکند. برای بهینهسازی کوئری، میتوان از EXISTS به جای IN استفاده کرد:
این کوئری از EXISTS برای بررسی اینکه آیا ردیف مطابقی در جدول orders وجود دارد یا خیر استفاده میکند. این میتواند عملکرد کوئری را با اجتناب از اسکن کامل جدول بهبود بخشد.
8. استفاده از GROUP BY برای گروهبندی دادهها
عبارت GROUP BY برای گروهبندی ردیفها بر اساس یک یا چند ستون استفاده میشود. این میتواند برای خلاصه کردن دادهها یا انجام توابع تجمعی بر روی گروههای داده مفید باشد. با این حال، استفاده از GROUP BY میتواند عملکرد کوئری را کند کند اگر به طور غیرضروری استفاده شود. برای بهینهسازی کوئریهای SQL، باید تنها زمانی که ضروری است از GROUP BY استفاده کرد.
به عنوان مثال، برای یافتن تعداد کل سفارشهای انجام شده توسط هر مشتری:
این کوئری از GROUP BY برای گروهبندی ردیفها بر اساس شناسه مشتری و شمارش تعداد سفارشهای انجام شده توسط هر مشتری استفاده میکند. برای بهینهسازی کوئری، میتوان از زیرکوئری برای بازیابی اطلاعات مشتری و پیوند آن با جدول orders استفاده کرد:
این کوئری از زیرکوئری برای محاسبه تعداد سفارشهای انجام شده توسط هر مشتری استفاده میکند و سپس نتیجه را با جدول customers برای بازیابی اطلاعات مشتری پیوند میدهد. این اجتناب از استفاده از GROUP BY میکند و میتواند عملکرد کوئری را بهبود بخشد.
9. استفاده از رویههای ذخیرهشده (Stored Procedures)
رویههای ذخیرهشده (Stored Procedures) دستورات SQL پیشکامپایل شدهای هستند که در پایگاه داده ذخیره میشوند. آنها میتوانند از یک برنامه یا مستقیماً از یک کوئری SQL فراخوانی شوند. استفاده از رویههای ذخیرهشده میتواند عملکرد کوئری را با کاهش مقدار دادهای که بین پایگاه داده و برنامه ارسال میشود و با کاهش زمان لازم برای کامپایل و اجرای دستورات SQL بهبود بخشد.
#SQL
@Code_Crafters
عبارت IN یک مقدار را با لیستی از مقادیر بازگشتی از یک زیرکوئری مقایسه میکند. با این حال، استفاده از IN میتواند عملکرد کوئری را کند کند زیرا نیازمند اسکن کامل جدول بر روی زیرکوئری است. برای بهینهسازی کوئریهای SQL، میتوان از EXISTS به جای IN استفاده کرد.
به عنوان مثال، برای یافتن تمامی مشتریانی که در 30 روز گذشته سفارشی ثبت کردهاند:
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));
این کوئری از IN برای مقایسه شناسه مشتری با لیست شناسههای مشتری بازگشتی از زیرکوئری
استفاده میکند. برای بهینهسازی کوئری، میتوان از EXISTS به جای IN استفاده کرد:
SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id AND o.order_date >= DATEADD(day, -30, GETDATE()));
این کوئری از EXISTS برای بررسی اینکه آیا ردیف مطابقی در جدول orders وجود دارد یا خیر استفاده میکند. این میتواند عملکرد کوئری را با اجتناب از اسکن کامل جدول بهبود بخشد.
8. استفاده از GROUP BY برای گروهبندی دادهها
عبارت GROUP BY برای گروهبندی ردیفها بر اساس یک یا چند ستون استفاده میشود. این میتواند برای خلاصه کردن دادهها یا انجام توابع تجمعی بر روی گروههای داده مفید باشد. با این حال، استفاده از GROUP BY میتواند عملکرد کوئری را کند کند اگر به طور غیرضروری استفاده شود. برای بهینهسازی کوئریهای SQL، باید تنها زمانی که ضروری است از GROUP BY استفاده کرد.
به عنوان مثال، برای یافتن تعداد کل سفارشهای انجام شده توسط هر مشتری:
SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id;
این کوئری از GROUP BY برای گروهبندی ردیفها بر اساس شناسه مشتری و شمارش تعداد سفارشهای انجام شده توسط هر مشتری استفاده میکند. برای بهینهسازی کوئری، میتوان از زیرکوئری برای بازیابی اطلاعات مشتری و پیوند آن با جدول orders استفاده کرد:
SELECT c.customer_id, c.first_name, c.last_name, o.order_count FROM customers c JOIN (SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id) o ON c.customer_id = o.customer_id;
این کوئری از زیرکوئری برای محاسبه تعداد سفارشهای انجام شده توسط هر مشتری استفاده میکند و سپس نتیجه را با جدول customers برای بازیابی اطلاعات مشتری پیوند میدهد. این اجتناب از استفاده از GROUP BY میکند و میتواند عملکرد کوئری را بهبود بخشد.
9. استفاده از رویههای ذخیرهشده (Stored Procedures)
رویههای ذخیرهشده (Stored Procedures) دستورات SQL پیشکامپایل شدهای هستند که در پایگاه داده ذخیره میشوند. آنها میتوانند از یک برنامه یا مستقیماً از یک کوئری SQL فراخوانی شوند. استفاده از رویههای ذخیرهشده میتواند عملکرد کوئری را با کاهش مقدار دادهای که بین پایگاه داده و برنامه ارسال میشود و با کاهش زمان لازم برای کامپایل و اجرای دستورات SQL بهبود بخشد.
#SQL
@Code_Crafters
🔥3👍2😁1
10. بهینهسازی طراحی پایگاه داده
بهینهسازی طراحی پایگاه داده نیز میتواند عملکرد کوئری را بهبود بخشد. این شامل اطمینان از نرمالسازی صحیح جداول و استفاده مؤثر از ایندکسها است. علاوه بر این، مهم است که پایگاه داده برای بار کاری مورد انتظار به درستی تنظیم شود و برای سطح مناسب همزمانی (Concurrency) پیکربندی شود.
11. استفاده از ابزارهای بهینهسازی کوئری
انواع مختلفی از ابزارهای بهینهسازی کوئری موجود هستند که میتوانند به شناسایی مشکلات عملکرد در کوئریهای SQL کمک کنند. این ابزارها میتوانند توصیههایی برای بهبود عملکرد کوئریها ارائه دهند، مانند ایجاد ایندکسها، بازنویسی کوئریها یا بهینهسازی طراحی پایگاه داده. برخی از ابزارهای محبوب بهینهسازی کوئری شامل Microsoft SQL Server Query Optimizer، Oracle SQL Developer و MySQL Query Optimizer هستند.
12. مانیتورینگ عملکرد کوئری
مانیتورینگ عملکرد کوئری یک گام مهم در بهینهسازی کوئریهای SQL است. با مانیتورینگ عملکرد کوئری، میتوان مشکلات عملکرد را شناسایی و تنظیمات مناسب را انجام داد. این میتواند شامل بهینهسازی ایندکسها، بازنویسی کوئریها یا تنظیم طراحی پایگاه داده باشد. برای ردیابی عملکرد کوئری، تعدادی ابزار موجود است، از جمله SQL Server Profiler، Oracle Enterprise Manager و MySQL Enterprise Monitor.
نتیجهگیری
بهینهسازی کوئریهای SQL برای عملکرد سریعتر یک گام مهم در اطمینان از اجرای کارآمد برنامههای پایگاه داده است. از طریق این مقاله، میتوانیم به نکات زیر برسیم:
- ایندکسگذاری مؤثرترین تکنیک برای افزایش عملکرد کوئریهای SQL است، اما باید ملاحظات بین عملکرد خواندن و نوشتن را در نظر گرفت و تصمیمگیری کرد که کدام ستونها باید ایندکس شوند و کدام نوع ایندکسها باید استفاده شوند.(ایندکس ها مثل چاقو دو لبه هستند اگر اشتباه استفاده شوند میتوانند موجب سربار شوند اعمال کردن آنها به درستی نیاز به کمی تخصص دارد )
- بهینهسازی کوئریهای SQL یک فرآیند پیوسته است و نیاز به مانیتورینگ و تنظیمات منظم برای اطمینان از بهبود مداوم عملکرد دارد.
- باید استفاده از عملیات هزینهبر مانند JOIN، GROUP BY، IN و زیرکوئریها را به حداقل رساند تا عملکرد بهبود یابد.
- کوئریها را بر روی مجموعههای داده واقعی آزمایش کنید تا اطمینان حاصل شود که بهینهسازیها تأثیر مطلوبی دارند.
منبع
#SQL
@Code_Crafters
بهینهسازی طراحی پایگاه داده نیز میتواند عملکرد کوئری را بهبود بخشد. این شامل اطمینان از نرمالسازی صحیح جداول و استفاده مؤثر از ایندکسها است. علاوه بر این، مهم است که پایگاه داده برای بار کاری مورد انتظار به درستی تنظیم شود و برای سطح مناسب همزمانی (Concurrency) پیکربندی شود.
11. استفاده از ابزارهای بهینهسازی کوئری
انواع مختلفی از ابزارهای بهینهسازی کوئری موجود هستند که میتوانند به شناسایی مشکلات عملکرد در کوئریهای SQL کمک کنند. این ابزارها میتوانند توصیههایی برای بهبود عملکرد کوئریها ارائه دهند، مانند ایجاد ایندکسها، بازنویسی کوئریها یا بهینهسازی طراحی پایگاه داده. برخی از ابزارهای محبوب بهینهسازی کوئری شامل Microsoft SQL Server Query Optimizer، Oracle SQL Developer و MySQL Query Optimizer هستند.
12. مانیتورینگ عملکرد کوئری
مانیتورینگ عملکرد کوئری یک گام مهم در بهینهسازی کوئریهای SQL است. با مانیتورینگ عملکرد کوئری، میتوان مشکلات عملکرد را شناسایی و تنظیمات مناسب را انجام داد. این میتواند شامل بهینهسازی ایندکسها، بازنویسی کوئریها یا تنظیم طراحی پایگاه داده باشد. برای ردیابی عملکرد کوئری، تعدادی ابزار موجود است، از جمله SQL Server Profiler، Oracle Enterprise Manager و MySQL Enterprise Monitor.
نتیجهگیری
بهینهسازی کوئریهای SQL برای عملکرد سریعتر یک گام مهم در اطمینان از اجرای کارآمد برنامههای پایگاه داده است. از طریق این مقاله، میتوانیم به نکات زیر برسیم:
- ایندکسگذاری مؤثرترین تکنیک برای افزایش عملکرد کوئریهای SQL است، اما باید ملاحظات بین عملکرد خواندن و نوشتن را در نظر گرفت و تصمیمگیری کرد که کدام ستونها باید ایندکس شوند و کدام نوع ایندکسها باید استفاده شوند.(ایندکس ها مثل چاقو دو لبه هستند اگر اشتباه استفاده شوند میتوانند موجب سربار شوند اعمال کردن آنها به درستی نیاز به کمی تخصص دارد )
- بهینهسازی کوئریهای SQL یک فرآیند پیوسته است و نیاز به مانیتورینگ و تنظیمات منظم برای اطمینان از بهبود مداوم عملکرد دارد.
- باید استفاده از عملیات هزینهبر مانند JOIN، GROUP BY، IN و زیرکوئریها را به حداقل رساند تا عملکرد بهبود یابد.
- کوئریها را بر روی مجموعههای داده واقعی آزمایش کنید تا اطمینان حاصل شود که بهینهسازیها تأثیر مطلوبی دارند.
منبع
#SQL
@Code_Crafters
🔥3😁1
حضور CTEs در دیتابیس و محدودیت ormها
بیایید با یک مثال براتون توضیح بدم، یک پیچیدگی نسبتا معمولی در دیتابیس و کوئریها
یک مدل رو تصور کنید که دوتا فیلد داره
class Model:
id: int(PK)
name: str
parent: FK(self, null)
در نگاه اول این یک مدل کاملا ساده هستش و کاملا هم درست فکر میکنید این یه مدل ساده و ابتدایی هستش، اما منطق تجاری؟؟؟
منطق تجاری از ما میخواد که در ازای یک کوئری تمام والدهای اون object رو بدست بیاریم، تصور کنید که ریشههای تو در تو داخل مدل برای یک object حدود 100 والد وجود داره و برای یک object دیگه ممکنه 1000 والد وجود داشته باشه، منطق تجاری از ما خواسته والد هر آبجکتی که درخواست میشه از مدل رو هم بهش برگردونیم، در دید اول این یک مسئله ساده هستش اما یک منطق تجاری نسبتا پیچیده هستش
خود CTEs ها در دیتابیس چیه؟
بطور خلاصه یکنمای جدولی موقتی هستش که فقط و فقط در طول اجرای همون کوئری وجود دارند. داخل زبان کوئری با استفاده از With همراه با join و on ما یک ساختار درختی رو متصور میشیم و داده مدنظر خودمون رو ازش میکشیم بیرون. جدول موقت اولین گام برای ورود به ادمین پایگاه داده شدن هستش شاید تعجب کنید از این حرف ولی حقیقت داره، در مثال ما یک منطق نسبتا پیچیده مطرح شد (از نوع CTE بازگشتی) کاربرد اصلی CTE در تحلیل داده و مهندسی داده خودش رو نشون میده
چرا محدودیت در orm گفتیم؟؟
در orm ها موارد cte مطرح و پیاده سازی نشده چرا که دلیل اون این هستش که orm ها طراحی شدن بابت queryset های معمولی و نه بابت انجام کوئریهای پیچیده، اینجاست که تو مثال بالا که مطرح کردیم اگه بخوایم از orm استفاده کنیم دچار محدودیت میشیم برای مثال اگه از prefetch استفاده کنیم محدود به انتخاب سطح میشیم بصورت دستی، اگه از زبانهای برنامه نویسی بهره ببریم کارایی و کندی میاد سراغمون، به هر حال تصور درختی دیتابیسی که چندین میلیون رکورد داخلش هست کار راحتی نیستش، به اجبار باید سراغ CTEها بریم
واسه بچههایی که با جنگو کار میکنند یکم تایم بزارید و django-cte و django-treebeard رو بخونید
کتابخونههای زیادی احتمالا پیدا بشه منتها این دوتا رو معرفی میکنم که بابت دو سناریوی مختلف مناسب هستند که خودتون بخونید راجبشون
#sql
#django
@code_crafters
بیایید با یک مثال براتون توضیح بدم، یک پیچیدگی نسبتا معمولی در دیتابیس و کوئریها
یک مدل رو تصور کنید که دوتا فیلد داره
class Model:
id: int(PK)
name: str
parent: FK(self, null)
در نگاه اول این یک مدل کاملا ساده هستش و کاملا هم درست فکر میکنید این یه مدل ساده و ابتدایی هستش، اما منطق تجاری؟؟؟
منطق تجاری از ما میخواد که در ازای یک کوئری تمام والدهای اون object رو بدست بیاریم، تصور کنید که ریشههای تو در تو داخل مدل برای یک object حدود 100 والد وجود داره و برای یک object دیگه ممکنه 1000 والد وجود داشته باشه، منطق تجاری از ما خواسته والد هر آبجکتی که درخواست میشه از مدل رو هم بهش برگردونیم، در دید اول این یک مسئله ساده هستش اما یک منطق تجاری نسبتا پیچیده هستش
خود CTEs ها در دیتابیس چیه؟
بطور خلاصه یکنمای جدولی موقتی هستش که فقط و فقط در طول اجرای همون کوئری وجود دارند. داخل زبان کوئری با استفاده از With همراه با join و on ما یک ساختار درختی رو متصور میشیم و داده مدنظر خودمون رو ازش میکشیم بیرون. جدول موقت اولین گام برای ورود به ادمین پایگاه داده شدن هستش شاید تعجب کنید از این حرف ولی حقیقت داره، در مثال ما یک منطق نسبتا پیچیده مطرح شد (از نوع CTE بازگشتی) کاربرد اصلی CTE در تحلیل داده و مهندسی داده خودش رو نشون میده
چرا محدودیت در orm گفتیم؟؟
در orm ها موارد cte مطرح و پیاده سازی نشده چرا که دلیل اون این هستش که orm ها طراحی شدن بابت queryset های معمولی و نه بابت انجام کوئریهای پیچیده، اینجاست که تو مثال بالا که مطرح کردیم اگه بخوایم از orm استفاده کنیم دچار محدودیت میشیم برای مثال اگه از prefetch استفاده کنیم محدود به انتخاب سطح میشیم بصورت دستی، اگه از زبانهای برنامه نویسی بهره ببریم کارایی و کندی میاد سراغمون، به هر حال تصور درختی دیتابیسی که چندین میلیون رکورد داخلش هست کار راحتی نیستش، به اجبار باید سراغ CTEها بریم
واسه بچههایی که با جنگو کار میکنند یکم تایم بزارید و django-cte و django-treebeard رو بخونید
کتابخونههای زیادی احتمالا پیدا بشه منتها این دوتا رو معرفی میکنم که بابت دو سناریوی مختلف مناسب هستند که خودتون بخونید راجبشون
#sql
#django
@code_crafters
❤4👍1