業務アプリケーションで次のSQL文を実行すると非常に時間がかかっています。
"select count(*) from テーブル名 where カラムA='値B'"
このテーブルは200万件以上のレコードが存在していて、カラムAには索引が作成されています。DBのOPTIMIZERの処理を見ると(1)索引検索をした後で(2)対象レコードのROWIDを取得して(3)その後FETCH処理をしているのですが、(3)のFETCHの処理が非常に時間がかかっています。どうしたらこの検索を早くできるかヒントがあれば教えて下さい。私のしろうと考えでいくと、DBがどうして(3)のFETCHの処理をしているのかもわかりません。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> テストのつど実施するようにしております。


「表領域の離散」は影響しませんか?

WindowsNTでは「NTFSのデフラグは不要だ!」といってたのに
2000にはしっかり機能が実装されてるぐらいなので。
    • good
    • 0
この回答へのお礼

ありがとうございます。結果的に問題は解決しました。私の説明不足だったのですが、実はwhere句で条件指定しているカラムがもう一つありまして、別々のインデックスだったのを一つの複合インデックスにしたら劇的に早くなりました。いろいろとありがとうございました。

お礼日時:2001/09/19 09:11

count(*) の代りに count(カラムA) とでもすれば、


速くなるでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。結果的に問題は解決しました。私の説明不足だったのですが、実はwhere句で条件指定しているカラムがもう一つありまして、別々のインデックスだったのを一つの複合インデックスにしたら劇的に早くなりました。

お礼日時:2001/09/19 09:09

あーーごめんなさい。

索引ついてるんですね。失礼しました。

ちなみに200万件に対して「値」は何種類ぐらいでしょうか?
OracleならBITMAPインデックスを検討するのが良いかも?
全件に対して0.01%以下の件数ならメリットがあるはず。

なお、索引がついていても、頻繁にレコードの追加・削除が行われるのなら
いっぺん再編成してみるのも良いでしょう。
(EXPORT&IMPORT、DROP&CreateIndex)
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。索引の「値」の種類は600種類程です。UDBなのでビットマップ索引はオプティマイザーが必要だと判断した時に処理の中で一時的に作成されて明示的には作成できません。
ちなみにoracleで言うところの索引構成表を作成したりもしましたが、時間がかかっている部分は索引検索の部分ではなくてFETCHの部分なので、特にパフォーマンス上のメリットも得られませんでした。
補足いたしますと当テーブル上ではテスト環境にあり、テーブルの再作成と統計表のREFRESHはテストのつど実施するようにしております。

お礼日時:2001/09/18 01:52

カラムAに索引をつけることが最も重要と思います。



where句つけずに全件の方が速いでしょ?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Q異なるDB間の異なるテーブルの特定レコード間のリンクは可能か?

Window98, Access2000を使用しています。
現在(1)住所録DBと(2)家計簿DBをAccessにて作成しています。家計簿DBは長年使っていますのでかなりの情報量です。(1)の住所録DBは先日から作り始めたばかりです。そこで質問させていただきたいのですが、(2)の家計簿DBにあるAccount名と住所録DBにある会社名とリンクをさせたいのですがどのようにしたらよいのでしょうか? 外部テーブルとしてリンクさせるテーブルを新たに新規Account名として追加して家計簿DBにつくることは出来ますが、完全な目的達成の問題点として、

1)家計簿DB内にあるAccount名の数は1000件を超えていますが、そのそれぞれのAccount名テーブルはかなり簡素なものなので、そのテーブル構造及びフィールド(住所、担当者(個人名)、交信情報(メモ))やそれぞれのリンク構造は住所録DBを使いたい。但し、1000件以上のAccount内容全てにその詳細情報は不要で、家計簿DBの特定のAccount名につき住所録DBの会社テーブルにある特定のレコードとリンクさせ、内容を充実させたい。即ち異なるDB間で特定のテーブル内にある特定のレコード間のリンクは可能か否か?

2)家計簿DB内のAccount名は会社名もあれば個人名もあります。一方住所録DBには、家計簿DBのAccount名テーブルの該当リンク先テーブルとして、会社名は (a)会社テーブル、個人の場合は (b)担当者(個人)テーブルのように2種類のテーブルが存在していますが、それぞれ該当レコードにリンクさせる事は可能か?

