PDA

View Full Version : آیا select های تودرتو بهینه تر هست یا استفاده از دستورات join.



hossein2007
سه شنبه 10 مرداد 1391, 11:21 صبح
با سلام و عرض خسته نباشید به همه بچه های برنامه نویس و خصوصا مدیریت تالار جناب صادقیان عزیز

فرض کنید می خواهیم از چند جدول متصل به هم، تعدادی رکورد را استخراج کنیم، بنظرتون کدام راه حل بهینه تر هست؟


1) نوشتن select های تو در تو و اعمال شروط.

2) ساختن یک view در sql server (که با دستورات join ساخته می شود) و در نهایت نوشتن یک sp که روی این view ، کار می کند و با شروطی که می نویسیم نتیجه را بر می گرداند.

اگر امکان داره دلایل مستند باشه ممنون می شم.

baktash.n81@gmail.com
سه شنبه 10 مرداد 1391, 17:09 عصر
خوب بستگی داره ... چه نیجه ای بگیری ... روی چه جداولی ... بهتره کدت و ساختار جداول رو اینجا بزاری تا بشه بررسیشون کرد ...

nilmil_nil
پنج شنبه 12 مرداد 1391, 00:38 صبح
به نظر من از join کردن جداول استفاده کنی بهتره
همینطور ویو
من از این ها همیشه استفاده میکنم هیچ وقت به مشکل بر نخوردم
پیاده سازی SELECT های تو در تو برای جداول کوچیک راحته و لی جداول بزرگ که فیلد هاشون زیاده (منظور کلید های اصلی و کلید های خارجی) خیلی پیچیده میشه
البته من از نظر راحتی و بهینه بودن میگم
همینطور نظر خودم

oliya24
پنج شنبه 12 مرداد 1391, 12:46 عصر
ببین دوست عزیز من اگر شما بخوایی کوئری با performance بالا بنویسید باید از join استفاده چون چونکه به مراتب performance بیشتری نسبت به select تو درتو داره در ضمن این رو فراموش نکنید که از اول برای جوین جداول از select های تو در تو استفاده میشد ولی بعدها امدند و یک روش برتر که همین جوین میباشد رو مطرح کردن . اما امروزه باز هم در برخی از موارد پیش میاد که مدیر دیتابیس مجبور میشه از سلکت تو در تو استفاده کنه .
موفق باشید

nilmil_nil
پنج شنبه 12 مرداد 1391, 16:57 عصر
سلکت های تو در تو هنوز استفاده میشن ولی برای بعضی از کار ها که معمولا با Join ها شاید نشه کار کرد ازش استفاده میشه

pashna
جمعه 13 مرداد 1391, 09:10 صبح
http://blog.sqlauthority.com/2010/06/06/sql-server-subquery-or-join-various-options-sql-server-engine-knows-the-best/

hossein2007
شنبه 14 مرداد 1391, 11:04 صبح
خوب بستگی داره ... چه نیجه ای بگیری ... روی چه جداولی ... بهتره کدت و ساختار جداول رو اینجا بزاری تا بشه بررسیشون کرد ...

سلام دوست عزیز
الان یک مورد مصداقی ندارم که بگم.
ولی کلا این حالت را در نظر بگیرید که مثلا 6 تا جدول داریم که زنجیروار به هم متصل هستند و تعداد رکورد ها هم زیاد هست.

baktash.n81@gmail.com
شنبه 14 مرداد 1391, 15:11 عصر
خوب ... من واقعا قانع نشدم که کدوم سریعتر ... رو سیستم خودم و با 3 جدول داقیقا join و Select تو در تو یه جور رفتار می کنند ... و این نکته نشون می ده که اگه شما کد رو دو جور مختلف بنویسی دلیل نمی شه Sql هم متفاوت اونو اجرا کنه ... در نتیجه شما هم بهتره تست کنی ...اما استفاده از Join این خوبی رو داره که کدتون خواناتر می شه ...

pashna
شنبه 14 مرداد 1391, 21:19 عصر
سلام، اگر لینکِ رو که من گذشتم مطالعه کنید متوجه میشید

tooraj_azizi_1035
سه شنبه 07 شهریور 1391, 17:12 عصر
Select های تو در تو دارای محدودیت هستند: http://www.farsimsdn.somee.com/default.aspx?id=63

ASKaffash
یک شنبه 12 شهریور 1391, 09:26 صبح
سلام
در صورت وجود ایندکس نامناسب سرعت Join معادل 1.8 برابر سرعت SubQuery است


خوب ... من واقعا قانع نشدم که کدوم سریعتر ... رو سیستم خودم و با 3 جدول داقیقا join و Select تو در تو یه جور رفتار می کنند ... و این نکته نشون می ده که اگه شما کد رو دو جور مختلف بنویسی دلیل نمی شه Sql هم متفاوت اونو اجرا کنه ... در نتیجه شما هم بهتره تست کنی ...اما استفاده از Join این خوبی رو داره که کدتون خواناتر می شه ...

baktash.n81@gmail.com
یک شنبه 12 شهریور 1391, 11:52 صبح
واقعا ... می تونید با یه مثال یا مدرک نشون بدین ؟!؟ همینجوری بدون هیچ قید و شرطی دقیق 1.8 ؟!؟! ممکنه یه مقدار علمی تر نظر بدید ؟!
مثالا بگید که اگه شرط برای وجود رکورد باشه Join سریعتره ... اونم مقداری !

ASKaffash
یک شنبه 12 شهریور 1391, 12:37 عصر
سلام
لطفا کمی آرامتر پست بزنید. در همین تالار جواب را قرار دادم لطفا ادامه را در آن پست پیگیری نمائید.

tooraj_azizi_1035
یک شنبه 12 شهریور 1391, 20:10 عصر
در صفحه 176 کتاب Inside the SQL Server Query Optimizer اینطوری اومده:


Simplification
Query rewrites or, more exactly, tree rewrites are performed on this stage to reduce the query tree into a simpler form in order to make the optimization process easier. Some of these simplifications include those below.
• Subqueries are converted into joins, but since a subquery does not always translate directly to an inner join, outer join and group by operations may be added as necessary.



Simplification فازی هست که در اون Query Optimizer ساده کردن کوئری رو انجام میشه و همونطور که می بینید Subquery ها حذف میشن و جای اونها Join قرار می گیره که همین موضوع نشون می ده که کدوم یک بهینه تر هست.


اگر شما یک کوئری بنویسی که حاوی Subquery باشه و به Execution Plan اون نگاه کنی متوجه میشی که Join در Plan تولید شده استفاده شده.

baktash.n81@gmail.com
دوشنبه 13 شهریور 1391, 08:59 صبح
البته تبدیل SubQuery به Join در مقایسه با سایر کار ها زمان خیلی کمی می گیره ... که نمی شه گفت کد رو بهینه تر می کنه برای اینکه در مورد 1 رکورد یا 10 میلیون رکورد یه مقدار زمان بسیار بسیار ناچیز می گیره.

این متن هم از MSDN هست ... دقت کنید ...

Many Transact-SQL statements that include subqueries can be alternatively formulated as joins. Other questions can be posed only with subqueries. In Transact-SQL, there is usually no performance difference between a statement that includes a subquery and a semantically equivalent version that does not. However, in some cases where existence must be checked, a join yields better performance. Otherwise, the nested query must be processed for each result of the outer query to ensure elimination of duplicates. In such cases, a join approach would yield better results.