PDA

View Full Version : بهینه ساز کوئری در SQL



micro_bhk
سه شنبه 19 آذر 1392, 13:05 عصر
با سلام

سوالی برام پیش اومده که میخواستم مطرح کنم، در مورد بهینه سازی کوئری در SQL هست

آیا SQL خودش اون کوئری هایی که میزنیم رو به حالت بهینه تبدیل میکنه موفع اجرا یا نه، معمولا تا چه حد

مخصوصا در جوین ها، همونطور که میدونید هزینه جوین بالاست، تو جوین ها این کار اگه انجام میشه به چه صورته؟
آیا لازمه که خودمون تو جوین اول Select رو به صورت داخلی بنویسیم و از نتیجه کوئری برای جوین استفاده کنیم یا خیر؟


با تشکر از راهنماییتون

tooraj_azizi_1035
چهارشنبه 20 آذر 1392, 14:25 عصر
سلام
یک کوئری قبل از اینکه اجرا بشه چندین مرحله پردازش رو طی میکنه: Parsing- Binding- Algebrizing- Optimize و Execute.
فرض کنید جدولی دارید که دارای یک کلید ترکیبی روی دو ستون هست که اجازه مقدار تکرای رو نمیده. یعنی نمیشه در دو ردیف مقادیر دو ستون مثل هم باشند.
مثلا 1 و Ali دو بار تکرار بشوند.
حالا ما یک کوئری می نویسیم که یک Group By روی دو ستون اجرا میکنه:
Select a,b From Table1
Group by a,b
اگه به پلن اجرا نگاه کنیم می بینیم Group By اصلاً اجرا نشده و در پلن نهایی وجود نداره چون بدون Group By هم تمام ردیف ها به نمایش در میان.

در مورد Join ها این خود SQL هست که تصمیم میگیره از چه الگوریتمی استفاده کنه: Nested Loops، Hash , Merge.
بسته به تعداد ردیف های دو جدول یکی از سه تا رو انتخاب میکنه مثلاً برای ردیف های کمتر از حلقه های تو در تو (Nested Loops) استفاده میکنه.

باز نویسی کوئری هم از جمله کارهای دیگر است که SQL اون رو با استفاده از قواعد تبدیل (Transformation Rules) انجام میده این قواعد در نسخه 2012 پیشرفت چشمگیری داشته است.

شما به هر تعداد ممکن که می تونید کوئری برای یک مسئله بنویسید که جواب یکسان داشته باشد در آخر پلن اجرای هر یک را مقایسه و هر کدام کمتر بود ایده آل خواهد بود.
I'll add more...

tooraj_azizi_1035
شنبه 30 آذر 1392, 18:59 عصر
Optimizer برای تولید و بررسی انواع پلن های اجرا برای یک کوئری به شدت وابسته به اشیایی به نام Statistics هست .می تونید این اشیا رو با باز کردن نود جدول مربوطه ببینید.
در حقیقت این اشیا کمک می کنند تا هزینه هر پلن برآورد شده و در نهایت پلن با حداقل هزینه کاندید اجرا می شود.

حمیدرضاصادقیان
شنبه 30 آذر 1392, 22:15 عصر
سلام.
البته شما با دانش در مورد Optimizer به راحتی میتوانید Plan هر Query رو به صورت کامل تشخیص بدید و ببینید چه رفتاری داره انجام میده.