PDA

View Full Version : حرفه ای: بهینه بودن کوئری ها هنگام گرفتن گزارش تعداد از دیتابیس



سعید کشاورز
پنج شنبه 04 مرداد 1397, 09:47 صبح
سلام دوستان.
یه سوال داشتم
فرض کنید یه فروشگاه طراحی کردید و در قسمت داشبورد قرار هست یک سری گزارش بر اساس تعداد نمایش بدین
مثلا تعداد سفارش های امروز
تعداد پرداختی های موفق
تعداد کل سفارشات
تعداد سفارشات این هفته
و......
این مواردی که گفتم همگی در یک جدول قرار دارند
حالت اول:
یک کوئری به دیتابیس زده میشه و کل رکوردها ToList میشود و سپس مقدار آن درون یک متغیر از جنس Var ریخته میشود و کوئری های تعداد از طریق این متغیر به دست می آید( دیگه نیازی نیست با دیتابیس کار کنیم)

حالت دوم:
برای هر گزارش از طریق دستور Count یک درخواست به دیتابیس ارسال شود ( مثلا count سفارشات امروز)
میخواستم بدونم کدوم روش بهینه تره هست؟ یا اصلا روش بهتری وجود دارد؟

mr.sirwan
پنج شنبه 04 مرداد 1397, 12:21 عصر
سلام، به نظر بنده همون حالت دوم خیلی بهتر و بهینه تر هستش، چون شما نهایتا تعداد رکوردهارو برمیگردونین، اما در حالت اول فرض کنین یک میلیارد سفارش در جدول داشته باشید، و بیاین کل اون یک میلیارد رکورد رو فقط به خاطر شمارش تعدادهای موردنظر روی سرور واکشی کنین، تصورش رو کنین که چقد از حافظه سرور رو بی خودی اشغال میکنه، و حالا در نظر بگیرین مثلا وب سایت شما چندین مدیر یا متصدی داره که اجازه گزارش گیری دارن اگه بخواین به ازای درخواست هر کدوم از مدیران یا متصدی ها یک میلیارد رکورد رو واکشی کنین دیگه خودتون به عمق فاجعه پی میبرین

سعید کشاورز
پنج شنبه 04 مرداد 1397, 12:28 عصر
سلام، به نظر بنده همون حالت دوم خیلی بهتر و بهینه تر هستش، چون شما نهایتا تعداد رکوردهارو برمیگردونین، اما در حالت اول فرض کنین یک میلیارد سفارش در جدول داشته باشید، و بیاین کل اون یک میلیارد رکورد رو فقط به خاطر شمارش تعدادهای موردنظر روی سرور واکشی کنین، تصورش رو کنین که چقد از حافظه سرور رو بی خودی اشغال میکنه، و حالا در نظر بگیرین مثلا وب سایت شما چندین مدیر یا متصدی داره که اجازه گزارش گیری دارن اگه بخواین به ازای درخواست هر کدوم از مدیران یا متصدی ها یک میلیارد رکورد رو واکشی کنین دیگه خودتون به عمق فاجعه پی میبرین

ممنون از پاسختون..

حالا یه سوالی که برام پیش اومد در رابطه با سایت های خبری مثل تابناک و ... هست.

واسه صفحه بندی اطلاعات از کتابخونه هایی که استفاده میشه واسه بحث صفحه بندی نیاز هست که اول داده ها Tolist بشن بعدش صفحه بندی صورت میگیره. حالا اینجا عمق فاجعه بیشتر میشه و دیگه بحث مدیر و اپرانور نیست
بحث کاربران سایت هست که ممکنه تعداد درخواست ها در لحظه خیلی باشه. توی این مورد چطور؟ آیا صفحه بندی اطلاعات راه بهینه تری داره؟

mr.sirwan
پنج شنبه 04 مرداد 1397, 12:45 عصر
نمیدونم سایت تابناک از چه کتابخونه و پلاگین هایی استفاده کرده، اما بنده برای صفحه بندی از jquery datatables استفاده میکنم، در حالت عادی این پلاگین هم تمامی رکوردهارو واکشی میکنه و خود پلاگین سمت کلاینت کد html رو از این رکوردها تولید میکنه و صفحه بندی رو ایجاد میکنه (همون قضیه میشه) اما این کتابخونه یه اپشن داره با اسم server side proccessing از طریق اون بنده صفحه بندیامو سمت سرور بصورت کاملا کاستوم و بهینه انجام میدم و دیگه نگران سربار اضافه نیستم

