こんにちは。
Oracleのindex作成のポイントに付いて質問させて頂きます。

テーブルAに対して、インデックスAと言う名称のINDEXを作成するとします。

テーブルAの項目はP1,A1,A2,A3,A4と言う5ケの項目より成り立ちます。
(P1はテーブル作成時のプライマリーキーです。)

今、プログラム1・プログラム2・プログラム3からテーブルAのデータを利用していますが、速度が遅くそのためインデックスAを作成して改善するところです。

プログラム1では、A1,A2,A3をキーとしてデータを読み込んでいます。プログラム2ではA1とA4、プログラム3ではA1をキーとして読みこんでいます。
優先順位は、プログラム1が第1優先、プログラム2が第2優先、プログラム3が第3優先です。

システムに負荷を掛けたくないと言う理由からインデックスは1ケのみ作成するとします。
キー項目としては、どれを選定するべきでしょうか?

1)A1
2)A1,A2,A3
3)A1,A2,A3,A4

1)は汎用性があるように思えますが?
2)でプログラム1を優先させて、同時にプログラム2・3にもこのINDEXは適用されるのでしょうか?
それとも、全てを網羅した3)を使うべき?

ご経験者の方宜しくお願い致します。

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

A 回答 (5件)

>インデックスを張るとそれぞれ早くなるような感じがしてどうも感覚的にしっくり来てない状態ですが・・・。



 だから、実行計画を取得してください。SQL*PLUSで、SET AUTOTRACE ON。または、サンプルの件数が十分(最低でも千件)にあるなら、SET TIMING ONで、実行にかかった時間が表示されます。どちらもSQL*PLUSで使えます。


 インデックスの使用方法については、Oracle9iR2のマニュアルを見ているので、他のバージョンでは違う可能性があります。

この回答への補足

見えました。
実行計画で
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 INDEX (RANGE SCAN) OF 'インデックスA'

0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'テーブルA'
2 1 INDEX (RANGE SCAN) OF 'インデックスA'
の違いでした。

補足日時:2003/10/17 15:38
    • good
    • 0
この回答へのお礼

有難う御座います。
マニュアル見ながら試行錯誤中です。

お礼日時:2003/10/17 14:16

>1)でも早くなるような感じで、どうもしっくり来てない>ですが、色々とやっています・・・。



件数少ないんじゃないんですか?

A1の条件だけで、かなり絞り込まれてるとか。
    • good
    • 0
この回答へのお礼

有難う御座います。
試行錯誤中です。

お礼日時:2003/10/17 14:14

A1,A2,A3


A1,A4

の2つを張れば、3つの処理すべてまかなえます。
あとは、どの処理を優先させるかでしょう。


ちなみに、
A1,A2,A3,A4
は、どの処理でも使用されません。
    • good
    • 0
この回答へのお礼

早速のご回答有難う御座います。
select * from テーブルA WHERE A1=定数 AND A2=定数 AND ・・・・
と言ったSQL文でインデックス変えながらテストしてます。
1)でも早くなるような感じで、どうもしっくり来てないですが、色々とやっています・・・。

お礼日時:2003/10/16 20:39

とりあえず3つとも作ってみては?



1を作る→各プログラムから実行されるSQLを擬似的に実行し、実行計画をとる→1を削除する→2を作る→(以下略)

でも、3のインデックスでも、プログラム2はインデックスを使いません。A1, A2, A3, A4の順で列を指定してインデックスを作ると、"A1", "A1&A2", "A1&A2&A3", "A1&A2&A3&A4"の条件を指定したとき、インデックスを使用します。

ということは、2で作ると、プログラム1とプログラム3はインデックスを使ってくれるわけですね。

なお、NULLを検索しようとすると、インデックスは使えません。
    • good
    • 0
この回答へのお礼

早速の回答有難う御座います。
おっしゃる通り只今全てのパターンを試しています。
インデックスを張るとそれぞれ早くなるような感じがしてどうも感覚的にしっくり来てない状態ですが・・・。

