PDA

View Full Version : Custom Paging بدون استفاده از جدول موقتی



hackerboy
پنج شنبه 09 فروردین 1386, 10:54 صبح
[حقوق این مقاله تماماً به صورت کامل متعلق به خودتونه]

همان طوری که همه میدونین، Paging خود ASP.NET تمام داده‌ها رو لود می‌کنه و بازدهی کمی برای داده‌های زیاد داره. بنابراین بسیاری از برنامه نویسای حرفه‌ای ASP.NET (از جمله شما) از Custom Paging مبتنی بر یک جدول موقتی استفاده می‌کنند، ولی روش بهتری وجود دارد که بدون استفاده از جدول موقتی، سرعت بیشتر و بازدهی بالاتری داشته باشد.

راز این روش استفاده از SET ROWCOUNT (http://msdn2.microsoft.com/en-us/library/ms188774.aspx) است. این دستور باعث می‌شود بعد از اینکه تعداد مشخصی سطر پردازش شد، اجرای دستور رو متوقف می‌کنه.

تمام این کارها با یک StoredProcedure انجام می‌شه. توجه کنین:


CREATE PROCEDURE dbo.usp_‍CustomPaging
(
@startRowIndex int,
@maximumRows int
)
AS

DECLARE @first_id int, @startRow int

SET ROWCOUNT @startRowIndex
SELECT @first_id = postId FROM posts ORDER BY postId

SET ROWCOUNT @maximumRows

SELECT * FROM posts
WHERE postId >= @first_id
ORDER BY postId

SET ROWCOUNT 0

GO


کار این StoredProcedure بسیار ساده‌است. ابتدا id اولین سطر که باید خونده بشه رو پیدا می‌کنه، سپس به اندازه‌ی سایز صفحه (تعداد رکوردهای یک صفحه که با SET ROWCOUNT @maximumRows مشخص می‌شه) رکوردها رو می‌خونه.

فقط دقت کنید که این SP دوتا پارامتر ورودی داره، یکی startRowIndex و دیگری maximumRows که می‌تونید با یکم دستکاری کاری بکنید که این SP شماره‌ی صفحه رو دریافت کنه و خودش startRowIndex رو دربیاره.

پس همین الآن tempTable رو بریزید دور و از این استفاده کنید!

منبع: http://www.4guysfromrolla.com/webtech/042606-1.shtml

hesam_hma
پنج شنبه 20 دی 1386, 00:11 صبح
دوستان عزیز سلام
ممکنه یه مثال از استفاده این SP بزنید ، مثلا با GridView
ممنون

miladr
پنج شنبه 20 دی 1386, 00:51 صبح
قبلا ارائه شده بودااا
http://barnamenevis.org/forum/showpost.php?p=408186&postcount=12

hesam_hma
جمعه 21 دی 1386, 01:31 صبح
دوست عزیز سلام
من فهمیدم این SP چیه ، فقط می خوام ببینم چطوری تو برنامم ازش استفاده کنم ، من تا به حال از SP تو برنامه استفاده نکردم ، اگه براتون مقدوره یه برنامه که یه گرید ویو رو با این روش صفحه بندی میکنه در اینجا قرار بدید یا این که توضیح بدید که چطوری می تونم این کار رو انجام بدم، متشکرم

hesam_hma
شنبه 22 دی 1386, 17:00 عصر
خودم پیدا کردم

Dim ds AsNew DataSet
Dim da AsNew SqlDataAdapter
ds.Clear()
DataGridView1.DataBindings.Clear()
Dim Cmd AsNew SqlCommand("SpAccount_paging", con)
Cmd.CommandType = CommandType.StoredProcedure
Dim Param As SqlParameter
Param = Cmd.Parameters.Add("@startRowIndex", SqlDbType.Int)
Param.Value = startrow
Param = Cmd.Parameters.Add("@maximumRows", SqlDbType.Int)
Param.Value = endrow
Cmd.ExecuteNonQuery()
da.SelectCommand = Cmd
da.Fill(ds)
DataGridView1.DataSource = ds
DataGridView1.DataMember = ds.Tables(0).ToString

e-shahshahani
یک شنبه 23 دی 1386, 13:15 عصر
اگه بخواهیم ORDER BY بر حسب یک فیلد دیگه باشه اونوقت این روش جواب نمیده.

vcldeveloper
یک شنبه 23 دی 1386, 18:14 عصر
وقتی میشه با SELECT TOP این مسئله رو حل کرد، لزومی به استفاده از ROWCOUNT نیست. خود SQL Server هم در Book Online توصیه میکنه در صورتی که میشه کاری را با SELECT TOP انجام داد، بجاش از ROWCOUNT استفاده نکنید، بخصوص که Query Optimizer اصلا متوجه وجود ROWCOUNT نمیشه که بخواد دستور نوشته شده را به تناسب مقدار وارد شده برای ROWCOUNT بهینه کند.

miladr
یک شنبه 23 دی 1386, 19:19 عصر
اگه بخواهیم ORDER BY بر حسب یک فیلد دیگه باشه اونوقت این روش جواب نمیده.

تو select دوم شما میتونی بر اساس هر فیلد که میخواین sort کنین


وقتی میشه با SELECT TOP این مسئله رو حل کرد، لزومی به استفاده از ROWCOUNT نیست. خود SQL Server هم در Book Online توصیه میکنه در صورتی که میشه کاری را با SELECT TOP انجام داد، بجاش از ROWCOUNT استفاده نکنید، بخصوص که Query Optimizer اصلا متوجه وجود ROWCOUNT نمیشه که بخواد دستور نوشته شده را به تناسب مقدار وارد شده برای ROWCOUNT بهینه کند.

اگه ما مثلا تو 10000 تا رکورد بخوایم صفحه یکی مونده به آخر رو نشون بدیم اون وقت select top کار رو سنگین نمیکنه

vcldeveloper
یک شنبه 23 دی 1386, 22:31 عصر
اگه ما مثلا تو 10000 تا رکورد بخوایم صفحه یکی مونده به آخر رو نشون بدیم اون وقت select top کار رو سنگین نمیکنه
این سوال بود یا جمله خبری؟

اگر سوال بود که من نمی دونم SELECT TOP نسبت به ROWCOUNT چه سنگینی می تونه بوجود بیاره، مثلا کد زیرچه مشکلی در مقایسه با ROWCOUNT داره؟
SELECT TOP 100 FROM MyTable WHERE ID > @LastRecID
@LastRecID = آخرین رکورد صفحه قبل.

miladr
دوشنبه 24 دی 1386, 00:27 صبح
این سوال بود یا جمله خبری؟

اگر سوال بود که من نمی دونم SELECT TOP نسبت به ROWCOUNT چه سنگینی می تونه بوجود بیاره، مثلا کد زیرچه مشکلی در مقایسه با ROWCOUNT داره؟
SELECT TOP 100 FROM MyTable WHERE ID > @LastRecID
@LastRecID = آخرین رکورد صفحه قبل.


والا من خیلی از پردازش های درونی sql سر در نمیارم که بگم پروسس این دو تا چه فرقی می کنه اما تو یه مقاله یادمه که خوندم همه روش های paging رو مقایسه کرده بود اونجا گفته بود که سریعترین روش همین sp و select top در رده های بعدی بود

Chabok
دوشنبه 24 دی 1386, 16:12 عصر
با سلام
در SQL 2005 یک تابع به نام Row_Number() نیز وجود دارد که روی سطرها شماره گذاری می کند . در ضمن میتوانید Orderby نیز برای شماره گذاری در نظر بگیرید و سپس نتایج رو Select کنید .
برای مثال بعد از شماره گذاری میتوانید به این صورت سلکت کنید .

Select * From @MyT Where RowNum Between 1 and 10اطلاعات بیشتر ... (http://technet.microsoft.com/en-us/library/ms186734.aspx)

miladr
دوشنبه 24 دی 1386, 16:35 عصر
این دستور تو sql 2005 و خیلی عالیه اما متاسفانه هاست های ایرانی برای sql 2005 خیلی خصاصت به خرج میدن بعضی جاها اندازه پول هاست برای sql 2005 میگیرن