PDA

View Full Version : بهینه کردن کد



مهدی هادیان2
پنج شنبه 22 فروردین 1392, 07:03 صبح
بسم الله الرحمن الرحیم
با سلام
چه جوری می تونم کد زیر رو بهینه کنم و از جوین شودن همزمان 3 جدول جلوگیری کنم.
select *
FROM CustomerFactor INNER JOIN
CustomerFactorDetails ON CustomerFactor.FactorCode = CustomerFactorDetails.FactorCode
INNER JOIN
Customer ON CustomerFactor.CustomerCode=Customer.CustomerCode
با سپاس فراوان

saeed zarei
پنج شنبه 22 فروردین 1392, 07:37 صبح
به نظر من این یه چیز طبیعی هست و این جور مسائل به نحوه طراحی دیتابیس شما و رشد اون در اینده بستگی داره . برای اینکه جواب بهتری بگیرید باید دیاگرام دیتابیستون رو حداقل بفرستید یا توضیح بدید که چرا این جداول رو ایجاد کردید .

danesh1351
پنج شنبه 22 فروردین 1392, 07:41 صبح
select *
FROM Customer C,CustomerFactor cf,CustomerFactorDetails cfd,
Where cf.FactorCode = cfd.FactorCode And cf.CustomerCode=c.CustomerCode

saeed zarei
پنج شنبه 22 فروردین 1392, 08:02 صبح
فکر کنم این کد هم دوست عزیز همون کار ور انجام میده . یعنی هر دوشون دارن ضرب دکارتی انجام میدن . فقط نوع نوشتنشون فرق کرده

مهدی هادیان2
پنج شنبه 22 فروردین 1392, 12:03 عصر
بسم الله الرحمن الرحیم

به نظر من این یه چیز طبیعی هست و این جور مسائل به نحوه طراحی دیتابیس شما و رشد اون در اینده بستگی داره . برای اینکه جواب بهتری بگیرید باید دیاگرام دیتابیستون رو حداقل بفرستید یا توضیح بدید که چرا این جداول رو ایجاد کردید .
با سلام
ممنون از توجهتون
جداول فاکتور و مشتری و جزئیات فاکتور مورد بحث هستند. از طرفی نمی خوام بین تمام مشتری ها و فاکتورها ضرب دکارتی انجام بشه.
می خوام بین مشتری ها و اون فاکتور خاص ضرب بشه یا مثلا بین فاکتور ها و اون مشتری خاص.
با تشکر

حمیدرضاصادقیان
پنج شنبه 22 فروردین 1392, 13:09 عصر
سلام.
شما نمیتونید از این عمل جلوگیری کنید و درواقع Inner join نیز گزینه بهینه ای برای رسیدن به نتیجه هست.
یا میتونید از Derived Table ها استفاده کنید و نتیجه جداول اول رو با جدول اصلی Join کنید .(که باید Plan تهیه شده توسط هر دو Query رو بررسی کرده و Statistics ها رو نیز بررسی کنید تا ببینید کدوم شرایط بهتری رو در اختیار شما قرار میدهند.)


Select CF.*,CFD.*,C.* From CustomerFactor
Join(
Select * From CustomerFactorDetail
Where id=10) as CFD on Cfd.FactorCode=Cf.FactorCode

Join(
Select * From Customer
Where customerNumber=20) as C on C.Customercode=Cf.Customercode

این رو با کد خودتون تست کنید و تمامی مواردی که عرض کردم رو کنترل کنید ببینید چه مزایایی در اختیار شما قرار میدهد.

