PDA

View Full Version : جستجو در میان داده های DataTables یا SQL-Tables



piroozman
شنبه 09 آبان 1388, 09:35 صبح
در پروژه ای مبتنی بر ADO.NET تیم حاضر،از دیتاست و سایر کلاس های مربوط به ADO.NET مانند DataTable ها، DataColumn ها، DataRow ها و . . . جهت کار با داده های موجود در دیتابیس استفاده کرده اند.
همانگونه که مستحضرید با استفاده از CmdText یا CmdStoreProcedure و با پیکر بندی تابع Fill مربوط به TableAdapter هر DataTable را پر کرده و با Bind کردن یک Component مانند DataGridView اطلاعات جداول موجود در بانک اطلاعاتی جهت نمایش و ویرایش در اختیار کاربر قرار می گیرد. البته روش های دیگری نیز برای این کار است که فعلا مد نظر این تاپیک نیست.
با این مقدمه کوتاه به سراغ مسلئه ای که این تاپیک قرار است آنرا بیان کند می روم. سئوالاتی که پس از پر کردن DataTable ها برای مطرح می شوند در چند قسمت زیر خلاصه شده است:

فرض کنید که یکی از جداول موجود در بانک اطلاعاتی بیش از 50000 رکود دارد. آیا انتقال این 50000 رکورد در یک DataTable که خود بر روی حافظه موقت یا RAM قرار دارد باعث ایجاد سربار و اشغال فضا نمی شود؟ اگر پاسخ مثبت است چه راهکاری برای حل این مشکل وجود دارد؟
برای جستجو در میان اطلاعات چه باید کرد؟. آیا باید از کلاسها و توابع مربوط به خود ADO.NET مانند کلاس DataView ها و توابع Find و Select به ترتیب مربوط به DataView و DataTable و . . . استفاده کرد و جستجو را در اطلاعات موجود در DataTable انجام داد و اگر پاسخ مثبت است چگونه باید این کار را کرد؟ اگر الگوریتم یا روش کاری مناسبی را می شناسید یا استفاده کرده اید لطفا بیان کنید؟ یا اینکه باید برای هر جستجو به دیتابیس وصل شده و اطلاعات مورد نظر کاربر را پس از یافتن در بانک اطلاعاتی وارد DataTable ها کرد؟ به نظر شما این باعث کندی جستجو نمی شود؟ یا به طور کلی کدام روش بهتر است و چرا؟
شیوه کاری مناسب برای جستجوی داده ها در بانک های اطلاعاتی یا DataTable ها چیست؟ قابل توضیح است که پروژه حاضر بیشتر متشکل از فرمهایی که حاوی DataGridView های Bind شده به DataSource ها هستند.
پیشنهاد شما در خصوص استفاده از LINQ در این خصوص چیست؟

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

hdv212
شنبه 09 آبان 1388, 14:02 عصر
اینکه آیا شما بایستی همه ی رکورد را در برنامه بخوانید یا اینکه برای هر گزارش جدید یک Query به دیتابیس بزنید کاملا بستگی به سناریوی شما در اون نرم افزار داره و نسخه ای نیست که برای همه ی سناریوها نتیجه ی مطلوبی داشته باشه، اما میتوان این موضوع رو به چند زیر موضوع و راه حل تقسیم کرد :
1. طراحی درست دیتابیس بزرگترین کمک رو میتونه به این سناریو بکنه.
2. از جداولی که زیاد ازش کوئری گرفته میشه View بسازید.
3. سعی کنید از Stored Procedures در عملیات گزارشگیری استفاده کنید.
4. همیشه سعی کنید در گزارشات خودتون از Where Clause استفاده کنید تا اینکه بخواین یه دفعه همه ی 50000 رکورد رو در حافظه لود کنید.
5. سعی کنید تا حد امکان از فیلدهای غیر قابل Sort در گزارشات استفاده نکنید.
6. سعی کنید از ایندکس های مناسب در کوئری هاتون استفاده کنید.
7. اگر قصد شما در یک وضعیت خاص، فقط گزارشگیری است، سعی کنید از DataReader استفاده کنید که به خاطر ماهیت Forward-Only اون دارای سرعت بالاتری است.

تمام این موارد دست به دست هم میدن تا به نتیجه ی مطلوبتون برسید.


پیشنهاد شما در خصوص استفاده از LINQ در این خصوص چیست؟
منظورتون کدام نوع Linq است ؟ اگر شما در حال استفاده از آبجکت معمولی Ado.net مثل DataTable و DataSet و ... هستید، Linq to DataSet میتونه گزینه ی خوبی برای شما باشه، ولی باز کوئری شما در حافظه انجام میشود، یعنی اطلاعات در حافظه فیلتر میشود، پس اول باید اطلاعات از دبتابیس خوانده شده و در حافظه قرار بگیرد و بعد Linq وظیفه خودش را انجام دهد.
در صورتی بخواهید از تکنولوژی های مخصوص Linq استفاده کنید مثل Linq To sql یا Linq to Entities باید بگم که اگر به Performance فکر میکنید، این گزینه تعریفی نسبت به آبجکت های Ado.Net نداره، اما اگر مسائل دیگر رو هم در نظر بگیرید، Linq کمک شایانی به شما میکنه، مثلا تمام t-Sql هایی که توسط فن آوری Linq به sql Server فرستاده میشوند همه به صورت Parameterized Query هستند که هم محفوظ در برابر Sql-Attack هست و هم در حافظه Cache میشه. نکته دیگه در رابطه با Linq اینکه فرامین T-Sql ای که به Sql Server فرستاده میشه، همه به صورت بهینه شده فرستاده میشه، مثل فرض کنید اگر شما دستور Update ای داشته باشید که روی سه رکورد در دیتابیس باید اعمال بشه ولی دو رکورد فقط تغییر میکنند، یعنی یک عمل Update زیادی انجام میشه، Linq با توجه به اطلاعات لود شده در حافظه و وضعیت فعلی آن، همان دو دستور آپدیت رو به سرور میفرستد و از فرستادن اون دستور اضافی Update جلوگیری میکنه.

موفق باشید