
業務アプリケーションで次のSQL文を実行すると非常に時間がかかっています。
"select count(*) from テーブル名 where カラムA='値B'"
このテーブルは200万件以上のレコードが存在していて、カラムAには索引が作成されています。DBのOPTIMIZERの処理を見ると(1)索引検索をした後で(2)対象レコードのROWIDを取得して(3)その後FETCH処理をしているのですが、(3)のFETCHの処理が非常に時間がかかっています。どうしたらこの検索を早くできるかヒントがあれば教えて下さい。私のしろうと考えでいくと、DBがどうして(3)のFETCHの処理をしているのかもわかりません。よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
count(*) の代りに count(カラムA) とでもすれば、
速くなるでしょう。
ありがとうございます。結果的に問題は解決しました。私の説明不足だったのですが、実はwhere句で条件指定しているカラムがもう一つありまして、別々のインデックスだったのを一つの複合インデックスにしたら劇的に早くなりました。
No.2
- 回答日時:
あーーごめんなさい。
索引ついてるんですね。失礼しました。ちなみに200万件に対して「値」は何種類ぐらいでしょうか?
OracleならBITMAPインデックスを検討するのが良いかも?
全件に対して0.01%以下の件数ならメリットがあるはず。
なお、索引がついていても、頻繁にレコードの追加・削除が行われるのなら
いっぺん再編成してみるのも良いでしょう。
(EXPORT&IMPORT、DROP&CreateIndex)
アドバイスありがとうございます。索引の「値」の種類は600種類程です。UDBなのでビットマップ索引はオプティマイザーが必要だと判断した時に処理の中で一時的に作成されて明示的には作成できません。
ちなみにoracleで言うところの索引構成表を作成したりもしましたが、時間がかかっている部分は索引検索の部分ではなくてFETCHの部分なので、特にパフォーマンス上のメリットも得られませんでした。
補足いたしますと当テーブル上ではテスト環境にあり、テーブルの再作成と統計表のREFRESHはテストのつど実施するようにしております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カラムの存在チェック
-
INSERT時に発番を行いたい
-
ORA-00959: 表領域'****'は...
-
データを削除しても表領域の使...
-
Data Pump で大量データインポ...
-
アクセスマクロで、csv データ...
-
お知恵をお貸しください。
-
datapumpの実行方法について
-
C#でaccdbファイルのテーブルの...
-
CLOB型へのINSERT
-
viewのバックアップ
-
テーブルからのselectにおいて...
-
列が255以上のCSVファイルをAcc...
-
object browser で処理を中断す...
-
同じSELECT文同士でのデ...
-
アクセスのテーブルのリンクに...
-
INDEXの無効化
-
エクセルからアクセスにインポ...
-
Viewにインデックスは張れ...
-
異なるスキーマからデータを抽...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カラムの存在チェック
-
INSERT時に発番を行いたい
-
GROUP BY で列名は指定できない...
-
カラム情報とはなんですか?
-
SQL serverで、 テーブル:T カ...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
お知恵をお貸しください。
-
Data Pump で大量データインポ...
-
CLOB型へのINSERT
-
DELETE文でFROM句を省略した場合
-
Viewにインデックスは張れ...
-
postgreSQLのint型は桁数指定が...
-
datapumpの実行方法について
-
SQL*Loaderで、データを加工し...
-
ACCESS 複数テーブル・複数フィ...
-
object browser で処理を中断す...
-
Access レコードを追加できませ...
-
viewのバックアップ
-
異なるスキーマからデータを抽...
おすすめ情報