مهدی هادیان2
پنج شنبه 22 فروردین 1392, 13:57 عصر
بسم الله الرحمن الرحیم
با سلام
از جناب صادقیان تشکر میکنم.
در کد آقای صادقیان کد مشتری مشخص بود ولی در حالتی که بنده با اون مواجه هستم تنها کد فاکتور رو داریم و از روی اون به بقیه چیزها می رسیم.
بنده این مورد رو در کوئری آقای صادقیان لحاظ کردم و دو کوئری زیر رو در SQL نوشتم:
select *
FROM CustomerFactor INNER JOIN
CustomerFactorDetails ON CustomerFactor.FactorCode = CustomerFactorDetails.FactorCode
INNER JOIN
Customer ON CustomerFactor.CustomerCode=Customer.CustomerCode
WHERE CustomerFactor.FactorCode=1

Select CF.*,CFD.*,C.* From CustomerFactor as CF
Join(
Select * From CustomerFactorDetails
Where FactorCode=1) as CFD on Cfd.FactorCode=CF.FactorCode

Join(
Select * From Customer
) as C on C.Customercode=Cf.Customercode

PLAN هر دو کوئری مثل هم بود.

حمیدرضاصادقیان
پنج شنبه 22 فروردین 1392, 17:54 عصر
درواقع Inner join بهینه ترین روش برای Join جداول هست و مشکلی از لحاظ بهینه بودن نخواهید داشت.

tooraj_azizi_1035
پنج شنبه 22 فروردین 1392, 20:29 عصر
سلام
در مورد کوئری که شما نوشتید Query Optimizer که مسئول بهینه سازی کوئری شماست بین A JOIN B و B JOIN A فرق می گذارد (گرچه نتیجه هر دو یکی است) و الزاماً همان چیزی را که شما تایپ کردید را اجرا نمی کند بلکه هزینه هر حالت ممکن را بررسی و بهترین را انتخاب می کند. می توانید در پلن تولید شده ترتیب Join را ببینید.
برای کسب اطلاعات در مورد اینکه چطور باید کوئری Cost-Effective بنویسید این کتاب را مطالعه کنید: Inside the SQL Server Query Optimizer [Benjamin Nevarez]

website.expert
پنج شنبه 22 فروردین 1392, 21:29 عصر
با سلام،
ممنون دوست عزیز بابت کتاب خوبی که معرفی کردید.
تشکّر.

حمیدرضاصادقیان
جمعه 23 فروردین 1392, 00:50 صبح
در مورد کوئری که شما نوشتید Query Optimizer که مسئول بهینه سازی کوئری شماست بین A JOIN B و B JOIN A فرق می گذارد (گرچه نتیجه هر دو یکی است) و الزاماً همان چیزی را که شما تایپ کردید را اجرا نمی کند

البته این مورد بیشتر در مورد Outer Join ها تاثیر داره . برای اثبات این قضیه شمارو به کتاب Inside T-SQL querying اقای Itzik Ben Gan ارجاع میدهم.

tooraj_azizi_1035
جمعه 23 فروردین 1392, 10:51 صبح
البته این مورد بیشتر در مورد Outer Join ها تاثیر داره . برای اثبات این قضیه شمارو به کتاب Inside T-SQL querying اقای Itzik Ben Gan ارجاع میدهم.

چیزی که مطالعه کردم در کتاب بنیامین ناوارز Inner Join رو برای دیتابیس AdventureWorks مثال زده بود.

حمیدرضاصادقیان
جمعه 23 فروردین 1392, 22:57 عصر
در واقع به دلیل اینکه برای پردازش Join ها سه مرحله صورت میگیره ، عرض کردم در Inner ها تفاوتی نداره.
به این دلیل که اول Cartesian Join صورت میگیره و به تعداد رکوردهای سمت جدول چپ و راست رکورد به ما برگردانده خواهد شد.
بعد شرط On روی Virtual Table ساخته شده اعمال خواهد شد که به ما Inner join رو میده.
حالا اگر Outer Join باشه تفاوت خواهد کرد به این دلیل که بسته به نوع Outer Join کل جدول سمت چپ یا راست را دوباره با نتیجه Virtual Table بدست امده از On مجددا join میکنه ، به همین دلیل هست که در Outer Join هم عملیات کندتر صورت میگیره هم اینکه مقادیر Null رو به ما نمایش میده .