お礼日時:2003/10/16 20:30

インデックスに限らず、データベース設計はソフトウェアの使用目的やデータの性格 ( レコード件数や各項目のカーディナリティなど ) によって左右されますので、提示されている抽象的な情報だけでは最適解は判断できません。

    • good
    • 0
この回答へのお礼

早速のご回答ありがとう御座います。

お礼日時:2003/10/16 20:19

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

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

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

このQ&Aを見た人が検索しているワード

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

Q事務仕事で疲れないコツはなんでしょう。

事務仕事で疲れないコツはなんでしょう。

Aベストアンサー

可能な環境であれば、自分のペースで仕事をする。

QMs Access テーブルBにテーブルAのCDを充てたい。(クエリ?紐づけ?リレーションシップ?)

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横須賀市
テーブル受付データB
①    ②
1    千葉県松戸市五香5-5-5    
2    千葉県鎌ケ谷市本町さくらがおか8-88-8 ひまわりアパート302
3    神奈川県横須賀市横須賀8-7-8   

テーブル受付データBにおいて、②の部分(市町名まで)と、
テーブルマスタAの③をなんとか紐づけて、

クエリで合体させたい。
=テーブル受付データBに、テーブルマスタAの市町村CDを充てたい。
A①市町村CD  A②市町村名 B② B③ B④ B⑤
とすることを切望しています。

***********
たとえば、2つのテーブルに同じフィールドがあって、
それをリレーションシップで紐づけるのは容易ですが、
今回のようなパターンは、
もしかして、私は、ナンセンスなことをしようと苦闘している?と思ってきました。
フィールド名が同じじゃないのに、それを紐づけることができるのでしょうか?

できるとして、どのようにすればよいのでしょうか?

どうぞ、教えていただきたく、お願いいたします!!!

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横...続きを読む

Aベストアンサー

パラメータが表示されたのは指定したフィールドがないからです。
テーブル名とフィールド名を使用している名前に変更してください。

InStr関数は
ある文字列 (string1) の中から指定された文字列 (string2) を検索し、最初に見つかった文字位置を返す文字列処理関数です。
InStr(string1, string2)

やっていることはテーブル受付データBの②(住所)の中からテーブルマスタAの③(住所)を検索し
文字列がある位置を出しています。
必要なのは文字列が含まれているデータのみなので条件を>0としています。

試しにInStrの部分をなくしてクエリを実行してみてください。
「テーブルマスタA」のレコード数*「テーブル受付データB」のレコード数のデータが表示されるはずです。

Q仕事を続けるコツは?

同じお仕事を長~く続けられている方、継続するコツのようなものはありますか?私は最長6年でした。(汗)
よろしかったら教えてください。

Aベストアンサー

仕事以外でなにか守りたいもの、継続したいものとか、探してみてはどうでしょう。

生活や頭の中心を仕事にしなければ、他に占めるものがあれば、大抵のことは耐えられるというか『無』になれるというか。

Qテーブル、インデックスのCREATE文について

ObjectBrowserを使用すると標記のソースが参照できますが、これをデータディクショナリから拾おうとするとどのようなSQLでできるのでしょうか?

マニュアル等いろいろ調べましたところ、各情報を項目として捕まえることはできそうなのですが、CREATE文として取得する方法は探し当てれませんでした。

どなたかご存知の方、よろしくお願いします。

Aベストアンサー

各項目をとってきて、ObjectBrowserがつなげてるだけだと思います。

フィールド数などはフェッチしないとわからないので、
これをSQLで全部連結するのは不可能です。

Q仕事を楽しいと思い込むためのコツ(考え方)を教えて下さい

自分の望む業種・職種の仕事に就くことができて充実した毎日を過ごしている方もいらっしゃるとは思いますが、ほとんどの方はある程度不満を抱きながら仕事をしているように思います。(僕の思い込みならすいません)

