- PR -

DBから取得した値をVBの配列に格納する方法

投稿者投稿内容
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2007-12-13 15:07
速度重視ならDataTableより
dr.GetString(0)やdr.GetInt32(0)の方が速いと思いますよ
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-12-13 15:43
引用:

引用:

DataAdapterよりDataReaderが吉
dr("col")よりdr(0)が吉
CommandBehavior.SequentialAccessが吉

実際に効果があるのかを時間を計測して確認しましょう。



こちらに関しましては、あまり処理速度は変わらないようでした。



最初のdr.Readと二回目以降を分けて計測してください。

If dr.Read() Then
colAry.Add(dr("col"))
End If

Do While dr.Read()
colAry.Add(dr("col"))
Loop
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2007-12-13 15:49
連続すいません
自分はやった事ないですがSQL CLRだと直接配列の受け渡しができるかもしれません

http://msdn2.microsoft.com/ja-jp/library/ms131075.aspx
http://msdn2.microsoft.com/ja-jp/library/ms175119.aspx
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-15 22:04
 ArrayList は、最初は16個の内容を入れることしかできません。16個を超えるようになると、その倍の入れ物が用意されます。

 いま、データの数が千個あるとすると、ArrayList の入れ物は、次のように確保されます。
16  最初
32  2回
64  3回
128  4回
256  5回
512  6回
1024 7回

 最初に一万個近くあることがわかっているなら、初期値として1万やそれ以上を設定しておけば、メモリ領域を確保して必要ならコピーするという処理が少なくなるため、高速になることが見込めます。
 ただし、1万用意して、実際の個数が1万1個の場合、1万1個目を入れるために2万個の領域を確保してしまいます。大きい値を設定するときは、要注意です。
 同じ Connection を利用するなら、実行計画のキャッシュが使えますから、COUNT 関数(って、SQL Server にもあるのか?)でデータ件数を数えてからデータを取得しても、メモリ確保のオーバーヘッドが減る分、そうした方が高速になるかもしれません。

 ところで、2007-12-13 14:08 の計測時間は、何回か計っての平均値でしょうか。対象のプログラム以外の要因で遅くなることもあるため、普通は3回以上計測して平均値を出します。また、キャッシュが聞いていることも考え、リブート直後に1回のみ計り、計測ごとにリブートします。


 todoさんが最初の Read を分けろと書かれているのは、SQL の解析にかかる要因を排除しろという意味です。7秒のうち5秒が SQL の実行にかかっている時間であるなら、プログラムをチューニングするより、SQL をチューニングするほうが遙かに効率的です。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2007-12-16 00:21
引用:

todoさんが最初の Read を分けろと書かれているのは、SQL の解析にかかる要因を排除しろという意味です。



SqlCommandは使ったことはないのですが、OledbCommandやOracleCommandでは
DBが処理をしている間はDbCommand.ExecuteReader()がDbDataReaderを返さなかったように思います。
(月曜に確認しますが違ってたらすいません)
計測時間にExecuteReader()の時間は含んでませんか?

ところで「col」の型って何でしょうか?

[ メッセージ編集済み 編集者: hei 編集日時 2007-12-16 00:27 ]

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