ورود

View Full Version : تقدم اجرای شروط



MShirzadi
جمعه 30 آذر 1386, 05:01 صبح
سلام
آیا در دستوراتی که مینویسیم شرط ها تقدم اجرا دارند اگر دارند به چه شکلی هست
یعنی در دستور زیر توجه کنید


Select * From TblA where Name = 'Ali' And Family = 'Mohammadi'


در این دستور آیا ابتدا شرط اول و بعد روی خروجی این شرط شرط دوم اعمال میشه یا ....

ممنونم از همه

Alireza Orumand
جمعه 30 آذر 1386, 12:37 عصر
سلام
بله تقدم در نظر گرفته میشه. در کل عباراتی که AND و OR دارند با تقدم بررسی میشه. یعنی اگر در AND شرط اول شما بررسی بشه و شرط غلط باشه دیگه شرط دوم بررسی نمیشه. در OR هم همین شرایط برقراره یعنی اگر شرط اول بررسی بشه و شرط درست باشه دیگه نیازی به تست شرط دوم نیست و کل شرط درست در نظر گرفته میشه. شرط سمت چپ هم اولین شرطی هست که تست میشه.
تو بعضی زبان های برنامه نویسی کامپایلر ها امکاناتی در اختیار شما قرار میده که به کمک اون امکانات و تنظیمات شما میتونید بگید که همیشه هر دو طرف شرط چک بشه یعنی حتی اگر طرف چپ AND درست نبود با اینکه جواب نهایی غلط هست ولی سمت راست هم چک میشه. این که این امکان تو SQL Server هست یا نه خبر ندارم.
در کل هم همیشه و تو هر شرطی تقدمی وجود داره و تقدم برای سمت چپ عملگر هست.
موفق باشید.

MShirzadi
جمعه 30 آذر 1386, 14:10 عصر
دوست عزیز از توجه شما ممنونم ولی من منظورم این بود


در این دستور آیا ابتدا شرط اول و بعد روی خروجی این شرط شرط دوم اعمال میشه

Alireza Orumand
جمعه 30 آذر 1386, 17:39 عصر
سلام.

در کل هم همیشه و تو هر شرطی تقدمی وجود داره و تقدم برای سمت چپ عملگر هست.
بنده جواب شما رو در پست بالا گفتم. عملگر AND دو تا ورودی داره که یکی سمت چپ و دیگری سمت راست اون قرار میگیره. شرط اول همیشه سمت چپ هست که اول هم تست میشه.
وقتی اول شرط اول تست میشه روی خروجی های همون شرط هم شرط دوم تست میشه. یعنی اگر رکوردی در سمت چپ فاقد نام ali بود دیگه در بخش تست بعد بررسی نمیشه که آیا فامیلی Mohammadi هست یا نه. و این یعنی شرط دوم روی نتیجه ی شرط اول چک میشه یعنی رکورد هایی که نام Ali دارن.
موفق باشید.

MShirzadi
شنبه 01 دی 1386, 02:44 صبح
خوب اگر اینجوری باشه مثلا اگر ما 20000 تا رکورد داشته باشیم و 4 تا شرط اونوقت شرط به شکل زیر هم اعمال بشه :
1) در برسی اوا تنها یک رکود حذف بشه (توجه به اینکه ما 20000 حلقه را اجرا کردیم و تنها یک رکورد حذف شد )
در این برسی خروجی ما 19999 رکورد است.
2) شرط دوم اعمال بشه و در این شرط هم تنها یک رکورد حذف بشه (توجه به اینکه ما 19999 حلقه را اجرا کردیم و تنها یک رکورد حذف شد )
در این برسی خروجی ما 19998 رکورد است.
3) شرط سوم اعمابشه و در این شرط تنها یک رکورد حذف بشه (توجه به اینکه ما 19998 حلقه را اجرا کردیم و تنها یک رکورد حذف شد )
در این برسی خروجی ما 19997 رکورد است.
4) این شرط اعمال بشه و تنها 1 رکورد باقی بمونه
خوب ما 4 تا حلقه زدیم و تنها یک رکورد باقی موند
ولی حالا اگر در یک حلقه هر 4 تا شرط با هم اعمال بشن تنها در یک حلقه یک رکورد باقی میمونه و اگر Order خا رو هم نگاه کنیم مقدارش برای حالت اول فوقولاده بیشتر از حالت دوم هست
من فکر کنم که حالت اول اجرا بشه
نظر شما چی هست؟؟؟؟
مرسی از توجهتون

