PDA

View Full Version : عمليات در پايگه داده يا برنامه ؟



hamed_kh311
جمعه 25 شهریور 1390, 18:09 عصر
با سلام و خسته نباشيد خدمت همه اساتيد

دوستان يک سؤال داشتم

به نظر شما بهتر هست برای چک کردن وجود چند فيلد در پايگاه داده چندين بار به پايگاه داده وصل شده و وجود آنها رو بررسی کرد يا اينکه تمامی فيلد ها رو يک بار از پايگاه داده خوند و داخل يک جدول ذخيره کرد و برای وجود فيلد اين جدول رو جستجو کرد؟


به نظر شما کدوم بهينه تر هست و سرعت کار رو بالاتر ميبره،اينکه من چندين بار بين چندين هزار فيلد با وصل شدن به پايگاه داده با استفاده ازexsist جستجو کنم يا اينکه يک بار وصل بشم تموم فيلدها رو بخونم و در فيلد های خونده شده جستجو کنم،لطفاً برای پايگاه داده های بسيار بزرگ راهنمايی کنين
ممنون

يا حق

sara_aryanfar
جمعه 25 شهریور 1390, 18:47 عصر
خوندن داده ها زمان بر هست اما مسئله اصلی در جستجوی داده های شماست و الگوریتمی که برای جستجو به کار می برین نمی دونم داده های شما یه داده مرتب هست یا چطوری ؟

mobtakercode
جمعه 25 شهریور 1390, 20:18 عصر
مسلما باید به پایگاه داده وصل شده و اطلاعات را در انجا جستجو کرد چون پایگاه داده اطلاعات را به صورتی ذخیره می کند که عملیات جستجو سریعتر شود

به مطالعه ایندکس ها بپردازید

sepehr.net
جمعه 25 شهریور 1390, 20:44 عصر
سلام
روش درست این است که هر بار به دیتابیس وصل بشی و جستجو کنی،
امکان این هست که در روش دوم سرعت بیشتر باشه ، اما چون داده ها در حال تغییر هستند، روش امنی نیست!

seven7777777
شنبه 26 شهریور 1390, 00:59 صبح
جواب اینگونه سوالات معمولا با این سوال محقق میشه که بهینه از چه نظر ؟

پ.ن :
یه استاد داشتیم میگفت تو دنیای کاپیوتر خوب و بد و بهینه نداریم . همیشه باید دید نسبت به چی داره بررسی میشه . خوب نسبت به چی ؟ بد نسبت به چی ؟
همیشه ببینید می خواید به چی برسید و ببینید چه چیزایی داره فدای اون چیز میشه ...

hamed_kh311
شنبه 26 شهریور 1390, 08:38 صبح
دوستان ممنون از لطفتون اما خوب من يه مقدار واضح تر سؤال رو ميپرسم

فرض کنيم ما جدولی داريم که تعدادی اسم داخل اين جدول هست،الان 10 تا اسم (غير تکراری) داريم که ميخوايم ببينيم اگه داخل پايگاه داده نيست به پايگاه داده اضافه کنيم،يعنی اسم اول جستجو ميشه اگه نبود اضافه بشه،اسم دوم جستجو بشه و اضافه بشه تا اسم دهم
برای اين کار بايد 10 بار به پايگاه داده متصل بشيم،حالا ميخوام بدونم به نظر شما اينکه 1 بار جدول رو از پايگاه داده گرفته و در کد اين جستجو رو انجام بديم بهتر نيست ؟اينجوری برای جستجو فقط 1 بار به پايگاه داده وصل ميشيم،که در اين حالت تعداد اتصال به پايگاه داده حداقل نصف ميشه!
اينم بايد اضافه کنم که تغيير ديگه ای تو پايگاه داده غير از تغييرات خودم اعمال نميشه پس از دست دادن اطلاعات معنی نداره

يه سؤال ديگه هم که پيش اومد فرض کنيم که يه حلقه داريم که ميخواد از 1 تا 10 رو وارد پايگاه داده کنه،به نظر شما بهتره داخل حلقه کانکشن باز و بسته بشه (که در اين صورت 10 بار باز و 10 بار بسته ميشه)يا اينکه قبل از حلقه کانکشن باز داده ها در حلقه
insert بشن و بد از پايان حلقه کانکشن بسته بشه؟!
به نظرتون کدوم يکی بهينه تر هست ؟

con.open()
for(int i=0;i<10;i++)
{
cmd.executeNonQuery();
}
con.close();

يا

for(int i=0;i<10;i++)
{
con.open();
cmd.executeNonQuery();
con.close();
}

