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

ms_vb

Member
سلام به همه اساتید گلم مخصوصا جناب The-King عزیز
بهترین روش برای خواندن اطلاعات از دیتابیس و استفاده از آن در برنامه چیه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام به همه اساتید گلم مخصوصا جناب The-King عزیز
بهترین روش برای خواندن اطلاعات از دیتابیس و استفاده از آن در برنامه چیه؟

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

یک مثال عملی می زنم. یک پروژه محاسباتی بزرگ داشتم با حدود شصت تا جدول. در حالت عادی که بانک اطلاعاتی رو به پروژه اضافه کرده بودم
ویژوال استدیو بصورت خودکار برای کلیه جدول ها کلاس اختصاصی Adapter و DataRow و DataTable ساخته بود
که زمان کامپایل پروژه و سرعت ویرایشگر ویژوال استدیو رو پایین می آورد.

بعدا من در یک پروژه متفاوت اما تو مایه های همین پروژه کلا بجای اضافه کردن بانک اطلاعاتی به اون شیوه سابق
از یکسری کمپوننت های دست ساز خودم استفاده کردم که کلاس Table خاص خودشون رو دارند و کلا نحوه ارتباط شون
با بانک اطلاعاتی و فرم متفاوته و برای استفاده اختصاصی خودم طراحی شون کردم. کار برنامه نویس باهاشون راحت تره
اما پشت پرده کد های زیادی برای پیاده سازی روش دلخواه ام نوشتم.

در این پروژه جدید دیگه بانک اطلاعاتی اونهمه کلاس و کد نداشت و سرعت کامپایل و ویرایشگر فرم بالا رفت.
اما با توجه به حجم کد این کمپوننت هایی که نوشته بودم (صد ها کلاس پیچیده) انتظار داشتم که سرعت تراکنش بانک اطلاعاتی
در پروژه جدید به اندازه اون Adapter و DataTable و DataRow استاندارد نباشه و سرعت اجرای نرم افزار پایین بیاد. اما عملا این اتفاق رخ ندارد،
دلیلش هم این بود که تراکنش های یک برنامه تک یا چند کاربره ویندوز یا وب سایت های کوچک هر چقدر هم که بانک اطلاعاتی اش بزرگ باشه
معمولا در حدی نیست که بشه تفاوت روش های مختلف رو از دید سرعت تراکنش بررسی کرد.
مساله ای که باید در نظر بگیرید راحتی خودتون و سرعت نوشتن کد در روش ای است که انتخاب کرده اید.
 

ms_vb

Member
خیلی ممنون از جوابتون
من هم معمولا از DataSet ساخته شده به وسیله ویژوال استودیو استفاده میکنم

به این شکل که هنگام شروع برنامه جداول Dataset رو به وسیله TableAdapter ها Fill میکنم و بعد هرجا که نیاز داشتم از آن استفاده میکنم

اما از آنجا که جدیدا تعدادی از ستونهای جداول استفاده شده در دیتابیسم را برای ذخیره تصاویر از نوع بایت در نظر گرفته ام احتمال میدهم که در اطلاعات بالا به مشکل کمبود Ram بر بخورم

1- نمیدانم آیا مجبورم روش خواندن از DataBase را تغییر دهم؟ و هر جا که به اطلاعات نیاز داشتم به صورت مستقیم از جدول بخوانم؟ یا همان روش قبلی ، با اندکی تغییرات قابل استفاده خواهد بود؟

2- آیا در صورت استفاده از روش اول(خواندن اطلاعات به صورت مستقیم از Database) در اطلاعات بالا با تفاوت سرعت محسوسی مواجه خواهم بود؟

ممنون میشم راهنمایی کنید.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون از جوابتون
من هم معمولا از DataSet ساخته شده به وسیله ویژوال استودیو استفاده میکنم

به این شکل که هنگام شروع برنامه جداول Dataset رو به وسیله TableAdapter ها Fill میکنم و بعد هرجا که نیاز داشتم از آن استفاده میکنم

اما از آنجا که جدیدا تعدادی از ستونهای جداول استفاده شده در دیتابیسم را برای ذخیره تصاویر از نوع بایت در نظر گرفته ام احتمال میدهم که در اطلاعات بالا به مشکل کمبود Ram بر بخورم

1- نمیدانم آیا مجبورم روش خواندن از DataBase را تغییر دهم؟ و هر جا که به اطلاعات نیاز داشتم به صورت مستقیم از جدول بخوانم؟ یا همان روش قبلی ، با اندکی تغییرات قابل استفاده خواهد بود؟

2- آیا در صورت استفاده از روش اول(خواندن اطلاعات به صورت مستقیم از Database) در اطلاعات بالا با تفاوت سرعت محسوسی مواجه خواهم بود؟

ممنون میشم راهنمایی کنید.

استفاده از اون کد هایی که بصورت خودکار در Dataset تون نوشته شده الزاما باعث کند شدن تراکنش نمیشه، مهم اینه که نوع تراکنش با نیازتون منطبق باشه،
فرضا اگر قراره سطر های خاصی رو حذف کنید، بدیهی است که لزومی نداره که اول در Table اون سطر ها رو SELECT کنید و بعد بخواهید دونه دونه Row هایش
رو Delete کنید، می توانید از همون ابتدا یک دستور DELETE اختصاصی رو اجرا کنید که ظاهرا روش بهتر و اصولی تریه. اما واقعا لازمه که این روش دوم بکار برده بشه؟
معمولا نه، فقط زمانی که تعداد سطر هایی که پاک می کنید اونقدر زیاد باشند که تفاوت محسوس باشه، اغلب اوقات موارد حذفی یک یا چند سطر بیشتر نیست و
در نتیجه وقت رو صرف بهینه سازی ای می کنید که ارزش اش رو نداشته.

خواندن مستقیم و غیر مستقیم از جدول نهایتا به همون Adapter ختم میشه که با دستورات SQL سر و کار داره، کد هایی که در روش های مختلف نوشته می شوند
اغلب فرق شون مربوط به عملکرد پیش از اجرای تراکنش اصلی یه، نه خود تراکنش. اصل کار تراکنشی است که Server انجام میده، اگر تراکنش رو با یک معادل بهتر
بهینه کنید طبعا سریعتر میشه اما اگر فقط بخواهید بین روش های مستقیم و غیر مستقیم سوئیچ کنید سرعت اجرای اون چند صد سطر کد بیشتر و کمتر
در مقایسه با اصل تراکنش محسوس نیست.

از همون TableAdapter های آماده استفاده کنید، به هر حال اگر لازم باشه سطر هایی بررسی شوند در حافظه فراخوانی خواهند شد، فقط باید تا حد امکان تعداد
سطر هایی که در جدول Fill می شوند رو محدود کنید، یعنی قبل از Fill کردن، SelectCommand رو از حالت پیشفرض اش که شرط WHERE نداره خارج کنید، فقط سطر هایی
رو SELECT کنید که الان بهشون نیاز دارید. هر چقدر حجم Table رو کمتر نگهدارید بهتره، اما فقط زمانی وقت صرف این بهینه سازی کنید که ارزش اش رو داشته باشه،
تا وقتی که تفاوت این حجم خیلی زیاد نشه تفاوت کارایی هم محسوس نیست. اگه فرصت اش رو داشته باشید بهترین کار اینه که جدول رو با یکسری داده نمونه یا تصادفی
در بیشترین حجمی که در آینده انتظارش میره پر کنید و یک مثال رو عملا با دو روش اجرا کنید تا عیار دست تون بیاد.
 

جدیدترین ارسال ها

بالا