JRA公式競馬データ配信サービス JRA-VAN Data Lab.

JRA-VAN DataLab.

競馬ソフト開発コーナー

JV-Dataの使い方あれこれ

一括表示 リストに戻る
タイトル馬毎SEデーターの検索速度
記事No2317
投稿日: 2010/02/15(Mon) 20:41
投稿者はすめますて(^_^)
場違いな質問かもしれませんが、皆様よろしくお願いいたします。
環境は、アクセスmdbもしくは、sql server 2005のデーターべス C#2005 OS 
vista で馬毎SEデーターの表示をテストしましたが、表示速度が遅くタイムアウ
トが出てしまします。(馬吉ぐらいの速度にしたいです。)
とりあえず2年分で、おおざっぱに、10万件ファイルサイズ100M位なら問題なく
動きますが、10年分80万件ファイルサイズ800Mだと、とても遅く使えません。や
りたいことは、蓄積系で競走馬の過去成績を表示することです。SQLの構文は、S
ELECT * FROM UMA_RACE WHERE KettoNum='血統番号'です。C#では、
DataSet ds=new DataSet("UMA_RACE");
Da=new SqlDataAdapter(sqlstr,cn);
Da.Fill(ds,"UMA_RACE");
put_dgv(ds);
として、datagridviewに表示しています。
馬吉のサンプルを見ても、上記の様なsql構文が、無かったような?気がします
。どうか皆様ご教授ねがいます。

タイトルRe: 馬毎SEデーターの検索速度
記事No2318
投稿日: 2010/02/20(Sat) 01:02
投稿者通行人A
Indexを付けて使ってますか?
Indexを付けて検索すれば80万件程度なら大抵のDBなら1秒以下で抽出するはず
ですが…。

タイトルRe^2: 馬毎SEデーターの検索速度
記事No2319
投稿日: 2010/02/20(Sat) 23:01
投稿者はすめますて(^_^)
> Indexを付けて使ってますか?
> Indexを付けて検索すれば80万件程度なら大抵のDBなら1秒以下で抽出する
はず
> ですが…。
vs2005のテーブル表示で、鍵のマークがあれば、Indexになってるんでは、ない
のですか?ユニークキーらしいのですが、よく解りません。検索は、一年単位で
の検索なら、1秒は、でます。
とりあえず10年分の検索だと、初回は、20秒ぐらいで、つぎは、何とか、3秒ぐ
らいでますが、たまにタイムアウト出ます。安定して3秒位で、表示したいです
。Indexが効いていないのか?抽出が多すぎるのか?素人なんで、皆様アドバイ
スよろしくおねがいいたします。

タイトルRe^3: 馬毎SEデーターの検索速度
記事No2320
投稿日: 2010/02/21(Sun) 15:17
投稿者通行人A
通行人Aです。
MDBは多少触っていますが、SQL Server2005もVS2005(C#)も使ったこ
とありません(持っていません)ので画面の説明をされても私にはなん
とも回答のしようがありません。m(_~_)m

また、「はすめますて(^_^) 」さんのデータベース構造(テーブル
構造など)がどのようなものかもわかりませんので一般的なことしか
言えません。言の端からINDEXの何たるかをまだ理解されていない
ようなので簡単に説明を

検索速度を速くするには、検索目的に応じてデータをソートしておく
のがベストですが、通常、データは希望どおりには並んでいません。
INDEXは検索目的に応じてソートされたデータを別に確保しておく
ためのものです。
INDEXはDB側が勝手に作ってくれるものではなく、自分でどんな検索
をするか、その検索のためにはデータがどのようにソートされいるの
が良いかを考えて、自分でテーブルへ設定するものです。

ユニークキーはテーブル内の特定のフィールドに関して、あるいは
複数フィールドの組合せに関してデータの重複を避けるため
(ユニークであることを確保するため)DBに自動的にチェックさせる
ためのものです。
悪い言い方をすれば、DBに自動でチェックさせてDBエンジニアがサボる
ためのものです。
ユニークキーの目的はINDEXとは異なりますが。重複のチェック作業を
素早く行うために、キーとして設定されたフィールドについてソート
したデータを持っています。
したがって、検索時にユニークキーがINDEXとして使われることもあり
ますが、検索目的によっては速度の向上に寄与しないこともあります。
(間違って使うと足を引っ張ることもありえます)
> 検索は、一年単位での検索なら、1秒は、でます。
(改行位置を変えました) といわれているので、
仮にユニークキーが
 開催年月日(あるいは開催年+月日+その他)
を元に設定されていれば納得できる話です。

今回の場合
KettoNumフィールドを対象に検索するわけですから、KettoNumに
ついてのINDEXを作成すればKettoNum順にソートしたデータをDBが
別に確保します。
以下、非常にラフな説明になりますが
データがソートされていれば80万件のデータから1件を抽出するには
20回程度のデータアクセスで済みます。(2の20乗≒100万ですから)
したがって、目的のKettoNumの先頭を検索してその馬の出走データ
(せいぜい数十件、しかも連続していることがわかっている)
を抽出するには100回前後のデータアクセスで終わると推定できます。
これに対し、INDEXがない時は結局、全件を舐めまわすと考えれば
その違いは明らかでしょう。

INDEXを作ってもDBがそれを自動的に利用するかどうかはDBごとに異な
るようですし、特定のINDEXを強制的に使う場合の、SQL文の書き方が
全てのDBで同じとも限りませんのでこれらは自身で使用されているDB
について調べてみてください。
まずはINDEXを作成して、検索を実行してみることですね。
SQL文は単純なのでDBのオプティマイザ(最適化機能)が働いて自動的
に組み込んで使うと思いますが、確証はありません。
私自身も自分で使っているDB以外は知りませんし、詳しく知っている
わけでもありませんのでこの辺で…。

以上、参考になさってください。

「はすめますて(^_^) 」さんは、DB初心者ながらも自身でDBを構築し
80万件のデータ取り込みまでなさったようですからDBまわりの知識を
ゆっくりと習得されるとよいですね。

タイトルRe^4: 馬毎SEデーターの検索速度
記事No2321
投稿日: 2010/02/22(Mon) 01:04
投稿者はすめますて(^_^)
通行人Aさん、その他の皆さん質問よろしくお願いします。
テーブル構造は、提供されているサンプルと、同じにしたつもりです。
現在わからない事は、(年+血統No)馬齢繰り返しで、馬毎レース情報(SE)から過
去の表示を行うと初回クエリが遅く
タイムアウトが出てしまうんです。タイムアウト出さない為には、ユニークキ
ー(年,月日,場,血統No)をSQLのINで
検索する様に、文字列作成すればよいとおもったのですが、血統Noから文字列
作成では同じかと思いました。
初回のクエリが遅くならない方法か、その他のよか方法ありましたら、ご教授
おねがいします。

タイトルRe^5: 馬毎SEデーターの検索速度
記事No2322
投稿日: 2010/02/22(Mon) 22:50
投稿者通行人A
通行人Aです
> テーブル構造は、提供されているサンプルと、同じにしたつもりです。
とありますが、サンプル(MDB)のUMA_RACEと同じだとしたら
設定されているユニークキーをINDEXとして使用した場合、
まさに足を引っ張るそのものです。

KettoNumでINDEXを作成して実行したらとアドバイスしましたが
どうもそのそぶりもないようなので私はこれで失礼…

タイトルRe^6: 馬毎SEデーターの検索速度
記事No2323
投稿日: 2010/02/23(Tue) 03:51
投稿者はすめますて(^_^)
KettoNumでINDEXを作成するには、どうしたらよいのでしょうか?
よろしくお願いいたします。

タイトルRe^7: 馬毎SEデーターの検索速度
記事No2324
投稿日: 2010/02/23(Tue) 13:48
投稿者はすめますて(^_^)
よく確認したら、PKしかありませんでした。
CREATE INDEX ******** 
で、PK+INDEXにしてから、試してみます。
通行人A 様。ご教授ありがとうございました。

タイトルRe^8: 馬毎SEデーターの検索速度
記事No2325
投稿日: 2010/02/27(Sat) 15:05
投稿者はすめますて(^_^)
o(^-^)o超速くなりました。
通行人A様ご教授大変ありがとうございました。
また何かありましたら、よろしくお願いいたします。
m(__)m

ウィンドウを閉じる