PDA

View Full Version : سوال در رابطه با Join



p_ooya
یک شنبه 11 مرداد 1388, 21:29 عصر
سلام به همه.
اگه سوالم ابتدایی هست ببخشید. پرس و جوی زیر رو درنظر بگیرید :

select * from orders join edition1 on orders.id = edition1.id where orders.id=1234 یا edition1.id=1234در یک چنین Join ی، کار به چه صورت شکل میگیره؟ منظورم اینه که اول دو تا جدول به صورت کامل ضرب میشن بعد شرط روی نتیجه برسی میشه یا اینکه بلعکس، اول شرط id روی هر دوجدول برسی میشه و بعد دو نتیجه ف ی ل ت ر شده با هم join میشن؟ یا اینکه هیچکدام؟

سپاس.

afrooz_rahmati63@yahoo.com
یک شنبه 11 مرداد 1388, 22:01 عصر
ابتدا join صورت می گیرد سپس شرط بر روی نتايج join اجرا مي گردد بنابراین:

Fewer rows to scan from the inner table prior to the join
Use of index to retrieve rows from the inner table prior to the join
Fewer rows to join
Fewer rows to evaluate for filters in the WHERE clause

p_ooya
دوشنبه 12 مرداد 1388, 00:31 صبح
ابتدا join صورت می گیرد سپس شرط بر روی نتايج join اجرا مي گردد بنابراین:
آخه این که منطقی نیست. فرض کنید دو تا جدول هر کدوم با 2 میلیون رکورد بخواد در هم jion بشن بعد روی نتیجه غول آسا شون پرس و جو انجام بشه. اگه اینطوره بهتر نیست آدم خودش روی هر دو اول کوئری بگیره بعد در هم ضربشون کنه؟

afrooz_rahmati63@yahoo.com
دوشنبه 12 مرداد 1388, 20:28 عصر
نه در این نوع join ابتدا شرط قسمت on بر روي دو جدول اجرا می گردد سپس دو جدول در هم ضرب می گردند بنابراین هنگامی که شما در قسمت where شرط می گذارین شرط را همزمان بر روی دو جدول اجرا می کنین بنابراین از دوباره کاری که select بر روي هر جدول جداگانه زدن است ، جلوگیری می شود..

p_ooya
چهارشنبه 14 مرداد 1388, 18:53 عصر
یه سوال مرتبط :
آیا دو دستور زیر با هم تفاوتی دارند؟

SELECT
*
FROM
Users
JOIN UserRoles
ON (Users.UserRoleId = UserRoles.UserRoleId)

WHERE
UserRoles.Active = 'TRUE'و

SELECT
*
FROM
Users
JOIN UserRoles
ON (Users.UserRoleId = UserRoles.UserRoleId
AND UserRoles.Active = 'TRUE')ممنون.

AminSobati
پنج شنبه 15 مرداد 1388, 10:11 صبح
سلام دوست عزیزم،
ترتیب اجرا به حالت منطقی و فیزیکی قابل بررسی هست. ترتیب منطقی یعنی چیزی که استاندارد زبان SQL حکم میکنه. طبق این استاندارد، همه انواع Join با حالت Cross کار خودشون رو شروع میکنند و بعد ON فیلتر میکنه. اما بانکهای اطلاعاتی برای بهینه سازی واقعا Cross نمیکنند ولی با این تضمین که نتیجه عینا معادل همون cross باشه. پس شما نباید نگران این باشید که خودتون اول رکوردها رو فیلتر و بعد Join کنین! SQL Server و بانکهای اطلاعاتی مشابه به صورت هوشمند این بهینه سازی رو انجام میدن.
در مورد 2 تا کوئری که نوشتین، اینها در نتیجه نهایی مثل هم هستند. در Inner Join اشکالی نداره که شرط Where رو به قسمت On ببرید اما در Outer Join نتیجه میتونه فرق داشته باشه