۵ نکته برای بهبود سرعت Queryهای شما
بهبود سرعت Query، خیلی ها شاید فکر کنند بهبود بخشیدن Queryهای SQL Server کار چندان جذابی نباشد ، ولی فکر کنید یک Query دارید که ۱۵ دقیقه طول می کشد تا اجرا شود و شما با تخصص خودتان و تغییراتی که روی آن انجام می دهید این عدد را تا ۲ الی ۳ ثانیه کاهش می دهید ، آیا این جذاب نیست؟ در این جا می خواهیم چند نکته کاربردی را در این زمینه بررسی کنیم ، این ها همه ی راه حل ها نیستند و تنها ۵ عدد از هزاران کاری می باشند که شما در زمینه Query Optimization می توانید بیاموزید.
نکاتی درباره بهبود سرعت Query
در این بخش از مقاله می خواهیم چند نکته در رابطه با بهبود سرعت Query در SQL برای شما معرفی کنیم. با ما همراه باشید:
۱- از Sub-Queryها تا جایی که ممکن است بپرهیزید.
select OrderID, (select top 1 Quantity from [Order Details] where OrderID = o.OrderID order by UnitPrice desc) from Orders o order by 1
select o.OrderID, od.Quantity from Orders o inner join ( select OrderID, Quantity, ROW_NUMBER() over (partition by OrderID order by UnitPrice desc) r from [Order Details] ) od on o.OrderID = od.OrderID and r = 1 order by 1 select o.OrderID, od.Quantity
from Orders o
inner join (
select OrderID, Quantity, ROW_NUMBER() over (partition by OrderID order by UnitPrice desc) r
from [Order Details]
) od on o.OrderID = od.OrderID and r = 1
order by 1 select o.OrderID, od.Quantity from Orders o inner join ( select OrderID, Quantity, ROW_NUMBER() over (partition by OrderID order by UnitPrice desc) r from [Order Details] ) od on o.OrderID = od.OrderID and r = 1 order by 1 |
وقتی هر دو Query را با هم اجرا کنیم متوجه می شویم که سرعت اجرای دومی تقریبا دو برار اولی می باشد.
۲- از استفاده OR در شرط JOINها بپرهیزید.
این یکی نتایجی باور نکردنی دارد ، می توانم به جرعت بگویم که هر دفعه در شرط JOIN از OR استفاده می کنید سرعتتان حدقل نصف خواهد شد ،به این دو Query دقت کنید ،
select * from Orders o inner join [Order Details] od on o.OrderID = od.FirstOrderID or o.OrderID = od.SecondOrderID select *
from Orders o
inner join [Order Details] od on o.OrderID = od.FirstOrderID or o.OrderID = od.SecondOrderID select * from Orders o inner join [Order Details] od on o.OrderID = od.FirstOrderID or o.OrderID = od.SecondOrderID |
select * from Orders o inner join [Order Details] od on o.OrderID = od.FirstOrderID union all select * from Orders o inner join [Order Details] od on o.OrderID = od.SecondOrderID select *
from Orders o
inner join [Order Details] od on o.OrderID = od.FirstOrderID
union all
select *
from Orders o
inner join [Order Details] od on o.OrderID = od.SecondOrderID select * from Orders o inner join [Order Details] od on o.OrderID = od.FirstOrderID union all select * from Orders o inner join [Order Details] od on o.OrderID = od.SecondOrderID |
۳- جداول خود را به صورت مناسب Indexگذاری کنید.
۴- یاد بگیرید که از Included Culomns در Indexهایتان استفاده کنید.
SELECT Username, Firstname, Lastname FROM WebUser WHERE Username like 'Bob' SELECT Username, Firstname, Lastname
FROM WebUser
WHERE Username like 'Bob' SELECT Username, Firstname, Lastname FROM WebUser WHERE Username like 'Bob' |
در این مثال با فرض اینکه روی Username تنها گذاشته باشیم ، SQL ابتدا Index مرتبط با Bob را یافته و برای برگرداندن Firstname و Lastname باید به صورت فیزیکی اطلاعات را از روی دیسک بخواند.حال به Index زیر دقت کنید ،
CREATE NONCLUSTERED INDEX IX_WebUser_Username ON dbo.WebUser(Username) INCLUDE (Firstname, Lastname); CREATE NONCLUSTERED INDEX IX_WebUser_Username
ON dbo.WebUser(Username)
INCLUDE (Firstname, Lastname); CREATE NONCLUSTERED INDEX IX_WebUser_Username ON dbo.WebUser(Username) INCLUDE (Firstname, Lastname); |
با این روش به SQL Server گفته ایم تا اطلاعات را بر اساس Username مرتب کرده و جلوی هر Username اطلاعات دیگر یعنی Firsname و Lastname را نیز درج نماید ، حال SQL با یافتن Index برای دریافت مابقی اطلاعات می تواند از اطلاعات Index استفاده کند.
۵- بیشتر از آنچه به آن نیاز دارید اطلاعات برنگردانید.
سعی کنید در Queryهایتان از SELECT * بپرهیزید ، اگر ستونی را بیشتر از آنچه بدان نیاز دارید برگردانید یعنی اینکه SQL باید اطلاعات بیشتری را از دیسک بخواند و این روی عملکرد Query شما تاثیر خواهد گذاشت.
سخن پایانی
بهبود سرعت Query، این نکات میتوانند به شما کمک کنند تا سرعت Queryهای خود را بهبود بخشید و عملکرد بهتری داشته باشید. اگر سوالات بیشتری دارید یا نیاز به راهنمایی بیشتری دارید، خوشحال میشوم کمک کنیم! ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم.
مصطفي زماني
سلام
سادهنویسی و پیاده نکردن منطقهای پیچیده هم تاثیر زیادی در سریع اجرا شدن کوئریها دارد.
با تشکر
احمد رضاپور
با تشکر از آقای فیروزی؛ با اینکه من هنوز این کوئری ها رو خودم تست نکردم اما فکر میکنم نکات خیلی خوبی بیان کردید. توضیحات شما خیلی خوب بود اما بخاطر اینکه قرار است از این ترفندها در پایگاههای بزرگ استفاده کنیم کاش بیشتر وارد ریز مسائل میشدید.
عاطفه حسن پور
با سلام و خسته نباشید عالی بود خیلی خوب توضیح داده بودید
رمضانی
با سلام
فرید طاهری
سلام
دوستان الان مقالاتی که بصورت ترفند و چک لیست است بیشتر در دنیای اطلاعات طالب دارند.
آقای فیروزی از مقاله شما سپاسگزارم.
فرشید علی اکبری
سلام
میلاد فیروزی
حتما
مهدی ربانی ذبیحی
با سلام بسیار عالی و خوب بود وممنون از مهندس طاهری عزیز که که بابت هر مقاله نکات تکمیلی رو ارائه میدن.با تشکر
مسعود طاهری
سلام دوستان
میلاد فیروزی
ممنون از راهنمایی به جای شما