ورود

View Full Version : بهینه تر ؟ جدول شارپ یا کوئری داخلی



کم حوصله
دوشنبه 21 خرداد 1386, 23:23 عصر
می دونیم زمانی که چندین جدول را باهم join میکنیم اگر کوچکترین جدول اولین باشد سرعت بالا می رود. حال اگر مثلا 3 جدول Aو Bو C داشته باشیم که بخواهیم این سه را باهم join بزنیم و تمام شرط ها برروی جدول A باشد کدام بهینه تر می باشد:
1 - 3جدول را باهم join زده و شرط را در انتها در قسمت where بنویسیم.
2 - ابتدا شرط را برروی جدول A به تنهایی زده نتیجه را داخل جدول شارپ (#) ریخته سپس جدول شارپ را با دو جدول دیگر join بزنیم
3 - در همان زمان join زدن یک کوءری داخلی زده و نتیجه را با دو جدول Join بزنیم
مثال:

1 -
Select * From A Inner Join B ON A.F = B.F Inner Join C ON B.F = C.F Where A.F2 = 6

2 -
Select * Into #T From A Where F2 = 6

Select * From #T Inner Join B ON #T.F = B.F Inner Join C ON B.F = C.F

3 -
Select * From ( Select * From A Where F2 = 6 )A Inner Join B ON A.F = B.F Inner Join C ON B.F = C.F

در نظر بگیرید حجم اطلاعات شرکت کنند در join خیلی بالاست

whitehat
سه شنبه 22 خرداد 1386, 07:53 صبح
بهتره شرط را بر روی جدول A بزنید و نتیجه آنرا (بصورت Sub Query) با بقیه Join کنید

AminSobati
سه شنبه 22 خرداد 1386, 08:48 صبح
می دونیم زمانی که چندین جدول را باهم join میکنیم اگر کوچکترین جدول اولین باشد سرعت بالا می رود.

چنین چیزی حداقل در مورد SQL Server صدق نمیکنه دوست عزیزم. دو Query زیر دقیقا با یک Plan اجرا خواهند شد:


select c.companyname, o.orderdate from customers c
join orders o
on c.customerid=o.customerid

select c.companyname, o.orderdate from orders o
join customers c
on c.customerid=o.customerid


دلیلش اینه که Query Optimizer بهترین روش رو انتخاب خواهد کرد و فرق نمیکنه کدوم جدول ابتدا بیاد. مگر در مورد Outer Join که اینجا موضوع فرق میکنه چون با عوض کردن جای جداول، اصلا نتیجه Query عوض میشه پس Optimizer دستش باز نیست که جداول رو جا به جا کنه (مگر در شرایطی که نتیجه عوض نشه).

در بین روشهای شما، من روش اول رو ترجیح میدم

کم حوصله
سه شنبه 22 خرداد 1386, 11:07 صبح
دیدگاه من این است که زمانی که چندین جدول را با هم Join می کنیم و شرطی هم داریم ابتدا اطلاعات جداول با هم Join شده سپس برروی کوءری بدست آمده شرط اجرا میشود. در نتیجه زمانی که حجم اطلاعات بالا باشد سرعت بیش از حد پایین می آید در نتیجه روش 2 و یا 3 به نظر خودم بهینه تر بود ولی کدام بهتر است جای ابهام بود.

در نظر بگیرید حجم اطلاعات موجود در جداول تماما میلیونی می باشد که همین موضوع مشکل ساز شده

AminSobati
سه شنبه 22 خرداد 1386, 12:31 عصر
Query Optimizer بسیار هوشمند تر از این صحبتهاست! درصورت وجود ایندکسهای مناسب، در همون حال که Join انجام میشه، شرطه Where هم اعمال میشه. مثلا در Queryهایی که براتون مثال زدم، اگر این شرط رو اضافه کنین: WHERE c.country=Germany
در Exeution Plan میبینید که فیلتری در انتهای کار وجود نداره، بلکه در حین دسترسی به جدول Customers جهت انجام Join، شرط Where هم اعمال شده