صفحه ( Page ) در SQL
در پایگاه داده SQL، صفحه (Page) کوچکترین واحد ذخیرهسازی داده است.
هر صفحه معمولاً ۸ کیلوبایت اندازه دارد و شامل دادههای جدول، ایندکسها یا اطلاعات مربوط به تخصیص حافظه است.
هنگامی که یک جدول دادهها را ذخیره میکند، رکوردهای آن در صفحات توزیع میشوند و SQL Server دادهها را بهصورت صفحهای مدیریت میکند تا عملیات خواندن و نوشتن بهینه شود.
هر صفحه دارای ساختار مشخصی شامل سربرگ (Header)، فضای ذخیره داده و فضای مدیریت رکوردها است.
سربرگ صفحه اطلاعاتی مانند شماره صفحه، نوع دادههای ذخیرهشده و وضعیت پر شدن صفحه را نگه میدارد.
نوع صفحات میتواند دادهای (Data Page)، ایندکس (Index Page)، صفحه تخصیص (IAM Page) و موارد دیگر باشد که هر کدام نقش خاصی در مدیریت پایگاه داده ایفا میکنند.

روشهای پیادهسازی صفحهبندی در SQL
دو روش متداول برای پیادهسازی صفحهبندی در SQL استفاده از LIMIT و OFFSET و روش استفاده از ROW_NUMBER() است.
-
استفاده از LIMIT و OFFSET
این روش در پایگاه دادههایی مانند MySQL و PostgreSQL استفاده میشود.
SELECT * FROM productsORDER BY id ASCLIMIT 10 OFFSET 20;
LIMIT 10: تعداد رکوردهای نمایش داده شده را مشخص میکند.
OFFSET 20: تعیین میکند که نمایش از رکورد بیستم شروع شود.
مشکلات روش LIMIT و OFFSET
-
- کاهش کارایی در حجم دادههای بالا: اگر مقدار OFFSET بزرگ باشد، پایگاه داده باید از رکوردهای قبلی عبور کند و این باعث کاهش عملکرد میشود.
- عدم پایداری در نمایش دادهها: اگر در طول زمان دادهها تغییر کنند، کاربران ممکن است نتایج نامنظمی ببینند.
در پایگاه دادههایی مانند SQL Server و Oracle، میتوان از تابع () ROW_NUMBER برای صفحهبندی استفاده کرد:
WITH PaginatedResults AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY id ASC) AS row_num FROM products)SELECT * FROM PaginatedResultsWHERE row_num BETWEEN 21 AND 30;
() ROW_NUMBER شماره هر سطر را تعیین میکند.
BETWEEN 21 AND 30 مشخص میکند که رکوردهای بین این اعداد نمایش داده شوند.

مزایای صفحه ( Page ) در SQL
صفحهبندی (Pagination) در SQL مزایای زیادی دارد، مخصوصاً وقتی با دادههای بزرگ کار میکنیم.
در ادامه، مهمترین مزایای صفحهبندی در SQL را بررسی میکنیم:
-
بهبود کارایی و عملکرد (Performance Optimization)
- بدون صفحهبندی، وقتی درخواست SELECT * FROM table ارسال میشود، کل دادهها بازیابی میشوند که باعث مصرف زیاد حافظه (RAM) و کندی پاسخگویی میشود.
- با صفحهبندی (LIMIT و OFFSET)، فقط یک بخش از دادهها بارگذاری میشود و سرعت پردازش افزایش مییابد.
مثال: نمایش ۱۰ کاربر در هر صفحه
SELECT * FROM Users
ORDER BY created_at DESC
LIMIT 10 OFFSET 0; -- فقط 10 رکورد دریافت میشود
-
تجربه کاربری بهتر (Better User Experience)
- صفحهبندی باعث بارگذاری سریعتر دادهها در برنامهها و وبسایتها میشود.
- کاربران میتوانند بهصورت تدریجی دادهها را مشاهده کنند بدون اینکه کل اطلاعات نمایش داده شود.
مثال: نمایش لیست محصولات در یک فروشگاه اینترنتی
به جای نمایش ۱۰,۰۰۰ محصول در یک صفحه، آنها را در صفحات ۱۰ تایی نمایش میدهیم.
-
کاهش مصرف منابع سرور (Reduced Server Load)
- اجرای کوئریهای بدون صفحهبندی باعث لود بیشازحد روی CPU و RAM سرور میشود.
- با صفحهبندی، سرور فقط مقدار کمی از دادهها را پردازش میکند و باعث افزایش سرعت پاسخگویی میشود.
-
جلوگیری از مشکلات Timeout و کندی برنامه
- در سیستمهایی با دادههای زیاد، اجرای کوئریهای بدون صفحهبندی میتواند باعث Timeout و عدم پاسخگویی سرور شود.
- استفاده از صفحهبندی از این مشکل جلوگیری میکند و پاسخگویی بهتری ارائه میدهد.
-
سازگاری با APIها و RESTful Services
- در APIهای REST و GraphQL معمولاً دادهها بهصورت صفحهبندی شده ارائه میشوند.
- صفحهبندی باعث میشود که درخواستهای API سبکتر شده و عملکرد کلی سیستم بهتر شود.
مثال: دریافت کاربران از API در صفحه ۳ با ۱۰ رکورد در هر صفحه
GET /api/users?page=3&limit=10
-
امکان پیمایش بهتر در دادهها (Easy Navigation)
- صفحهبندی امکان انتخاب صفحه خاص، حرکت به صفحه بعدی یا قبلی را فراهم میکند.
- کاربران میتوانند با کلیک روی شماره صفحات، دادههای مورد نظر خود را مشاهده کنند.
-
بهینهسازی گزارشگیری و پردازش دادهها
- در گزارشگیریهای Dashboardها و BI (Business Intelligence)، صفحهبندی نمایش دادهها را کارآمدتر میکند.
- هنگام تحلیل دادهها، نیازی به بارگذاری همه رکوردها نیست و فقط دادههای مورد نیاز در لحظه پردازش میشوند.