自分が望んでいない仕事に従事することになった時、その与えられた仕事を楽しいと思い込むためのコツ(考え方)のようなものがあれば是非教えていただきたいです。

Aベストアンサー

はじめまして。
私は「自分の望む仕事」をしている訳ではないのに、周りからは不本意ながら
「自分の好きな仕事をして充実している」「仕事を楽しんでいる」
「仕事が恋人みたいな物」などと言われています。
あなたが不満から脱却できないのは、あなたの勘違いです。

> 自分が望んでいない仕事に従事することになった時、その与えられた
> 仕事を楽しいと思い込むためのコツ(考え方)のようなものがあれば

ここが間違っているのですよ。
楽しいと思い込む必要は全くありません。事実楽しくないんですから。
楽しくない仕事だからこそ、何とか効率よく片付けてしう工夫をしないと
いつまでも関わってないといけません。
そこで、仕事片付けシステムを構築してしまうのです。
これは、人から与えられる物ではありません。自分で編出すものです。
嫌な仕事を如何に手離れ良く片付けるか・・・を考えるのは結構楽しいです。
仕事自体を楽しいと思うのではなく、片付システムを構築するのを楽しむのです。

QVSAM,QSAM,BSAM,BPAM,BDAM

データセット編成とアクセス法に関してですが、それぞれ、どのようなデータセットとして使われることが多いですか?データを入れるとか…、プログラムを入れるとか…。

Aベストアンサー

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAMはVSAMアクセスの動作方式のことで
す(プログラム中では意識する必要ありません)。

> BDAMはディスクか???
これもアクセス方式ですね。目的レコードの相対アドレ
スを指定してアクセス(READ/WRITE)する方式です。

> DBやJCL、ファイルを入れる場合はBPAMか?
DBは別物です。JCL、プログラム等が格納されるファイル
の形式(編成)がBPAMです。

> ボリュームという言葉があるけれど、データ編成で考えてはいけないのか?
ボリュームとは例えば磁気テープ1本、磁気ディスク1
スピンドルといった補助記録媒体の単位です。
→ 磁気ディスクには1ボリューム中に複数の異なる
  データ編成のファイルを作成可能です。

> ボリュームはどのようにできているのか?
VTOCおよびデータ領域です。

> ボリュームより大きいものはなんと言うのか?
通常ボリュームグループという概念があります。
→ この概念が無いとマルチボリュームファイルは作成
  できませんから・・・。

> 機能は、ちゃんと読んでみます。データ編成は他にもありそうな…。
NECの場合だと、相対編成、乱編成、待機結合編成なんて
のもありますね。

> ファイル編成とデータセット編成は同じことだよな…。???
大体において同じ意味で使用しているケースが多いです。

私の会社ではまだメインフレーム現役です・・・。

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAM...続きを読む

Q仕事を速くやるコツ

こんにちは。

仕事でやるべきことを迷わずサッサと片付けていく…。
基本ではありますがなかなか難しいときもあると思います。
皆さんが仕事を速くやるために心がけていることや、コツはありますか?

こんな本が効いた!というオススメでも結構です。よろしくお願いします。

Aベストアンサー

心がけていることは、段取りをしっかり考えてから仕事を進めることです。
一番避けたいのは、無駄や非効率的なことだと考えています。
なので仕事に取り掛かる前に優先順位・スケジュールをよく考えます。
これをやるついでにこれもやれば効率が良い!とか考えるのがパズルみたいで楽しいです。

また失敗してやり直すのは無駄だと思っているので、一度で完璧にすることを目指します。
自分一人で完結せず、他の人にも影響するような業務での失敗はさらに悪いですよね。
謝って、お願いして、自分も相手もやり直す。通常の2倍以上の工数がかかってしまいます。
取り掛かる前に少しだけ考えて、そんな無駄を回避できれば結果的に仕事が速く終わると思います。

オススメ本は 「できる人」の段取り力 です。
著者:中島孝志 知的生きかた文庫 \553