AminSobati
شنبه 01 دی 1386, 14:11 عصر
SQL Server هوشمندتر از این هست که به ترتیب شروط بخواد توجه کنه. یعنی در مثالی که زدین، با توجه به اینکه دو شرط AND میشن، ابتدا به Statistics رجوع میکنه تا ببینه هر قسمت از شرطهای شما چند رکورد بعنوان خروجی خواهند داشت. مثلا به طور معمول، عبارت name=ali تعداد رکوردهای بیشتری میده تا family=mohamadi لذا در این شرایط دنبال ایندکسی میگرده که هم name رو داشته باشه و هم Family و ترجیحا در این ایندکس، family جلوتر از name قید شده باشه. پس SQL Server روش بهینه اجرای شروط رو میدونه به شرط اینکه شما ایندکس درست رو در اختیارش گذاشته باشین

Alireza Orumand
شنبه 01 دی 1386, 20:04 عصر
سلام
ببینید دوست عزیز قاعده کلی اینه که دوتا شرط همزمان نمیتونه چک بشه ونتیجه اخلاقی اینه که در نهایت یکی چک شده و دیگری روی نتایج اولی اعمال میشه(این یه قاعده کلی هست در مورد تست شرط در کامپیوتر و حتی دقیق تر اگر نگاه کنیم در مدارات الکترونیکی) حالا بعضی محیط ها مثل SQL Server با توجه به شرایطی در مواردی که تشخیص بدن به بهبود کار کمک میکنه جای شرط ها رو عوض میکنن و اول یکی و بعد دیگری رو تست میکنن و این باز هم با کل موضوع مغایرتی نداره یعنی نهایتا باز هم یک شرط اول تست میشه و نتیجه روی اون اعمال میشه.
در نهایت این شما هستید که تعیین میکنید کدوم شرط اول اجرا بشه و در حالت کلی با یه نگاه ساده میشه فهمید که کدوم شرط باید اول ذکر بشه و کدوم شرط دوم. مثل مثالی که استاد ثباتی فرمودن که مثلا name=ali تعداد رکورد های بیشتری برمیگردونه و شما به عنوان برنامه نویس باید در برنامه خودتون این شرایط رو در نظر بگیرید و famili رو اول چک کنید. چنانچه شما این شرایط رو در نظر نگیرید حتی SQL Server هم کمک چندانی به شما نمیتونه بکنه. باز هم رجوع میدم به مثال استاد که فرموده بودن در صورتی سرور به شما کمک میکنه که شما ایندکس ها رو درست انتخاب کرده باشید. یعنی باز هم بهبود شرایط رو شما باید فراهم کنید.


خوب ما 4 تا حلقه زدیم و تنها یک رکورد باقی موند

حتی اگر شما تو حلقه این کار رو انجام بدید باز هم شما هستید که چهارمین شرطی رو که گفتید در خط اول برنامه مینویسید.
کامپیوتر به حرف شما گوش میکنه و برنامه های شما رو اجرا میکنه. اگر شما بخواهید کاری اضافی انجام بشه کامپیوتر کمک شایانی به شما نمیکنه فقط میتونه کار شما رو انجام بده.
موفق باشید.:لبخند:

MShirzadi
یک شنبه 02 دی 1386, 11:57 صبح
دوستان از توجهتون ممنونم
ببنید من میدونم که شروط در کامپیوتر به صورت ترتیبی برسی می شن و لی من منظورم این نبود که شما فرمودین من منظورم رو با یک مثال به صورت واضح تر عنوان می کنم
ببنید این مثال به معنای این نیست که SQL Server به این شیوه کار میکنه ها بلکه فقظ می خوام شبیه سازی کنم
خوب دستور زیر رو در نظر بگیرید


Select * From TblA Where Name = 'Ali' OR Family = 'Hasani' SQL Server برای حل این مشکل دو راه داره که من اوا رو پیاده سازی میکنم(البته به زبان C)

for (int i = 0 ;i<TblA.Count;i++)
{
if (TblA.Item[i].Name<>'Ali')
{
TblA.Item[i].Delete;
Continue;
}
if (TblA.Item[i].Family<>'Hasani')
{
TblA.Item[i].Delete;
Continue;
}
}که در این کد در یک حلقه داده ها را کنترل می کند و اگر داده ها علظ بودند آنها را از لیست خروجی حذف میکند


for (int i = 0 ;i<TblA.Count;i++)
if (TblA.Item[i].Name<>'Ali')
TblA.Item[i].Delete;

for (int i = 0 ;i<TblA.Count;i++)
if (TblA.Item[i].Family<>'Hasani')
TblA.Item[i].Delete;
اما در این کد ابتدا یک حلقه می زند و داده هایی که با شرط اول متناقظ هستند را حذف میکند و بعد دوباره برای شرط دوم یک حلقه ی دیگر میزند و داده هایی را که با این شرط متناقظ هستند را نیز حذف می کند
حالا امید وارم تونسته باشم منظورم رو بگم