PDA

View Full Version : حرفه ای: معادل TOP n در Sqlserver 2000



S_O_S1982
شنبه 08 اسفند 1388, 09:46 صبح
سلام دوستان

من برای یک query از دستور TOP n استفاده کردم که به دلیل اینکه Table scan انجام می شه ، زمان پاسخ طولانی میشه ، به دلیل اینکه با sqlserver 2000 هم کار می کنم نمی تونم از Row_number() هم استفاده کنم ، set rowcount هم فکر کنم از نظر هزینه ، تقریبا معادل TOP n باشه و به نظر من Top n بهتر از set rowcount هست ،

به نظر شما چه چیزی رو جایگزین Top n بکنم ؟؟

AminSobati
یک شنبه 09 اسفند 1388, 08:07 صبح
سلام دوست عزیزم،
صورت مسئله مبهمه، شما فرمودین با top سرعت Query کنده، حالا جایگزین کردنش چی منفعتی داره؟ لطفا بیشتر توضیح بدین

S_O_S1982
یک شنبه 09 اسفند 1388, 09:15 صبح
سلام دوست عزیزم،
صورت مسئله مبهمه، شما فرمودین با top سرعت Query کنده، حالا جایگزین کردنش چی منفعتی داره؟ لطفا بیشتر توضیح بدین

سلام

ببینید من می خوام صد تا رکورد اول یک query رو برگردونم ، از top که استفاده می کنم ، خیلی طول می کشه ، چون با نسخه ی 2000 Sqlserver هم کار می کنم ، دستم بستس نمی دونم به جای Top چی کار کنم که بدون table scan صد تا رکورد اول رو برام نشون بده


ممنون از توجه شما

محمد سلیم آبادی
یک شنبه 09 اسفند 1388, 10:31 صبح
سلام،
این یک پیشنهاد، این ترفند (http://www.30sharp.com/ShowArticle.aspx?nid=13&did=195&AuthorID=11)رو بخوانید و در هنگام استفاده به جای ماده ی TOP از ماده ی WHERE به این شکل استفاده کنید:

SELECT * FROM table_name
WHERE ID <=100

S_O_S1982
یک شنبه 09 اسفند 1388, 18:52 عصر
سلام،
این یک پیشنهاد، این ترفند (http://www.30sharp.com/ShowArticle.aspx?nid=13&did=195&AuthorID=11)رو بخوانید و در هنگام استفاده به جای ماده ی TOP از ماده ی WHERE به این شکل استفاده کنید:

SELECT * FROM table_name
WHERE ID <=100

سلام

ببینید این حرف من درست هست یا نه ،
من اول باید تمام جدول اصلیم رو ببرم تو جدول موقت که بهش یک Row_number هم اضافه کردم ، بعد از جدول موقت با یک دستور Select ، دقیقا شبیه چیزی که بالا ذکر کردین ، باید Row_number های کمتر از 100 رو انتخاب کنم
به نظر شما این costاش بیشتر از همون دستور Top نیست ؟؟
با این روشی که من توضیح دادم و برداشتم از راهنمایی شما بود ، هزینش خیلی بیشتر از top n هست این روش ...

نظر شما و دیگر دوستان چیه؟

محمد سلیم آبادی
یک شنبه 09 اسفند 1388, 19:10 عصر
اگر بطور مثال داخل یک View این ستون row_id ذخیره بشه. دیگه هر بار برای گرفتن TOP هزینه ی ساخت و درج اطلاعات در جدول موقت وجود نداره. فقط هزینه ی فیلتر کردن را داریم. یک index هم روی اون ستون قرار داده میشه تا سرعت بازیابی به حد اکثر برسه.
باید دید که ترتیب نمایش سطرهای جدولتان بر چه اساسیه آیا میشه از تکنیک های set-based ستون row_id را بدست آورد و قابل استفاده در یک view کرد یا نه.

ASKaffash
دوشنبه 10 اسفند 1388, 10:02 صبح
سلام
چرا فکر می کنید که Top 100 کند است ؟ در واقع شرط جلوی Where شما و ارتباط آن با ایندکس مناسب در جدول تعیین کننده است اگر ایندکس مناسب وجود داشته باشد پس از استخراج 100 رکورد از روی ایندکس عمل Fetch پایان می یابد لطفا دستور Select را قرار دهید

AminSobati
سه شنبه 11 اسفند 1388, 00:18 صبح
با پست شماره 7 موافقم، چون حدس میزنم کند بودن برمیگرده به شرطی که در where قرار گرفته و چون ایندکس مناسبی که به where کمک کنه وجود نداره، Table Scan رخ میده.