上記1)、2)に付き技術的可能性の可否について、或いは目的達成のためのアイデアが頂ければ喜びます。宜しくお願いします。

Window98, Access2000を使用しています。
現在(1)住所録DBと(2)家計簿DBをAccessにて作成しています。家計簿DBは長年使っていますのでかなりの情報量です。(1)の住所録DBは先日から作り始めたばかりです。そこで質問させていただきたいのですが、(2)の家計簿DBにあるAccount名と住所録DBにある会社名とリンクをさせたいのですがどのようにしたらよいのでしょうか? 外部テーブルとしてリンクさせるテーブルを新たに新規Account名として追加して家計簿DBにつくることは出来ますが、完全な目的達成の問...続きを読む

Aベストアンサー

1. リンクテーブル
住所録DB内に、家計簿DBのAccoutテーブルのリンクテーブルを作成するということです。Access のメニューの「ファイル(F)」→「外部データの取り込み(G)」→「テーブルのリンク(L)...」で作成します。リンクテーブルを作成すると、住所録DB内にあたかもAccount テーブルがあるかのように見えるのですが、データの実体は家計簿DBにあります。住所録DB内のリンクテーブルに対してデータの追加や変更、削除を行えば、家計簿DB 内の Account テーブルに対して追加、変更、削除が実行されます。

2.クエリー
>特定のレコードのリンクは内容を確認しながら一件一件指定する必要があります。
ということなので、二つテーブルを関連付けるフィールドがないようですね。関連付けさせるためのフィールド(結合フィールド)がなければ、二つのテーブルをリンク(リレーションともいいます。)させることはできません。逆に言うと、二つのテーブルをリンクさせるための作業が、結合フィールドを作成、および結合フィールドにデータをセットする行為になります。
もう少し具体的に書きますと、
Acount テーブルに、ID というフィールドと名称というフィールドがあり、次のようなデータが入っているとします。
ID   名称
---------------------
0001  山田さん
0002  佐藤さん
0003  鈴木さん

一方、住所録DBの担当者テーブルには番号というフィールドと氏名というフィールドがあったとし、次のようなデータが入っているとします。

番号  氏名
------------------------
1000  鈴木 一郎
1051  山田 太郎
1129  山口 努
1131  木村 庄之助
1132  山田 花子

Account テーブルの 0001 と 担当者テーブルの 1132
Account テーブルの 0003 と 担当者テーブルの 1000
をリンクさせたいとします。

方法1.番号を振りなおす
Account テーブルか、担当者テーブルのどちらかの番号を振りなおすわけですが、例えば担当者テーブルの番号を振りな直すなら、

番号  氏名
------------------------
0003  鈴木 一郎
1051  山田 太郎
1129  山口 努
1131  木村 庄之助
0001  山田 花子

のように、ID と 番号を一致させなければなりません。

方法2.フィールドを追加する
フィールドIDとフィールド番号の型(数値型とか文字型とか)が一致していれば、番号の振り直しでもよいのですが、型が一致していなければ、一致するフィールドを追加せざるを得ません。
↓こんな感じにします。

番号  ID  氏名
------------------------
1000  0003 鈴木 一郎
1051  0002 山田 太郎
1129  0004 山口 努
1131  0005 木村 庄之助
1132  0001 山田 花子

今日は疲れましたので、続きはまた今度にします。

1. リンクテーブル
住所録DB内に、家計簿DBのAccoutテーブルのリンクテーブルを作成するということです。Access のメニューの「ファイル(F)」→「外部データの取り込み(G)」→「テーブルのリンク(L)...」で作成します。リンクテーブルを作成すると、住所録DB内にあたかもAccount テーブルがあるかのように見えるのですが、データの実体は家計簿DBにあります。住所録DB内のリンクテーブルに対してデータの追加や変更、削除を行えば、家計簿DB 内の Account テーブルに対して追加、変更、削除が実行されます。

2...続きを読む

QDB2 「既存カラムへのnot null制約の付与・削除方法について」

DB2有識者の方々へ
マニュアルをみたのですが、alter tableでは駄目なのでしょうか?
すみません。よろしくお願い致します。

<質問1>
既存カラムへnot null制約を付与したいのですが、コマンドを教えてください

<質問2>
既存カラムについた、not null制約を削除したいのですが、コマンドを教えてください

よろしくお願い致します。

Aベストアンサー