بهینهسازی صفحهبندی
برای افزایش کارایی صفحهبندی، میتوان از روشهای زیر استفاده کرد:
-
استفاده از فیلترهای WHERE برای محدود کردن تعداد رکوردهای پردازششده.
-
استفاده از شاخصها (Indexes) برای افزایش سرعت جستجو و مرتبسازی.
-
استفاده از تکنیکهای کش (Caching) برای کاهش درخواستهای مکرر به پایگاه داده.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟
با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
همین حالا شروع کنید و به دنیای دادهها بپیوندید!
مثال پروژه محور صفحه ( Page ) در SQL
سناریو: سیستم مدیریت مقالات
فرض کنید در حال طراحی یک سیستم مدیریت مقالات هستیم که کاربران میتوانند مقالات خود را در آن منتشر کنند.
با افزایش تعداد مقالات، نمایش تمام دادهها در یک درخواست باعث افت کارایی میشود.
بنابراین، باید از صفحهبندی (Pagination) برای نمایش مقالات استفاده کنیم.
ابتدا یک جدول برای ذخیره مقالات ایجاد میکنیم:
CREATE TABLE Articles (
id INT PRIMARY KEY IDENTITY(1,1),
title NVARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at DATETIME DEFAULT GETDATE()
);
برای تست صفحهبندی، تعدادی مقاله نمونه وارد میکنیم:
INSERT INTO Articles (title, content)
VALUES
('مقاله اول', 'محتوای مقاله اول'),
('مقاله دوم', 'محتوای مقاله دوم'),
('مقاله سوم', 'محتوای مقاله سوم'),
('مقاله چهارم', 'محتوای مقاله چهارم'),
('مقاله پنجم', 'محتوای مقاله پنجم');
-
پیادهسازی صفحهبندی (Pagination)
برای دریافت مقالات به صورت صفحهبندیشده، از OFFSET و FETCH در SQL Server استفاده میکنیم:
نمایش صفحه اول (۵ مقاله در هر صفحه)
DECLARE @PageNumber INT = 1;
DECLARE @PageSize INT = 2;
SELECT id, title, content, created_at
FROM Articles
ORDER BY created_at DESC
OFFSET (@PageNumber - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
-
مقدار @PageNumber شماره صفحه و @PageSize تعداد مقالات در هر صفحه است.
-
OFFSET مشخص میکند چند سطر باید رد شود.
-
FETCH NEXT تعداد سطرهایی که باید نمایش داده شود را تعیین میکند.
برای دریافت صفحه دوم کافیست مقدار @PageNumber را تغییر دهیم:
DECLARE @PageNumber INT = 2; -- صفحه دوم
DECLARE @PageSize INT = 2;
SELECT id, title, content, created_at
FROM Articles
ORDER BY created_at DESC
OFFSET (@PageNumber - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
نتیجه
- این روش باعث میشود که بدون بارگذاری همه مقالات، فقط مقالات مورد نیاز در صفحه نمایش داده شوند، که کارایی را بهبود میبخشد.
- در برنامههای واقعی، میتوان این کوئری را در یک API یا نرمافزار سمت کلاینت برای مدیریت صفحهبندی پیادهسازی کرد.