■SI Object Browser 掲示板


ユーザの皆様、開発者、サポート担当者の交流のための掲示板です!

ユーザーの皆様同士で教え合ったりもできる交流の場にしたいと思っていますので、相互協力をよろしくお願いします。
なお、過去に同じようなQ&Aがあるケースも多いので、投稿前にキーワード検索してみてください。

discussion
※各投稿のカラーは対象となる製品に対応しています。【■…OB ■…OBER ■…全般 ■…その他】
※ライセンスに関するお問合せにつきましては、お問い合わせページよりご連絡いただきますようお願いいたします。
※誹謗中傷や公序良俗に反する書き込みはご遠慮ください。運営側の判断によりメッセージを削除する場合があります。
※環境依存や技術的調査が必要な問題については掲示板上ではお答えしかねます。ご了承ください。
インデックスとプライマリキー 2003/01/30 14:12 その他 4
まだまだ初心者の私が投稿するのは失礼とは思いましたがよろしくお願いします。

以下のテーブル定義の場合、
プライマリキーのインデックスと
インデックスとしてのインデックス定義とでは違いがあるのでしょうか。

例えば、“A_NO”には‘01,02,03,04,11,12,23,...’と数字が設定されます。
データすべてを抽出する場合に“WHERE”句に“ A_NO > '00' ”を条件つけをして
インデックス検索にしました。
いろいろな情報からこれで“A_NO”内の昇順に抽出されるもの考えていました。
実際に内容は物理的にはバラバラに登録をされています。
社内の端末からいろいろ検索をしても意図する内容で検索はされます。
が、ユーザの環境ではその都度バラバラに抽出されているようなのです。
今回の開発プロジェクト内にはDBに詳しい方がいまして問い合わせたら、
“保証はされない。”旨の返事でした。
文献やNETによる情報と食い違いました。
本当のところはどうなんでしょうか?

プライマリキーのインデックスだけはこの限りではないのでしょうか?
するとインデックスではないように受けとめてしまいます。

よろしかったらおしえてください。


/*===== テーブル定義 =====*/
CREATE TABLE GTBL_M04 (
A_NO  CHAR(2) NOT NULL /* A番号 */
,A_NAME VARCHAR2(20) NOT NULL /* A名称 */
,A_RYAKU VARCHAR2(10) NOT NULL /* A略称 */
,A_KBN CHAR(1) NOT NULL /* A区分 */
,A_KASHO CHAR(7) NOT NULL /* A箇所 */
)
PCTFREE 50 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE (
INITIAL 8.00K NEXT 8.00K MINEXTENTS 1 MAXEXTENTS UNLIMITED
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
) TABLESPACE USERS_S
/
/*= プライマリインデックス定義 =*/
ALTER TABLE GTBL_M04 ADD CONSTRAINT pk_GTBL_M04 PRIMARY KEY (
A_NO /* A番号 */
) USING INDEX
PCTFREE 5 INITRANS 2 MAXTRANS 255
STORAGE (
INITIAL 8.00K NEXT 8.00K MINEXTENTS 1 MAXEXTENTS UNLIMITED
PCTINCREASE 0 FREELISTS 1
) TABLESPACE INDX
/
SEGA です。
インデックスはあくまでも検索やテーブル連携用です。
検索結果のデータの並び順とは無関係ですし、
物理的なデータの並び順とも無関係です。

データを特定項目の順序に取り出したければ、
“ORDER BY”句を使って下さい。
SEGAさん御教授ありがとうございます。
これに甘えてもう少しお願いします。

