بهینهسازی کوئریها با SELECT TOP در SQL Server: مثالهای کاربردی
دستور SELECT TOP N برای بازیابی N رکورد اول از پایگاه داده استفاده میشود. N در اینجا نشاندهنده تعداد رکوردهایی است که میخواهید بازیابی کنید. بدون استفاده از بند ORDER BY، نتایج ممکن است غیرقابل پیشبینی باشند، زیرا SQL Server هیچ ترتیب خاصی را تضمین نمیکند مگر اینکه صراحتاً به آن دستور داده شود. با این حال، تعدادی از N ردیف را برمیگرداند. به عنوان مثال، برای انتخاب 10 محصول اول از جدول Production.Product، میتوانید از کد زیر استفاده کنید:
SELECT TOP 10 * FROM Production.Product;
هنگامی که دستور SELECT TOP N را همراه با بند ORDER BY استفاده میکنید، نتایج قابل پیشبینی و قطعی خواهند بود. بند ORDER BY تضمین میکند که دادهها قبل از انتخاب N ردیف بالا، بر اساس ستونهای مشخص شده مرتبسازی شوند. این رایجترین و توصیهشدهترین روش استفاده از TOP N است، زیرا نتایج معنیداری را ارائه میدهد و به بهبود عملکرد کوئری کمک میکند. برای مثال، برای انتخاب 10 محصول با بزرگترین ProductID، کد زیر را به کار ببرید:
SELECT TOP 10 * FROM Production.Product ORDER BY ProductID DESC;
به جای مشخص کردن تعداد دقیق ردیفها، میتوانید از کلمه کلیدی PERCENT برای بازیابی درصدی از کل ردیفها استفاده کنید. این قابلیت زمانی مفید است که بخواهید زیرمجموعهای متناسب از دادههای خود را بدون دانستن تعداد کل دقیقاً قبل از آن بدست آورید، که یک روش کارآمد برای فیلتر داده محسوب میشود. برای مثال، برای انتخاب 10 درصد از محصولات بر اساس ProductID صعودی، کوئری زیر را اجرا کنید:
SELECT TOP 10 PERCENT * FROM Production.Product ORDER BY ProductID;
گزینه WITH TIES در کنار ORDER BY استفاده میشود. اگر آخرین ردیف انتخاب شده (ردیف Nام) در ستون(های) ORDER BY همان مقدار را داشته باشد که سایر ردیفهای انتخاب نشده دارند، WITH TIES تمام آن ردیفهای “برابر” را شامل میشود. این بدان معناست که ممکن است بیش از N ردیف دریافت کنید، که در سناریوهای خاص محدود کردن نتایج بسیار کاربردی است. برای مثال، برای انتخاب 5 محصول گرانقیمت به همراه تمام محصولات همقیمت با ردیف پنجم، کد زیر را به کار ببرید:
SELECT TOP 5 WITH TIES * FROM Production.Product ORDER BY ListPrice DESC;
میتوانید SELECT TOP را با بندهای GROUP BY و HAVING ترکیب کنید تا نتایج تجمیعشدهای را برای N گروه برتر به دست آورید. این یک روش قدرتمند برای خلاصهسازی دادهها و سپس انتخاب مرتبطترین ردیفهای خلاصه است که به تحلیل داده کمک میکند. به عنوان مثال، برای یافتن 3 مدل محصول با بیشترین تعداد محصولات، کوئری زیر را استفاده کنید:
SELECT TOP 3 ProductModelID, COUNT(*) AS TotalProducts FROM Production.Product GROUP BY ProductModelID ORDER BY TotalProducts DESC;
اگرچه به معنای واقعی کلمه یک بند TOP N نیست، OFFSET FETCH یک جایگزین مدرن است که از SQL Server 2012 به بعد در دسترس قرار گرفته و کنترل بیشتری بر روی صفحهبندی (pagination) ارائه میدهد. این دستور با ORDER BY استفاده میشود و به شما امکان میدهد تعداد مشخصی از ردیفها را رد کنید (OFFSET) و سپس تعداد مشخصی از ردیفها را بازیابی کنید (FETCH NEXT N ROWS ONLY). این روش برای فیلترینگ پیشرفته دادهها و بهبود کارایی در نمایش نتایج بزرگ کاربرد دارد. برای مثال، برای رد کردن 10 ردیف و سپس بازیابی 5 ردیف بعدی، کد زیر را بنویسید:
SELECT * FROM Production.Product ORDER BY ProductID OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;