PDA

View Full Version : افزایش Performance



zahra moeini
شنبه 29 تیر 1392, 14:19 عصر
چگونه می توانم کارایی query زیر را بهتر کنم ؟


select avg(tedad) factorLines,FiscalYear
from (select (COUNT(SALFactorBys.SerialNoFBS)) as tedad,SALFactorHds.SerialNoFHS
from SALFactorBys join SALFactorHds on SerialNoFHS=SerialNoFhsFBS
group by SALFactorHds.SerialNoFHS) as t
join SALFactorHds on t.SerialNoFHS=SALFactorHds.SerialNoFHS
group by FiscalYear


به خاطر AVG و COUNT مجبور شدم select تو در تو بنویسم! چطور میشه اینو بهتر نوشت؟

محمد سلیم آبادی
شنبه 29 تیر 1392, 14:38 عصر
سلام
Query ای که نوشتین بنظرم در بهینه ترین شکلش بسر می بره.
منتها بنظر میرسه که داخل derived table یک join اضافی دارین.
این Query را چک کنید ببیند همان نتیجه مورد نظر را می دهد.

select avg(tedad) factorLines,FiscalYear
from (select COUNT(SerialNoFBS) as tedad, SerialNoFhsFBS
from SALFactorBys
group by SerialNoFhsFBS) as t
join SALFactorHds on t.SerialNoFhsFBS = SALFactorHds.SerialNoFHS
group by FiscalYear

قبل از اجرای Query این کد را اجرا کنید
set statistics io on
و بعد از اجرا آن کد را حذف کنید از Query Editor سپس هر دو Query را اجرا کنید و در قسمت message وضعیت Read ها را بررسی کرده ببینید تغییری حاصل شده است سپس در اینجا نتیجه را ارسال کنید.

ویرایش: کد اصلاح شد

zahra moeini
شنبه 29 تیر 1392, 15:42 عصر
بله حق با شماست یک join اضافه هستش

خروجی در قسمت message به شکل زیر است:

(3 row(s) affected)
Table 'SALFactorHds'. Scan count 10, logical reads 656, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SALFactorBys'. Scan count 5, logical reads 1066, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(3 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SALFactorHds'. Scan count 1, logical reads 120, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SALFactorBys'. Scan count 1, logical reads 357, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

بسیار بسیار از راهنمایی شما مچکرم

بخصوص برای set statistics io on

محمد سلیم آبادی
شنبه 29 تیر 1392, 16:19 عصر
ممنون
بسیار خب این نتیجه ای بود که بدست آمد:

--Your Query
--First Query
Table 'SALFactorHds'. Scan count 10, logical reads 656
Table 'SALFactorBys'. Scan count 5, logical reads 1066

--Rewrite Query
Table 'SALFactorHds'. Scan count 1, logical reads 120
Table 'SALFactorBys'. Scan count 1, logical reads 357

که نشان از بهبود Performance است (هر چه تعداد Scan و Read کمتر باشه عملکرد بهتری داره). حالا سعی میکنیم که با ایندکس سرعت را به حد اکثر ممکن برسونیم برای این منظور نیاز هست که روی Query Editor راست کلیک کرده و گزینه Include Actual Execution Plan را فعال کرده و در Tab کنار Resutls پلن حاصل شده را save کرده در اینجا قرار دهید تا ببینم وضعیت plan در چه حالی هست.

zahra moeini
شنبه 29 تیر 1392, 16:33 عصر
107583

plan بدست آمده به شکل بالا است

محمد سلیم آبادی
شنبه 29 تیر 1392, 16:37 عصر
منظورم تصویرش نبود، خود فایلش بود. روی plan راست کلیک کنید و از گزینه Save Execution Plan AS فایل را ذخیره کنید.

zahra moeini
شنبه 29 تیر 1392, 16:41 عصر
فایل ضمیمه شامل plan می باشد.

جمع هزینه هایی که نوشته به درصد برابر با 101 هستش؟!

محمد سلیم آبادی
شنبه 29 تیر 1392, 16:53 عصر
بهتر همیشه برای جداولی که دارای نام های طولانی هستند نام مستعار در نظر بگیرید که بعدا به راحتی از این نام استفاده کنید مثل این:
select avg(tedad) factorLines,SerialNoSaleManFHS
from (select count(*) as tedad, SerialNoFhsFBS
from SALFactorBys
group by SerialNoFhsFBS) as t
join SALFactorHds h on t.SerialNoFhsFBS = h.SerialNoFHS
group by SerialNoSaleManFHS


این دو ایندکس را ایجاد کنید سپس کوئری فوق را اجرا کنید و آمار (statistics) را همراه با Plan ارسال کنید:
create index ix1 on SALFactorBys (SerialNoFhsFBS)
create index ix2 on SALFactorHds (SerialNoFHS)

zahra moeini
دوشنبه 31 تیر 1392, 08:07 صبح
اجرا کردم و نتیجه پیوست شده
cost بعضی قسمت ها کم شد و بعضی قسمت ها اضافه شد

محمد سلیم آبادی
دوشنبه 31 تیر 1392, 13:11 عصر
این کد را اجرا کنید و برای پی بردن به بهبود عملکرد میتونید statistics رو بررسی کنید. کاهش Reads و Scan نشان از بهبود عملکرد میتونه باشه

drop index ix2 on SALFactorHds
create index ix2 on SALFactorHds (SerialNoFHS,SerialNoSaleManFHS)