PDA

View Full Version : ROW_NUMBER



ahmad156
دوشنبه 21 آذر 1390, 09:31 صبح
سلام دوستان
من یه DataBase (در واقع یه Table) دارم که حدود 500000 تا رکورد داره و هر سطر هم حدود 10 تا فیلد.
من توی یه برنامه Windows Application گرید ویویی دارم که اطلاعات رو از این Table جستجو میکنه و نشون میده.
توی هر صفحه گرید ویو من 20 تا از رکوردها رو نشون میدم.چون حجم داده ها خیلی زیاد هست من برای هر صفحه از گریدویو 20 تا 20 رکورد از داده ها رو میگیرم.برای این کار من از ROW_NUMBER استفاده میکنم.
توی ROW_NUMBER مشکلی که هست ابتدا بر اساس یه فیلد مرتب میکنه بعد عملیات رو انجام میده.
آیا روشی توی SQL SERVER هست که سریعتر از این روش یا بهینه شده این روش رو انجام بده مثل MYSQL که LIMIT داره؟
ممنون

DlphIran
دوشنبه 21 آذر 1390, 10:05 صبح
سریعتر رو نمی دونم اما بهترین روش، paging هست. عنوان paging رو جستجو کنید.

tazarvmmr
دوشنبه 21 آذر 1390, 18:39 عصر
سریعتر رو نمی دونم اما بهترین روش، paging هست. عنوان paging رو جستجو کنید.

برای استفاده از Paging باید از تابع Row_Number استفاده بشه دیگه! فرض بر این هست که دوستمون داره از SQL2005 به بالا استفاده میکنه، چون قبل از این ورژن همچین فانکشنی نداشتیم



توی هر صفحه گرید ویو من 20 تا از رکوردها رو نشون میدم.چون حجم داده ها خیلی زیاد هست من برای هر صفحه از گریدویو 20 تا 20 رکورد از داده ها رو میگیرم.برای این کار من از ROW_NUMBER استفاده میکنم.
توی ROW_NUMBER مشکلی که هست ابتدا بر اساس یه فیلد مرتب میکنه بعد عملیات رو انجام میده.


لطفا کوئری که باهاش گریدتونو پر میکنین بزارین ببینیم چکار کردید! شاید هر بار دارید همه رکوردها رو فراخوانی میکنید ولی فقط 20 تا از اونها رو نمایش میدید!

ahmad156
دوشنبه 21 آذر 1390, 19:49 عصر
WITH myTable AS (SELECT Fields,ROW_NUMBER() OVER (ORDER BY phoneid) AS rownumber FROM TableName WHERE Conditions) SELECT* FROM myTable WHERE rownumber>=FirstValue AND rownumber<=LastValue

من میخوام که اون مرتب سازی رو هم انجام نده,سرعت خیلی برام مهمه

tazarvmmr
دوشنبه 21 آذر 1390, 20:17 عصر
الان برای اینکه 20 تا ردیف رو نشون بده چقدر وقت میبره؟

من جدولی ندارم که 500 هزار تا رکورد داشته باشه، ولی یکی دارم که حدود 100 هزار تا رکورد داره با این کد بین 1 تا 2 میلی ثانیه 20 رکورد رو نشون میده:


Select *, RowNum
From
( SELECT *,
Row_Number() Over (Order by PhoneId) as RowNum
FROM MyTable
) as MyTableInfo
Where (RowNum between 100 and 120)

ahmad156
سه شنبه 22 آذر 1390, 09:12 صبح
دوست عزیز بحث کمیت سرعت نیست.من میخوام که بدون مرتب سازی((Row_Number() Over (Order by PhoneId)) داده های مورد نظرم رو بده.چون داده ها زیاده مرتب سازی اثر قابل توجهی رو سرعت میذاره
ممنون

tazarvmmr
سه شنبه 22 آذر 1390, 12:58 عصر
دوست عزیز بحث کمیت سرعت نیست.من میخوام که بدون مرتب سازی((Row_Number() Over (Order by PhoneId)) داده های مورد نظرم رو بده.چون داده ها زیاده مرتب سازی اثر قابل توجهی رو سرعت میذاره
ممنون

شما اصلا این راهو امتحان کردی؟

ahmad156
سه شنبه 22 آذر 1390, 19:21 عصر
آره الان دارم ازش استفاده میکنم

tazarvmmr
سه شنبه 22 آذر 1390, 19:24 عصر
آره الان دارم ازش استفاده میکنم

تغییری در سرعت بوجود اومد یا خیر؟

در مورد استفاده از Row_Number شما راهی ندارید که اون مرتب سازی انجام نشه

ahmad156
چهارشنبه 23 آذر 1390, 09:48 صبح
تنها راه ممکن استفاده از Row-Number هست فعلا.
اگه راه دیگه ای هست نمیدونم!:متفکر:

ahmad156
شنبه 26 آذر 1390, 17:18 عصر
اساتید عزیز نظری ندارن؟:متفکر: