- PR -

VB.NETでのDBデータ保持処理について

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-22 12:09
引用:

uniqqueさんの書き込み (2006-11-22 11:09) より:

実際の抽出件数は10件です。
データ量というのはDBの総件数のことですか?
総件数は30件です。


了解です。

引用:

DBからデータを取り出す処理は、リレーションの深さの分だけFor分が深くなってます。


話を聞く限りでは、怪しいのはこのあたりかと思いますが、
実際のソース コードを提示して頂かないとピンポイントなアドバイスは難しかろうと思います。

# ところで、ボトルネックはどこなのかの調査が足らないように思えるのですが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-11-22 12:36
実際の取得ロジック次第だとは思いますが、
データの取得の際、SQLというかDBから値を拾うロジックが
何回実行されているのでしょう?

#今までの文面からしますと1件のデータを取得するのに
#3回(=リレーションの深さ)抽出が行われている感じに見えました

リレーションが深くなるほどに遅くなるということは
そのあたりが気になります。

DBからデータ抽出が全体を通して1度のみ実行、ということであればフィールドなどを操作するあたりに問題があるかもしれません。
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2006-11-22 20:45
ボトルネックになりそうな部分のコードを記載します。
public class Modeler
Public Function selectQuery(ByVal query As String, ByVal databasename As String)
Dim recordColl As New Collection
Dim columnColl As New Collection
Dim columnSize As Integer
Dim tableobj As New ArrayList
Dim hashtable As New Hashtable
Dim tablearray As New DataTable
Dim selectQueryAdapter As New OleDb.OleDbCommand
Dim oDataAdapter As New OleDb.OleDbDataAdapter
Dim recordarray As New ArrayList
Dim tablecount As New Integer

tablearray.Clear()
Dim con As New OleDb.OleDbConnection()
Try

con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "database.mdb"

selectQueryAdapter.Connection = con
con.Open()

selectQueryAdapter.CommandText = query

oDataAdapter.SelectCommand = selectQueryAdapter
oDataAdapter.Fill(tablearray)

Catch ex As Exception
MsgBox("DB接続時に問題が発生しました")
Finally
If Not con Is Nothing Then
con.Close()

End If

End Try
tablecount = tablearray.Rows.Count

hashtable.Clear()
hashtable.Add("kubunchi", 1)
hashtable.Add("member", 2)
hashtable.Add("childmember", 3)

Dim k As Integer
For k = 0 To tablecount - 1
Select Case hashtable.Item(databasename)
Case 1
tableobj.Add(New Kubunchi)
Case 2
tableobj.Add(New Member)
Case 3
tableobj.Add(New Childmember)
End Select
Next

If tablecount = 0 Then
MsgBox("データがありません")
Return 0
End If
columnSize = tablearray.Rows.Item(0).ItemArray.Length

Dim i As Integer
Dim j As Integer
For i = 1 To tablecount
recordColl.Add(tableobj.Item(i - 1), i)

'カラムデータ追加処理
For j = 0 To columnSize - 1
columnColl.Add(tablearray.Rows.Item(i - 1).Item(j), tablearray.Rows.Item(i - 1).Table.Columns.Item(j).ColumnName)
Next
recordColl.Item(i).setColumnDataInit(columnColl)
For j = 1 To columnColl.Count
columnColl.Remove(1)
Next
recordarray.Add(recordColl.Item(i))

Next

Return recordarray

End Function

End class

以下はデータ取得処理です。
Dim model As New Modeler
Dim memberArray as new ArrayList
memberArray = model.selectQuery("select * from member", "member")
member = CType(memberArray.Item(i - 1), Member)


chiledmemberArray = model.selectQuery("select * from childmember where fkeymember = " & member.getPkeymember, "childmember")
For j = 1 To childmemberArray.Count
coll.Add(memberkbn(tmp), "memberkbn" & i & "_" & j)
tmp += 1

childmember = CType(childmemberArray.Item(j - 1), Childmember)
coll.Item("memberkbn" & i & "_" & j).Text = childmember.getToMember().getToKubunchi().getKubunchiname()
Next
データ取得処理でリレーションの分だけFor文が深くなります。
ここが原因だと思うのですが、このシステム上、childmemberに紐づくmemberの区分値を表示しないといけないので、このような処理になってしまいます。


[ メッセージ編集済み 編集者: uniqque 編集日時 2006-11-22 20:47 ]
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-11-24 01:04
ソースを提示していただいたのですが、この中でuniqqueさんが怪しいと
思っている箇所はどのあたりになるのでしょう?
他の方も言われていますが、少し細かく区切って調査してみるといいとは思います。
今はデータ的に少量なので目に付きにくいのでしょうが、件数を10倍ぐらいに増やしてみるといいのではないでしょうか。

的がはずれているかも知れませんが、個人的には
コード:
coll.Item("memberkbn" & i & "_" & j).Text = childmember.getToMember).getToKubunchi().getKubunchiname() 


の箇所がちょっと気になります。雰囲気としてはメンバー情報で持っている区分値があり、
その名称を取得しているのでしょうけど、これは
コード:
childmenber.getKubunchiname()


と、切り替えることができそうな気がしますね。データとしては恐らく1:1な
リレーションになってる気配があります・・・。

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