hamed_kh311
شنبه 26 شهریور 1390, 17:59 عصر
تشکر زدم تشويق بشين جوابم رو بدين اما افسوس !:(

Arash_janusV3
شنبه 26 شهریور 1390, 18:34 عصر
با سلام و خسته نباشيد خدمت همه اساتيد

دوستان يک سؤال داشتم

به نظر شما بهتر هست برای چک کردن وجود چند فيلد در پايگاه داده چندين بار به پايگاه داده وصل شده و وجود آنها رو بررسی کرد يا اينکه تمامی فيلد ها رو يک بار از پايگاه داده خوند و داخل يک جدول ذخيره کرد و برای وجود فيلد اين جدول رو جستجو کرد؟


به نظر شما کدوم بهينه تر هست و سرعت کار رو بالاتر ميبره،اينکه من چندين بار بين چندين هزار فيلد با وصل شدن به پايگاه داده با استفاده ازexsist جستجو کنم يا اينکه يک بار وصل بشم تموم فيلدها رو بخونم و در فيلد های خونده شده جستجو کنم،لطفاً برای پايگاه داده های بسيار بزرگ راهنمايی کنين
ممنون

يا حق

با سلام
شما با کد نویسی 3 لایه می تونید 70 درصد راه تکراری رو حذف کنید
یا
همان select رو بر اساس


this.dtSample.select("name fild="+nameStrFilter)



از select های تکراری صرف نظر کنید
بدرود

seven7777777
شنبه 26 شهریور 1390, 18:43 عصر
ببین آقا حامد
اولا فرض کن شما جدول رو کشیدی تو برنامت . حالا یه اسم رو چک کردی . نبود تو جدول و شما اضافش کردی . حالا فرض کن اسم دوم ، سوم و چهارم هم اضافه شدند . فرض کن اسم پنجم همون اسم اول باشه . الان این اسم توی بانکت هست اما تو جدولی که واکشی کردی نیست . این یعنی یه جور تناقض .
دوما شما دقیقا می خوای چکار کنی ؟؟؟ خوب اگه می خوای اسامی تکرار نشن ، فیلدهارو unique کن و بعد در موقع ثبت اگه خطایی اومد ، بر طبق خطا در یکی از حالات یعنی اون داده تکراریه .
سوما می تونی این کارو بکنی که جدول رو بکشی داخل برنامه و بعد هر بار در صورت ثبت داده جدید در جدول ، دوباره جدولو بکشی تو برنامه ، یعنی جدول قبلیت آپدیت شه یا اینکه جدول برنامتم همزمان با بانکت آپدیت کنی .
چهارما سیستم های الان اینقدر سریع هستن که مشکلی که شما دارید میگید ( اگه ما هم درست فهمیده باشیم ) براشون رخ نده و به تعداد زیاد با بانک ارتباط برقرار کنن .
پنجما دوستان و استید عزیز سایت تا دقیقا ندونن شما می خواهید به چه چیزی برسید ، نمی تونن کمکی بکنن .

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

Reza_Yarahmadi
شنبه 26 شهریور 1390, 19:05 عصر
اول از همه ، اینجا کسی کشته مرده تشکر کردن دیگران ازش نیست ، اینجا دور هم جمع شدیم از تجربیات همدیگه استفاده کنیم.
در مورد سوال اولتون اگر قراره نامها یونیک باشه و تکراری نداشته باشه چرا روی فیلد مورد نظرتون یک یونیک ایندکس نمیذارید تا هم سرعت پردازش روی این فیلد بالا بره هم خودش یونیک بودن مقدار جدید رو بررسی کنه؟ با این کار نیازی به جستجو کردن جدول نیست ، در هر اضافه کردن اگر مقدار جدید تکراری نباشه ذخیره میشه ، اگر هم تکراری باشه ذخیره نمیشه و یک Exception برمیگردونه که با یک try/catch میتونید اونو هندل کنید.
در مورد سوال دوم هم اگر توی حلقه پردازش وقتگیری انجام نمیشه ویا اینکه برنامه بصورت لوکال (تک کاربره) کار میکنه باز و بسته کردن کانکشن خارج از حلقه سرعت کار رو بالا میبره (البته برای 10 رکورد محسوس نیست)
درکل فقط در موارد خاصی بهتره توی حلقه کانکشن باز وبسته بشه ، در خیلی از موارد هم داخل یا خارج بودن خیلی تفاوتی نمیکنه.

sepehr.net
شنبه 01 بهمن 1390, 21:20 عصر
اگه میخوای تک تک جستجو کنی ، میتونی اطلاعات رو کش منی تا سرعت سلکت بیشتر بشه ، اگه هم نه میتونی از روش زیر استفاده کنی
این که تمامی اسم ها رو در یک کوری بررسی کنی ، بعد از حاصل اون کوری میتونی متوجه بشی که کدام یکی از اسم ها در جدول وجود داره یا وجود نداره
Select * From Person Where Name In ('name1','name2','name3')