- - PR -
DBから取得した値をVBの配列に格納する方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-13 15:07
速度重視ならDataTableより
dr.GetString(0)やdr.GetInt32(0)の方が速いと思いますよ | ||||||||
|
投稿日時: 2007-12-13 15:43
最初のdr.Readと二回目以降を分けて計測してください。 If dr.Read() Then colAry.Add(dr("col")) End If Do While dr.Read() colAry.Add(dr("col")) Loop | ||||||||
|
投稿日時: 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 | ||||||||
|
投稿日時: 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 をチューニングするほうが遙かに効率的です。 | ||||||||
|
投稿日時: 2007-12-16 00:21
SqlCommandは使ったことはないのですが、OledbCommandやOracleCommandでは DBが処理をしている間はDbCommand.ExecuteReader()がDbDataReaderを返さなかったように思います。 (月曜に確認しますが違ってたらすいません) 計測時間にExecuteReader()の時間は含んでませんか? ところで「col」の型って何でしょうか? [ メッセージ編集済み 編集者: hei 編集日時 2007-12-16 00:27 ] |