- PR -

[ASP.NET]GridViewの独自ページング処理でページ表示が遅い(遅すぎる)

1
投稿者投稿内容
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-17 17:34
いつも、お世話になっています。「ita」と申します。

前回の続きなのですが、DBのテーブル情報をWebページに表示する際のページング処理をGridViewのものを使わずに独自に実装して行っています

www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47195&forum=7&12
(GridViewのページングは、毎回全行を取得し該当ページのものだけを表示するようになっており巨大テーブルだと非効率だ。とある書籍に書いていましたので)

ドロップダウンリストにページ番号を仕込み、ページを切り替えるイベントで該当ページのみを取得するSQL文を発行し、それをGridViewにBindしています。(20行/ページ)しかし、巨大テーブル(約160万行)をページングした時に、Bind自体
は数秒ぐらいで終わるのに、そこからページ表示までになにかの処理を行ったまま、ページングできないという現象になっています。

これは、AjaxのUpdatePanelの中にGridViewを入れた場合のみで、UpdatePanelの外なら数秒後ぐらいに正常にページングされたページが表示されます。

(ソース中の「※1」で時間がかかるのはデータ取得で仕方ないのは理解できますが、ここを終えてからページ表示が5分待ってもできず、そのままの状態になってしまいます。)

UpdatePanelでAjax化した時に、Bind後に何が起こっているでしょうか?
対処方法をご存じの方がいらっしゃればお願いします。

ページングするときのSQL文(2ページ目を取得する際のSQL(select))
SELECT TOP 20 * from BigTable where sn not in (SELECT TOP 20 sn from BigTable where ORDER BY sn desc) order by sn desc
最初の20行(1ページ目)を除いた次の20行だけを取得する

コード:

' ドロップダウンリストの変更(ページング)イベント
Protected Sub DDlistPage_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ddlistPage.SelectedIndexChanged
Dim LineOfPage% = 20 ' 1ページあたりの行数
Dim CurPage% = CInt("0" & ddlistPage.SelectedValue) ' ページ
Dim StartRows$ = CStr((CurPage% - 1) * LineOfPage%)
SelSql$ = "SELECT TOP " & CStr(LineOfPage%) & " * from BigTable where sn not in (SELECT TOP " & StartRows$ & " sn from BigTable where ORDER BY sn desc) order by sn desc"

SqlDataSource1.ConnectionString = cnString$
SqlDataSource1.SelectCommandType = SqlDataSourceCommandType.Text
SqlDataSource1.SelectCommand = SelSql$
GridView1.DataSource = SqlDataSource1
Try
GridView1.DataBind() ' ※1:ここは数秒(1〜2秒)で処理は完了します。
Catch ex As Exception
'Error処理
Exit Sub
End Try
End Sub



因みに、800行程度の小さいテーブルの場合は、同じソースでページングしてもすんなり表示しています。


開発環境
・ASP.NET 2.0
・Visual Basic 2008
・Windows 2000 Server IIS6.0 + Ajax1.0


よろしくお願いします。


[ メッセージ編集済み 編集者: ita 編集日時 2008-11-17 17:35 ]

[ メッセージ編集済み 編集者: ita 編集日時 2008-11-17 17:37 ]
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-11-18 12:57
引用:

ドロップダウンリストにページ番号を仕込み、



ドロップダウンリストで8万行ですか?
無謀だと思う。
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-18 13:58
todoさん
こんにちは。ドロップダウンリストには、ページ番号のみです。
1ページあたり20行ですから、8万行/20行=4000ページなので、
ドロップダウンリストには、1〜4000番までの数字だけを仕込んだということです。
(ドロップダウンリストは、ページをピンポインントで指定する為に使っています)

引用:

todoさんの書き込み (2008-11-18 12:57) より:
引用:

ドロップダウンリストにページ番号を仕込み、



ドロップダウンリストで8万行ですか?
無謀だと思う。

King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-11-18 14:26
引用:
(20行/ページ)しかし、巨大テーブル(約160万行)をページングした時に


と最初に書いてあるから8万ページなんじゃないですか?
ドロップダウンリストに4000でも私は無謀だと思いますが・・・。


[ メッセージ編集済み 編集者: King 編集日時 2008-11-18 14:27 ]
ita
常連さん
会議室デビュー日: 2006/10/10
投稿数: 25
お住まい・勤務地: 兵庫県
投稿日時: 2008-11-18 14:42
Kingさん

・・・そうでした。
160万行/20=80万でした。
(引用した部分しか見ておらず、失礼しました)

todoさん

すみません。

この部分がたしかに無謀ですね。Gridviewばかりに目がいき、ドロップダウンリストはノーマークでした。

この部分の改善を試してみます。ありがとうございます。


引用:

Kingさんの書き込み (2008-11-18 14:26) より:
引用:
(20行/ページ)しかし、巨大テーブル(約160万行)をページングした時に


と最初に書いてあるから8万ページなんじゃないですか?
ドロップダウンリストに4000でも私は無謀だと思いますが・・・。


[ メッセージ編集済み 編集者: King 編集日時 2008-11-18 14:27 ]

1

スキルアップ/キャリアアップ(JOB@IT)