QテーブルAを参照先としてレコード有無の確認

テーブル:Aがあり、そこに列:甲がある。
CSVデータをテーブル:Bにインポートする。テーブル:Bにも列:甲と同じ規格の列:乙がある。

テーブル:Bのレコードをもとにエクスポート処理を行う際、列:乙の中に列:甲にはないレコードがあった場合、その旨アラートメッセージを表示させたい。
VBAでどのように記述すればいいでしょうか?

環境:Microsoft Access 2003

Aベストアンサー

なら、ゴールは見えたも同然?
まずは頑張って不一致クエリウィザードを使って
未登録車両を抜き出せるクエリを作成してください。
そのクエリ名を仮に、Q未登録チェック とします。
このクエリだけでも目的の大半は達成かと思います。
あとは前回回答のを流用して

Sub UnknownCarCheck()
'Microsoft Office xx.x Access database engine Object Library←Access2007から出来ました
'または、Microsoft 3.6 Object Libary←2003だと多分こっち のいずれかに参照設定が必要です  
  Dim db As Database
  Dim rs As DAO.Recordset
  Set db = CurrentDb
  Set rs = db.OpenRecordset("Q未登録チェック", dbOpenSnapshot)
  rs.MoveLast

  If rs.RecordCount <> 0 Then
    MsgBox rs.RecordCount & "件不一致あり"
    DoCmd.OpenQuery "Q未登録チェック" 'クエリを開いて確認
  Else
    msgbox "未登録車両はありませんでした"
  End If
  
  rs.Close: Set rs = Nothing
  Set db = Nothing
End Sub

というのを必要な時に行えばどうでしょ。
なお、上記回答は CSVファイルを一時的なテーブルにインポートして
それと車番マスタを照合する場合を想定しています。

なら、ゴールは見えたも同然?
まずは頑張って不一致クエリウィザードを使って
未登録車両を抜き出せるクエリを作成してください。
そのクエリ名を仮に、Q未登録チェック とします。
このクエリだけでも目的の大半は達成かと思います。
あとは前回回答のを流用して

Sub UnknownCarCheck()
'Microsoft Office xx.x Access database engine Object Library←Access2007から出来ました
'または、Microsoft 3.6 Object Libary←2003だと多分こっち のいずれかに参照設定が必要です  
  Dim db As Database
  Dim ...続きを読む

Q求人先を選ぶコツ教えてください 35歳独身女です。18歳からスーパーやドラックストアで接客の仕事して

求人先を選ぶコツ教えてください

35歳独身女です。18歳からスーパーやドラックストアで接客の仕事してました。
現在、書類審査待ちですが、駄目なら次受ける会社を決めようと思ってます。

選べる立場ではありませんが、渋々や早く決めたいと焦って受けて失敗したので、不安になってます。
求人先を選ぶコツ教えてください。お願いいたします

Aベストアンサー

毎回、チラシに出ているような求人は、ぜったい訳ありなので、やめたほうがよいですし、
接客系がよいのであれば一度受けたい店などに来店して店の雰囲気を見ておくと良いかもしれませんね。
なにをしたいかにもよりますが、、

QSQLについて教えてください テーブルAの項目はF

QLについて教えてください
テーブルAの項目はF1,F2,F3で内容が
F1,F2,F3
1, 0, 0
1, 1, 0
1, 1, 1
1, 1, 2
2, 1, 1
2, 1, 2
3, 1, 0
3, 2, 2
3, 2, 3
F1をグループ化しF2の最大値の中でさらにF3が最大の行を取得したいのですが
どのようなSQLにすればよいてすか?

Aベストアンサー

こんな感じでもいいかもしれません。

select *
from テーブルA T1
where not exists (
select *
from テーブルB T2
where T2.F1 = T1.F1
and (T2.F2 > T1.F2 or (T2.F2 = T1.F2 and T2.F3 > T1.F3))
);


人気Q&Aランキング

おすすめ情報