ORDER BY が書かれていましたが、
ユーザ先のマシンでは3万件のデータをプライマリキーで行った場合に
メモリー不足でアプリケーションがABENDしたため、
いろいろ調べ“インデックスは、デフォルトは昇順でキー値順に読み込み可能”の言葉を信じて
前メッセージの処置をとりました。(処置は別のデータベースに対して)
データの絞込み条件は無し、
毎日100件~1000件のデータ更新(削除、更新、追加)がオンライン、バッチと行われ
物理的には当然順不同です。
DISTINCTも同様で、管理メーカーからは使用禁止句になっている状況です。
でもユーザからはレスポンスは早くの要求が・・・。
(DISTINCTもメモリー不足でした。)
内部ソートや、ADO.NETのフィルタなども結局便利ではあるがオンラインアプリケーションには向かない便利機能でした。(とにかく時間がかかりすぎ)

ユーザに今の現状をすべて説明して、所要時間的に一番の内部ソートを許してもらっている状況というかそれしかないのです。
データベースの環境は管理メーカーが担当で私どもでには一切情報は教えてもらえません。

以上が私どものプロジェクトの状況でした。
これが得策なのでしょうか??
疑問です。
[まだまだ初心者]
>ORDER BY が書かれていましたが、
>ユーザ先のマシンでは3万件のデータをプライマリキーで行った場合に
>メモリー不足でアプリケーションがABENDしたため、
>いろいろ調べ“インデックスは、デフォルトは昇順でキー値順に読み込み可能”の言葉を
>信じて前メッセージの処置をとりました。(処置は別のデータベースに対して)

確かにINDEXは昇順にならんでいるように見えますが、絞込み条件がない
のであれば、通常、全表検索されるでしょうから、表データの物理順になっ
てしまいます。やはり、確実なのは、ORDER BYです。
なお、INDEXを使っているか全表なのかは、OBを使って実行計画を表示す
ると一目瞭然です。

>データの絞込み条件は無し、

結局のところ、データの絞込みなしでソートした結果が欲しいというのは
どのような処理なのでしょうか。オンラインアプリケーションという事で
すが、3万件のデータを一覧表示するような感じでしょうか。

>DISTINCTも同様で、管理メーカーからは使用禁止句になっている状況です。

管理メーカーとしては、どんなにスキルが低い人間が使ってもレスポンス
の劣化が心配されない機能しか使わせたくない場合が多いようですね。
でも、それは本当にお客様の事を考えた「管理」とは言えませんね。
限られた資源で最大限の能力を維持するというのが本当の管理ですからね。

まずは、データ絞込みは本当に不要なのか、次にORDER BYの作業領域をDB
側で確保する事が本当に出来ないか、最後にクライアント側に持ってきて
からソートする方式の時間でお客様に納得いただけるか、などを検討して
みる必要があると思います。

#どちらかというとOB掲示板ではなく、データベース掲示板ネタですね。

>データベースの環境は管理メーカーが担当で私どもでには一切情報は教えてもらえません。

動的パフォーマンス表だとかSELECT文で検索しちゃえば設定情報などは、
すべて取得できます。もちろん、OBだと画面クリックしていくだけで表示
されます(ただし、上記表に対するSELECT権限が外されていると無理で
すが)。

DBは、Oracleなのかな?と思って書いてますが・・

>例えば、“A_NO”には‘01,02,03,04,11,12,23,...’と数字が設定されます。
>データすべてを抽出する場合に“WHERE”句に“ A_NO > '00' ”を条件つけをして
>インデックス検索にしました。

WHERE句に、プライマリキー項目を指定したからといって、インデックスを使った検索を
行うとは限りません。Oracleのオプティマイザが検索方法を判断します。
Oracleが、全表検索した方が早いと判断した場合は、インデックスがあっても無くても
全表検索します。

どうしても、インデックスを使って欲しい場合、オプティマイザヒントを使って、
インデックスの利用を強要することも可能です。(詳しくは、マニュアル参照)

何となくですが、今回のケースだと..
SELECT /*+ INDEX_ASC(GTBL_M04 pk_GTBL_M04) */
A_NO
FROM GTBL_M04
WHERE A_NO > '00';
で問い合わせれば、欲しい結果が取れそうな気がします。

!注意!今までより、検索時間自体は長くなる可能性がありますので、ご注意ください。