سعید کشاورز
پنج شنبه 04 مرداد 1397, 14:00 عصر
نمیدونم سایت تابناک از چه کتابخونه و پلاگین هایی استفاده کرده، اما بنده برای صفحه بندی از jquery datatables استفاده میکنم، در حالت عادی این پلاگین هم تمامی رکوردهارو واکشی میکنه و خود پلاگین سمت کلاینت کد html رو از این رکوردها تولید میکنه و صفحه بندی رو ایجاد میکنه (همون قضیه میشه) اما این کتابخونه یه اپشن داره با اسم server side proccessing از طریق اون بنده صفحه بندیامو سمت سرور بصورت کاملا کاستوم و بهینه انجام میدم و دیگه نگران سربار اضافه نیستم
منظورم سمت کاربر بود نه پتل ادمین
فرض کنید آرشیو بلاگ یک سایت شامل 10000 تا رکورد باشه.
حالا یه کاربری بخواد اون آرشیو رو ببینه باید صفحه ای ببینه و توی هر صفحه مثلا 10 تا مطلب رو
نمونه این کار مثلا سایت persiangfx.com در پایین سایت صفحه بندی میشه. اگر حرف اولتون رو ملاک قرار بدیم باز هم اینجا داره کل اطلاعات از دیتابیس خونده میشه و بعدش صفحه بندی روش صورت میگیره

mr.sirwan
پنج شنبه 04 مرداد 1397, 14:12 عصر
متوجه نشدم، خب صفحه بندی سمت سرور مگه فقط برای پنل ادمین استفاده میشه؟ توی فرانت اند هم میتونین از صفحه بندی سمت سرور استفاده کنین، شاید شما منظور منو متوجه نشده باشین، من گفتم اون کتابخونه ای که من استفاده میکنم در حالت عادی کل اطلاعاتو واکشی میکنه، در این حالت تفاوتی نمیکنه واکشی توی فرانت اند باشه یا بک اند، کل رکورد ها واکشی میشه سمت کلاینت (براوزر) و اونجا صفحه بندی انجام میشه
اما در ادامه گفتم که این کتابخونه یه اپشن داره که طوری طراحی شده که اندیس صفحه جاری و تعداد رکورد های قابل نمایش در هر صفحه و فیلتر های اعمال شده توسط کاربر رو به سرور ارسال میکنه، و شما سمت سرور طبق اون اطلاعاتی که بدستتون رسیده صفحه بندی رو انجام میدین و رکورد های واکشی شده رو به کاربر برمیگردونین
در این حالت باید از متدهای skip و take استفاده کنین بعدا متد tolist رو فراخوانی کنین....
نه اینکه همون اول متد tolist رو فراخوانی کنین، کل اطلاعات واکشی بشه توی رم سرور و بعد بیاین صفحه بندی رو روی یک میلیارد رکورد مقیم در رم انجام بدین

r4hgozar
دوشنبه 08 مرداد 1397, 21:45 عصر
سلام/
صفحه بندی به روش های متعددی انجام میشه.
اما در کل لازم نیست شما حتما همه رو tolist بکنی و بعد count بگیری . می تونی کانت بگیری الگوریتم رو اجرا کنی و با دستور take مقدار مورد نیازت رو بگیری. البته پلاگین ها هم واسه نمایشش وجود داره.
بعد سایت های بزرگ چون معمولا سرور دارن و یا vps دارن و parallel-programming رو به خوبی پیاده سازی می کنن.
از طرفی تو cms های قوی طراح دیتابیس بصورت جدا و تخصصی هستن و کارشون بهینه سازی واکشی اطلاعاته.
در کل بهینه بودن مختص به کوئری نیست.
موفق باشی

nunegandom
شنبه 13 مرداد 1397, 21:03 عصر
با سلام
برای صفحه بندی از این (https://github.com/dncuug/X.PagedList) میتونید استفاده کنید
هم سادست هم بهینست
فقط وقتی که اضافه کردید به پروژه فایل css اش توش نیست که اونم اینجاست (https://github.com/dncuug/X.PagedList/blob/master/examples/X.PagedList.Mvc.Example/Content/PagedList.css) من که سایت رو اول میپرسم قراره سرور بگیرن یا خیر و بر اساس منابعی که در اختیار میذارن درست میکنم شما رو نمیدونم مشتریا ما که این مدلی هستن:لبخند::بامزه: