Windows XP Pro
Delphi 7 Pro
Oracle 10g
Microsoft OLE DB Provider for Oracle接続
ADOQuery使用
以上の環境でSelect文で処理すると非常に時間がかかります。
なにか他の方法でコーディングすると
時間短縮できるでしょうか?
テーブルの構造や数量,データ量,抽出条件,グループ,並び替え条件等々・・・
様々な状態を考えた上でテーブルにインデックス付けを行ってください。
検索速度を上げる為にはインデックスは重要です。
データ量が膨大になればなるほど処理速度が大きく変わります。
ただし間違ったインデックス付けをすると逆に遅くなったりします。
オラクルは触ったことがないのでインデックスの作成方法は知らないので,
別途調べてみてください。検索するだけで色々引っかかると思います。
Oracle CREATE INDEX
Ruさんお返事ありがとうございます。
後からで申し訳ありませんが、補足です。
SQL PlusでSELECT文処理すると瞬時に表示されて
Dephiからだと時間がかかるのですが
どうしてでしょうか?
申し訳ないですがOracleやSQL Plusはわかりません。
インデックスの有無で大体解決はすると思いますが,
データ量が多かったり,SQLが複雑だと遅くなります。
あとは,検索スピード自体は早いがデータ量が多くて
Delphi上での表示に時間がかかるというのはあったと思います。
TClientDataSetの場合はデータ量が多いと比例して時間がかかります(クライアントのPCスペックに依存?)
Oracle,TADOQueryももしかするとそうかもしれません。
一度SQLでレコード数を制限してテストしてみればいかがでしょうか?
※SQLのサンプル(レコードを200に制限)
Oracleで使用できなかったらごめんなさい
SELECT *
FROM TABLENAME
FETCH FIRST 200 ROWS ONLY
Ruさんお返事遅れまして申し訳ありません。
>インデックスの有無で大体解決はすると思いますが
どのようにインデックスつければよいのでしょうか?
oo4oで接続テストしてみようと思うのですが、
SQL文にパラメーターは使えるのでしょうか?
インデックスの付け方
CREATE INDEX インデックス名 ON テーブル名( 項目1,項目2 );
です。
どれくらいの差があるのか明確に書くべきではないですか?
何件のデータ取得するのにADOQueryだとどれくらい遅いとか。
SELECT文のみ、WHERE句をいれて、ORDER句をいれて。
比較できるのは色々あります。あまりにも漠然としていてわかりません。
自分で調べる事がまず大事だと思います。
Ruさんが「Oracle CREATE INDEX」で検索すればと書いていますよね。
それで調べればインデックスのつけ方はわかるはずです。
基本GTRさんが書いている通りでWHERE句やORDER句に記述している項目に対してつけます。
あとoo4oに関しても「Delphi oo4o」で調べれば色々でてきます。
その上でどうすればいいのかを質問するべきだと思います。
私もガオーさんと全く同じ環境で開発していますがQueryを使って特に
不便に感じたことはありません。
ADOQuery・oo4oそれぞれ一長一短ですので色々試してみてください。
>SQL PlusでSELECT文処理すると瞬時に表示されて
>Dephiからだと時間がかかるのですが
SQLの返すレコードが多すぎるのではないでしょうか。
試しに結果が10件程度となるSQLを投げてみたらどうでしょう。
ちなみに、レコードを非同期で取得したい場合は、
以下が参考になるのではないでしょうか。
>SQL PlusでSELECT文処理すると瞬時に表示されて
>Dephiからだと時間がかかるのですが
これは,SQL Plus(Oracle附属のSQLテスト用の?)で同じSQL文を
実行したということなんでしょうか.
もし,そうだとしたら分かりません.
一般的に言えることですが,Oracleではインデックスを設定しないと,
ほとんど実用的な速度は得られないと考えていいのではないかと思います.
>試しに結果が10件程度となるSQLを投げてみたらどうでしょう。
もテストする価値がありますね.
ツイート | ![]() |