ALTER TABLEでできることは以下の変更なので'not null'の付加・削除はできません。tableの再作成を行いデータのRELOADが必要になります。

・ 1 つまたは複数の列を表に追加する
・ 主キーの追加、あるいはドロップを行う
・ 1 つまたは複数のユニーク制約、または参照制約の追加、あるいはドロップを行う
・ 1 つまたは複数のチェック制約定義の追加、あるいはドロップを行う
・ 表除去制約の追加、あるいはドロップを行う
・ VARCHAR 列の長さを変更する
・ 参照タイプ列を変更して、有効範囲を追加する
・ 生成される列の生成式を変更する
・ 1 つまたは複数のチェック制約属性、あるいは参照制約属性を変更する
・ 区分化キーの追加、あるいはドロップを行う
・ 表属性(データ・キャプチャー・オプション、pctfree、ロック・サイズ、追加モード
など) を変更する
・ 表を記録されていない初期状態(NOT LOGGED INITIALLY) に設定する

Qあるカラムの値を複数持つレコード以外を抽出したい

下記のようなレコードを持つテーブル(仮にtest1)があります。
ID price type
001 2000 1
001 4000 1
002 8000 2
003 2000 1
003 8000 2
004 5000 3

ここから次の条件で抽出したいのですがSQLに明るくないためよくわかりません。
・typeが1と2の両方を持つもの、または、3を持つものを除く
・その上でpriceの合計値をIDごとに得たい

求める結果としては、
ID price
001 6000
002 8000
を得たいのですが。
distinctを使う必要があるというぐらいしか分かっていません。
よろしくお願いします。

Aベストアンサー

別解です。IIFをCASE式などに書き換えれば、Access以外でも同様に書けます。
SELECT ID,SUM(Price)
FROM test1
GROUP BY ID
HAVING NOT (SUM(IIF(Type=1,1,0))>0 AND SUM(IIF(Type=2,1,0))>0) AND SUM(IIF(Type=3,1,0))=0

Qテーブルのカラム(列)を追加したい

お世話になります、

DBはOracle8iです。

一度作成して、データが入っているテーブルAの
カラム(列)をデータをそのままにして追加できるの
でしょうか?
追加前のデータにデフォルト値を与えることはできるのでしょうか?

[変更前]
名前 年齢 性別
あ   1  男
い   2  女
う   3  男

↓カラム追加

[変更後]
名前 年齢 性別 フラグ
あ   1  男   0
い   2  女   0
う   3  男   0 

以上のような感じにしたいのですが、
Alter table文を使うところまではわかっているのですが。。。

よろしくお願いします。

Aベストアンサー

ALTER TABLE テーブル名 ADD(
フィールド名 NUMBER(10)
);

見たいな感じですね。

既存のレコードの値は、後からupdate文で入れることになります。

といっても
update テーブル名 set 追加フィールド名 = 値;

でおしまいですけど。

Qどのテーブルのどのカラム???助けて下さい

会社に入社したばかりなのですが、プログラミングをしています。
で質問なのですが
データベースのselect文で
ある名称を取ってこないといけないときに
どこのテーブルとどこのテーブルのどのカラムとどのカラムが
等しいときの名称を取ってくる様なselect文が作成できません

テーブル設計書のカラム名を見ただけではわかりません
こういった場合はどうすればいいのでしょうか

設計書とかにどのカラムが等しいときとか
どのテーブルのどの名称とか普通そういう資料があるのでしょうか
select文の構文は判ってもテーブルの仕様みたいなのがわからないので
対応できません

全然わかりません。助けてください

Aベストアンサー

こんにちは。

普通(?)はテーブル設計書にリレーション構成図みたいなものがあってテーブル同士の繋がりがわかる資料があります。

>テーブル設計書のカラム名を見ただけではわかりません
>こういった場合はどうすればいいのでしょうか
これはテーブルを設計した人に聞くしか無いです。

テーブルAに商品コード,テーブルBに商品名があるような場合はテーブルBにも商品コードのカラムがあるはずですのでそれを結合すれば良いと想像することは出来ますが。
あとはプライマリーキーになってる項目とか。資料が無い限りは予想でしかわかりません。

さすがにどのようなテーブル設計になってるかわかりかねますので、先輩に聞いてくださいとしか回答できません。


このカテゴリの人気Q&Aランキング

おすすめ情報