ORDER BY، TOP و مرتبسازی نتایج
ORDER BY، TOP و مرتبسازی نتایج
بخشی از آموزش جامع SQL Server
محتوای درس ORDER BY، TOP و مرتبسازی نتایج
T-SQL | Sorting، Pagination و Deterministic Order
SQL Server بدون ORDER BY ترتیب Result Set را تضمین نمیکند. Sorting باید بر اساس نیاز Consumer و با Tie-breaker پایدار طراحی شود، بهخصوص زمانی که Pagination وجود دارد.
متن این فصل با رویکرد مرجع فنی و قابل استفاده در پروژه واقعی تنظیم شده است؛ مثالها در امتداد مدل StoreDb نوشته شدهاند و اصطلاحات اصلی SQL Server و T-SQL بهصورت یکدست بهکار میروند.
1. مفاهیم و قراردادهای اصلی
SQL Server بدون ORDER BY ترتیب Result Set را تضمین نمیکند. Sorting باید بر اساس نیاز Consumer و با Tie-breaker پایدار طراحی شود، بهخصوص زمانی که Pagination وجود دارد.
در طراحی پایگاه داده، Syntax تنها بخشی از مسئله است. نوع داده، Constraint، الگوی دسترسی، Transaction و هزینه اجرای Query باید همزمان با نیاز Domain در نظر گرفته شوند.
| مفهوم | کارکرد |
|---|---|
| ORDER BY | مرتبسازی خروجی |
| ASC | صعودی |
| DESC | نزولی |
| TOP | محدود کردن Row |
| OFFSET | رد کردن Row |
| FETCH | دریافت Page |
2. ساختار و Syntax پایه
Sort اصلی و Tie-breaker یکتا کنار هم نوشته میشوند. TOP همراه ORDER BY معنا پیدا میکند و Pagination با OFFSET/FETCH برای Pageهای متعارف قابل پیادهسازی است.
SELECT TOP (10)
Id, Name, Price
FROM dbo.Products
WHERE IsActive = 1
ORDER BY Price DESC, Id ASC;3. سناریوی StoreDb
فهرست محصولات با PageNumber و PageSize روی Id یا ترکیب Sort انتخابشده و Id صفحهبندی میشود. ترتیب کاملاً یکتا از جابهجایی Row میان Pageها جلوگیری میکند.
نمونههای این فصل بر مدل فروشگاهی StoreDb بنا شدهاند تا ارتباط مفاهیم میان فصلها حفظ شود و Queryها در یک Context یکپارچه قابل بررسی باشند.
DECLARE @PageNumber int = 2;
DECLARE @PageSize int = 20;
SELECT Id, Name, Price
FROM dbo.Products
ORDER BY Name, Id
OFFSET (@PageNumber - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;4. اصول طراحی و Performance
طراحی پایدار باید هم صحت داده و هم هزینه اجرای عملیات را پوشش دهد. انتخاب سادهتر زمانی ترجیح دارد که Contract داده را روشنتر و رفتار Optimizer را قابل پیشبینیتر نگه دارد.
- ORDER BY روی Columnهای موردنیاز Consumer انجام شود.
- برای Pageهای عمیق Keyset Pagination قابل بررسی است.
- Index با Sort پرتکرار هماهنگ شود.
- TOP بدون ORDER BY برای «اولین» رکورد منطقی استفاده نشود.
5. خطاهای رایج و نکات ایمنی
دستورهای SQL میتوانند مستقیماً داده و ساختار را تغییر دهند؛ بنابراین بازبینی Context، تعداد Rowهای هدف و اثر Transaction قبل از اجرای تغییرات اهمیت عملی دارد.
- اعتماد به ترتیب Clustered Index بدون ORDER BY.
- Pagination با Sort غیر یکتا.
- OFFSET بسیار بزرگ بدون اندازهگیری.
- مرتبسازی روی Expression پرهزینه در حجم بالا.
6. چکلیست نهایی فصل
- Order صریح است.
- Tie-breaker یکتا وجود دارد.
- TOP و Pagination رفتار پایدار دارند.
- Sort پرتکرار از نظر Index بررسی شده است.
7. جمعبندی
خروجی این فصل باید به تصمیمی قابل اتکا در طراحی یا Query منجر شود؛ صحت داده، قابلیت نگهداری و رفتار Performance سه معیار ثابت برای ارزیابی نمونهها هستند.