PDA

View Full Version : حرفه ای: گرفتن اطلاعات رکوردهای خیلی زیاد از پایگاه داده



alonemm
چهارشنبه 22 دی 1389, 12:55 عصر
باسلام:
من توی php برای گرفتن اطلاعات زیاد از پایگاه داده ام از کوئری با روش limit و دادن start و end تمامی رکورد های بالا رو میگرفتم و در هر لود مثل 5 رکورد رو میگرفتم.
حلا برای پیاده سازی این سناریو در دات نت و این که مثل یک کوئری رو که مثل یک ملیون رکورد داره و میخوام اطلاعات رو بگیرم از کدام روش استفاده کنم که بهینه تر باشه.

Vahid_moghaddam
چهارشنبه 22 دی 1389, 13:37 عصر
اگه از Ado.net استفاده می کنید (DataReader و ...) از Paging در Sql استفاده کنید (با فرض SqlServer بودن دیتابیس). اینجا (http://www.15seconds.com/issue/070628.htm) رو ببینید.
اگه از LinqToSql یا EntityFramework و موجودات مشابه استفاده می کنید با استفاده از متدهای skip و take

alonemm
چهارشنبه 22 دی 1389, 16:05 عصر
من از SQL و فضای نام


using System.Data.SqlClient;

استفاده میکنم.

aminghaderi
چهارشنبه 22 دی 1389, 16:53 عصر
از شی DataSet هم می تونی استفاده کنی ، کار کردن باهاش خیلی جالبه و کارآیی اون خیلی تمیز و مرتب هست.
منتهی من رکورد بالا باهاش تا حالا فراخونی نکردم ، مزیت زیاد داره که متاسفانه الان حضور خاطر ندارم ، مثلا یکیش اینه که مادام به اسکیوال وصل نیست و در هر بار اطلاعاتی رو می گیره و ارتباطش رو قطع می کنه و این یه نقطه مثبت به شما می یاد.
موردی بعدی کاستوم بودن اون هست شما می تونی بعد هر فراخونی ساختارش رو Reset کنی و اطلاعاتش رو پاک کنی.
مورد بعدی ساختار Table شکلش هست که شما می تونی به صورت هم زمان اطلاعات خاصی رو از جداول خواص db داشته باشی و ...
ولی چیزی که خیلی جالبه به درد شما هم می خوره اینه که اطلاحا مثل موم توی دست برنامه نویس هست.
من باهاش گریدویو اجکسی طراحی کرده ام که اگر هر چه قدر هم داده داخل db باشه ، این بعد هر بار اتصال به سرور فقط 10 تاش رو می گیره می یاره تحویل کلاینت می ده و تا حالا باهاش مشکل نداشتم ، سرعتش هم عالی هست ولی همون طور که گفتم من هنوز db با رکورد بالا نداشتم که روش تست داشته باشم ، هست ولی به ملیون هنوز نمی رسه.
شخصا مدیریت مباحث داده ای رو بر دوش خود اسکیوال انداختم ، به نظر من برای بحث های رده بالا فقط می شه به کار خود ماکروسافت اعتماد کرد ، چرا که تمامی جوانب درش رعایت شده و همچنین تعداد رکورد های ملیونی رو برای تست نتیجه بروی اون تحمیل کردند.

موفق باشی.

mmnoody2006
چهارشنبه 22 دی 1389, 17:54 عصر
داداش بهترین راه اینه که بری سراغ عمو گوگلی بعد ازش بپرسی custom paging یه حالی بهت می ده که نگو

majnun
چهارشنبه 22 دی 1389, 18:05 عصر
همون که دوستمون در بالا گفته بهترین راه است ...

صفحه بدی به وسیله ی استرودپروسیجر

شما فرض کنید 10000 رکورد دارید که در هر صفحه 10 تا را نشون میدین

خب کاربر شما در بازدید از 10 صفحه اول شاید به جوابش برسه پس نباید به هیچ وجه داده اضافی لود کنید ...

یک استرودپروسیجر مینویسید که شماره صقحه را بهش میدید و او به همون تعداد رکورد براتون میاره

بگردین هست ، خودم یکبار سوال کردم جوابم را دادند

alonemm
پنج شنبه 23 دی 1389, 14:22 عصر
همون که دوستمون در بالا گفته بهترین راه است ...

صفحه بدی به وسیله ی استرودپروسیجر

شما فرض کنید 10000 رکورد دارید که در هر صفحه 10 تا را نشون میدین

خب کاربر شما در بازدید از 10 صفحه اول شاید به جوابش برسه پس نباید به هیچ وجه داده اضافی لود کنید ...

یک استرودپروسیجر مینویسید که شماره صقحه را بهش میدید و او به همون تعداد رکورد براتون میاره

بگردین هست ، خودم یکبار سوال کردم جوابم را دادند

دوست من شما نمونه این SP رو دارید؟
بعد چجوری به یک شی مثل ObjectDataSourc وصلش کنم؟

Javad_Darvish_Amiry
شنبه 02 بهمن 1389, 14:19 عصر
سلام خسته نباشید. نمونه پروسیجری که نیاز دارید میتونه این باشه:


CREATE PROCEDURE [dbo].[kavand_Article_BrowseArticles]
(
@PageIndex int,
@PageSize int

)
AS
SET NOCOUNT ON


SELECT * FROM
(
SELECT kavand_Articles.ArticleId ,
kavand_Articles.CategoryId ,
kavand_Articles.ArticleTitle ,
kavand_Articles.ArticleDescription ,
kavand_Articles.ArticleAbs ,
kavand_Articles.ArticleWriter ,
kavand_Articles.AddedUtc ,
kavand_Articles.Viewed ,
kavand_Articles.PhotoId ,
kavand_Articles.UpdatedUtc ,
kavand_Categories.CategoryTitle AS CategoryTitle,

ROW_NUMBER() OVER (ORDER BY AddedUtc DESC) AS RowNum

FROM kavand_Articles INNER JOIN
kavand_Categories ON kavand_Articles.CategoryId = kavand_Categories.CategoryId

) Articles

WHERE Articles.RowNum BETWEEN (@PageIndex * @PageSize + 1) AND ((@PageIndex + 1) * @PageSize)


موفق باشید.

Mostafa_Dindar
شنبه 02 بهمن 1389, 14:46 عصر
دوست من شما نمونه این SP رو دارید؟
بعد چجوری به یک شی مثل ObjectDataSourc وصلش کنم؟

لطفا قبل از ایجاد تاپیک جستجو بفرمائید :

http://barnamenevis.org/showthread.php?199437-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Custom-Paging-amp-Sorting-%D8%AF%D8%B1-Sql2005-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%A7-%D9%86%D9%85%D9%88%D9%86%D9%87-%D9%83%D8%AF-%D8%A8%D8%B1%D8%A7%D9%8A-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF (http://barnamenevis.org/showthread.php?199437-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Custom-Paging-amp-Sorting-%D8%AF%D8%B1-Sql2005-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%A7-%D9%86%D9%85%D9%88%D9%86%D9%87-%D9%83%D8%AF-%D8%A8%D8%B1%D8%A7%D9%8A-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF)

rana-writes
شنبه 02 بهمن 1389, 21:17 عصر
سلام
من یه سوال داشتم
حالا اگه گرید رو با این روش صفحه بندی کنیم، میشه روی رکوردها کار انجام داد؟ مثلا لینک باتن بذارم و توش عمل حذف انجام بدم؟
یا آی دی یه رکورد رو به عنوان کوئری استرینگ به یه صفحه بفرستم؟
منظورم اینه که اگه با این روش پیجینگ رو انجام بدم کارهای عادی گرید مختل نمیشه؟

alonemm
چهارشنبه 05 بهمن 1390, 13:59 عصر
سلام
من یه سوال داشتم
حالا اگه گرید رو با این روش صفحه بندی کنیم، میشه روی رکوردها کار انجام داد؟ مثلا لینک باتن بذارم و توش عمل حذف انجام بدم؟
یا آی دی یه رکورد رو به عنوان کوئری استرینگ به یه صفحه بفرستم؟
منظورم اینه که اگه با این روش پیجینگ رو انجام بدم کارهای عادی گرید مختل نمیشه؟
بله میشه:
به لینک زیر مراجعه کنید:
http://barnamenevis.org/showthread.php?322558-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-Custom-Paging-%D8%AF%D8%B1-GridView-%D8%A8%D8%A7-%D8%AA%DA%A9%

javad_mjt
چهارشنبه 05 بهمن 1390, 22:13 عصر
سلام از linq هم میشه استفاده کرد.
از take و skip باید استفاده کرد