در زمان پياده سازي برنامه هاي وب ، ممکن است به مواردي برخورد نمائيم که مي بايست به تعداد مشخصي از جديدترين رکوردهاي درج شده در يك بانک اطلاعاتي دستيابي و آنان را بر روي يک صفحه وب نمايش دهيم. مثلا" يک وب سايت خبري ممکن است داراي يک جدول بانک اطلاعاتي باشد ( مثلا" NewsStoriesTable ) که براي هر خبري که تعر يف مي گردد يک رکورد را در جدول مربوطه اضافه مي نمايد . در صورتي که بخواهيم صرفا" ده خبر جديد موجود در بانک اطلاعاتي را بر روي صفحه اصلي سايت منتشر نمائيم ، از چه روش و يا روش هائي مي توان استفاده نمود؟ احتمالا" پيشنهاد مي نمائيد که از عبارت و يا دستور SELECT به صورت زير استفاده گردد :
SELECT * FROM NewsStoriesTable
روش فوق ، تمامي رکوردهاي موجود در جدول NewsStoriesTable را برمي گرداند ( نه صرفا" ده رکورد جديد موجود در بانک ) . در صورتي که بخواهيم صرفا" تعداد مشخصي از رکوردها را استفاده نمائيم ، مي بايست با استفاده از منطق برنامه نويسي عمليات فيلترينگ را انجام تا صرفا" N رکورد مورد نظر با عبور از فيلتر ايجاد شده شرايط موجود در برنامه را تامين نمايند.
آيا روش فوق گزينه اي منطقي است ؟ پاسخ به سوال فوق منفي است و براي بازيابي رکوردهاي موجود در بانک اطلاعاتي از مکانيزم هاي قدرتمند و مناسبي استفاده نشده است ، چراکه در ابتدا مي بايست تمامي رکوردهاي موجود در بانک پس از اجراي query مورد نظر برگردانده شده و در ادامه بر روي صفحه وب منتقل و با توجه به کد نوشته شده ، تعداد مشخصي از آنان را نمايش و يا ساير عمليات دلخواه را بر روي آنان انجام داد . بديهي است به موازات افزايش تعداد رکوردهاي موجود در بانک ، کارآئي روش فوق كاهش خواهد يافت .
از ديگر روش هاي موجود،استفاده از کليد واژه هاي TOP و ROWCOUNT در ارتباط با سرويس دهنده SQL است . با استفاده از کليد واژه هاي فوق مي توان تعداد رکورد برگردانده شده توسط اجراي يک query را محدود به تعداد مشخصي نمود . بدين ترتيب ، حجم اطلاعات بازيابي شده در اثر اجراي يک query کاهش يافته و امکان مشاهده آنان با صرف زمان مناسب فراهم مي گردد .
در ادامه با تمرکز برروي هر يک از کليد واژه هاي TOP و ROWCOUNT با نحوه استفاده از آنان بيشتر آشنا مي شويم .
اعمال محدوديت در بازيابي ركوردها با استفاده از TOP
کليد واژه TOP در SQL SERVER 7.0 معرفي و هدف آن ارائه روشي به منظور اعمال محدوديت در بازيابي نتايج حاصل از اجراي يك SELECT query مي باشد . با استفاده از TOP مي توان N ركورد جديد موجود در بانك را و يا X درصد از ركوردهاي جديد را بازيابي نمود . گرامر استفاده از TOP به صورت زير است :
SELECT TOP N select list FROM TableName 'Example : SELECT TOP 5 * FROM authors |
الگوي دوم |
SELECT TOP X PERCENT select list FROM TableName 'Example : SELECT TOP 25 PERCENT au_lname, au_fname FROM authors WHERE zip = '92101' |
در كد فوق ، N و X مي بايست داراي مقادير صحيح مثبت باشند و در صورتي كه از الگوي دوم استفاده مي گردد ، X مي بايست داراي مقداري بين صفر تا يكصد باشد .
استفاده از TOP ، باعث دستيابي به N ركورد جديد و يا X درصد از ركوردهاي جديد موجود در بانك اطلاعاتي مي گردد . معمولا" چنين درخواست هائي به همراه ORDER BY استفاده مي گردد . مثلا" براي برگرداندن ده ركورد و يا خبر جديد ، مي بايست از ORDER BY نبز به منظور مرتب سازي آنان بر اساس تاريخ درج در بانك اطلاعاتي ( PublicationDate ) استفاده گردد . كد زير نحوه انجام ابن كار را نشان مي دهد :
SELECT TOP 10 NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable ORDER BY PublicationDate DESC |
اعمال محدوديت در بازيابي ركوردها با استفاده از ROWCOUNT
قبل از SQL SERVER 7.0 ، تنها روش موجود براي اعمال محدوديت در بازيابي ركوردهائي که در اثر اجراي يك query برگردانده مي شوند ، استفاده از متغير ROWCOUNT بود که در ابتدا و قبل از اجراي هر گونه query مي بايست به آن يک مقدار عددي بزرگتر از صفر نسبت داده شود :
SET ROWCOUNT N
پس از مقداردهي متغير ROWCOUNT ، تمامي عبارات زيرمجموعه SQL موجود در حوزه ، صرفا" قادر به پردازش N رکورد خواهند بود . اکثر نسخه هاي جديد سرويس دهنده SQL همچنان امکان استفاده از ROWCOUNT را حمايت مي نمايند . بخاطر داشته باشيد که مقدار نسبت داده شده به متغير ROWCOUNT صرفا" در ارتباط با دستور SELECT اعمال نخواهد شد و دستورات و يا عبارات ديگري نظير INSERT , UPDATE و DELETE را نيز شامل مي شود . كد زير نحوه استفاده از ROWCOUNT به منظور بازيابي ده ركورد جديد موجود در جدول NewsStoriesTable را نشان مي دهد :
SET ROWCOUNT 10 SELECT NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable ORDER BY PublicationDate DESC |
در صورتي كه از SQL SERVER 6.5 و نسخه هاي قبل از آن استفاده مي گردد ، مجبور به استفاده از ROWCOUNT خواهيم بود چراكه در نسخه هاي فوق TOP معرفي نشده و امكان استفاده از آن وجود نخواهد داشت . به منظور استفاده از TOP مي بايست حداقل از نسخه SQL Server 7.0 استفاده گردد .
در صورتي كه از يك عبارت SELECT استفاده مي گردد و دقيقا" مشخص است كه چه تعداد ركورد را مي بايست بازيابي نمود ، پيشنهاد مي گردد كه از TOP استفاده گردد . TOP به منظور كار با عبارت SELECT طراحي شده است و داراي اثرات جانبي ROWCOUNT نمي باشد ( استفاده از آن در ارتباط با عباراتي به غير از SELECT و تاثير بر روي triggers ) .
براي عبارات ساده SELECT دليل خاصي براي استفاده از ROWCOUNT وجود ندارد ولي اگر قصد فراخواني يك Stored procedure را داريد كه يك SELECT را انجام مي دهد و عبارات ديگري را نيز پردازش مي نمايد ، در زمان استفاده از ROWCOUNT مي بايست اين اطمينان حاصل گردد كه مقدار نسبت داده شده به ROWCOUNT صرفا" در ارتباط با query مورد نطر بكارگرفته مي شود .
در اين رابطه يك حالت خاص وجود دارد كه ترجيح داده مي شود از ROWCOUNT در يك SELECT query در مقابل TOP استفاده گردد : زماني كه قصد داريد به پياده كننده صفحه وب اجازه دهيد كه تعداد نتايج برگردانده شده اجراي يك query را مشخص نمايند . مثلا" فرض كنيد داراي يك Stored procedure با نام getRecentArticles باشيم كه يك پارامتر عددي صحيح را با نام ResultCount @ از ورودي مي گيرد . در چنين مواردي Stored procedure مي بايست صرفا" به تعداد ResultCount @ ركورد جديد موجود در بانك را برگرداند( نه اين كه همواره ده ركورد را برگرداند ) . بدين ترتيب به پياده كندگان صفحات وب اجازه داده مي شود كه مشخص نمايند كه به چه تعداد ركورد جديد موجود در بانك مي توانند دستيابي داشته باشند . كد زير نحوه انجام اين كار را نشان مي دهد :
CREATE PROCEDURE getRecentArticles ( @ResultCount int ) AS نوشتن queryمورد نظر براي برگرداندن ResultCount@ ركورد |
موارد استفاده از TOP و ROWCOUNT
در صورتي كه از يك query پويا در stored procedure استفاده گردد ، مي توان از TOP نيز استفاده نمود . روش استفاده از TOP در كد زير صحيح نمي باشد و در مقابل ، مي بايست به صورت پويا يك query را ايجاد و در ادامه با استفاده از EXEC و يا sp_executesql آن را اجراء نمود.
CREATE PROCEDURE getRecentArticles ( @ResultCount int ) AS
SELECT TOP @ResultCount NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable ORDER BY PublicationDate DESC |
كد زير نحوه استفاده از ROWCOUNT در يك Stored Procedure و متناسب با پارامتر ورودي را نشان مي دهد :
CREATE PROCEDURE getRecentArticles ( @ResultCount int ) AS
SET ROWCOUNT @ResultCount
SELECT NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable ORDER BY PublicationDate DESC |
در صورتي كه قصد اعمال محدوديت در بازيابي ركوردهاي حاصل از اجراي دستورات INSERT ,UPDATE و يا DELETE را داشته باشيد ، مي بايست از ROWCOUNT استفاده گردد ، چراكه TOP صرفا" در ارتباط با عبارت SELECT بكار گرفته مي شود.
جمع بندي
در اين مقاله ، با طرح اين پرسش كه نحوه بازيابي n ركورد جديد در يك بانك اطلاعاتي با استفاده از يك query به چه صورت است ، دو كليد واژه TOP و ROWCOUNT معرفي گرديدند . پس از آشنائي با گرامر هر يك از كليد واژه هاي فوق ، آنان را با يكديگر مقايسه و در نهايت با جايگاه استفاده هر يك از آنان آشنا شديم .
منبع: http://www.4guysfromrolla.com