حسین بیگی
حسین بیگی
خواندن ۱ دقیقه·۳ سال پیش

حکایت شیخ و مریدان : Pagination in SQL


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

در همین حین مریدی برخواست و به شیخ گفت:ای شیخ مسئلتون، جدولی داریم 1 میلیون رکورد دارد!

- باریکلا!

- ارادت! حال برای نمایش تمام داده ها صفحه بندی کردیم، کارهرآدم عاقلی!!!اما وقتی صفحات به انتهای خود نزدیک میشوند کوئری ها سنگین شده و انگار دیگر صفحه بندی هم فایده ای ندارد!چه کنیم؟؟

شیخ دستی به موهای بلند روغن زده خود کشید و گفت : بگو ببینم از مرید چگونه صفحه بندی کردی؟؟؟

مرید گفت : در دیتابیس با استفاده از OFFSET.

شیخ گفت : همین اشتباه است!بدانید و آگاه باش ای مرید!زمانی که یک جدول را کوئری میزنی که رکورد زیادی دارد، دیتابیس به این صورت عمل میکند که تمام رکورد ها را گرفته(بدبخت IO) و اضافی هایش را دور میریزد!به همین علت به این مشکل برخوردی!زمانی که میگویی به من 100 ردیف بده که از بین 100000 تا 100100 باشد

OFFSET پدر پرفرمنس را در میاورد!

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

-شیخ گفت:کاری کنید که به آن اصطلاحا SEEK میگویند!بروید و هنگام تعویض صفحه آخرین ID که در صفحه وجود داشت برگردانید، سپس با یک کوئری ساده به همراه اندکی INDEX زیبا چنان قشنگ بروید بالای سر ردیف که من نیز خشتک بدرم!از آنجا تعدادی را بگیرید و برگردانید!انتخاب اینکه کوئری را چگونه بزنید هم دستت خودتان است!

اینگونه نیازی به گشت و گذار و حرام کردن IO بیچاره نیازی نیست!

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

لینک منبع برای مطالعه بیشتر و دقیق تر :

https://use-the-index-luke.com/no-offset

شیخ
شاید از این پست‌ها خوشتان بیاید