• ベストアンサー

インデックスのまとめ貼りと個別貼り

いつもお世話になっております。 インデックスを貼るときに主キーのようにまとめて 設定することができますよね。 CREATE INDEX Idx原価 ON T原価 (商品名,発注番号); 上記のようにまとめて設定するのと CREATE INDEX Idx原価_商品名 ON T原価 (商品名); CREATE INDEX Idx原価_発注番号 ON T原価 (発注番号); このように2つに分けて貼るのでは意味は違ってくるのでしょうか? 商品名と発注番号の検索が別々に行われる場合は 分けて作成したら良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

意味は違ってきます。 商品名と発注番号の検索が別々に行われる場合は分けて作成したら良いです。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

困り度3の割には反応が無いですね。 意味は違ってきます。 商品別に複数の発注番号を参照する場合に使用しますから、 where 商品名='○○' and 発注番号 between 12345 and 23456 みたいな使い方の場合に有効。 where 発注番号 between 12345 and 23456 みたいな検索では、商品名の絞り込みが効かないので総スキャンが発生。 発注番号あたりに複数の商品があるなら CREATE INDEX Idx原価2 ON T原価 (発注番号,商品名); か、とは思うが、発注番号あたりに何千何万の商品がないならばこのようなINDEXは普通作りません。 CREATE INDEX Idx原価_発注番号 ON T原価 (発注番号); で充分でしょう。 where 商品名='○○' where 発注番号=12345 のような検索が行われるなら、 CREATE INDEX Idx原価_商品名 ON T原価 (商品名); CREATE INDEX Idx原価_発注番号 ON T原価 (発注番号); が有効です。

関連するQ&A

  • MySQLのUNIQUE INDEXとINDEX

    MySQLのUNIQUE INDEXとINDEXの使い分けで質問があります。 UNIQUE INDEXは、社員番号や学籍番号など重複がないものに対して使われ、 INDEXは名前のように重複が想定されるものに対して使われるのでしょうか? また、複数のカラムに同一のインデックスをつける場合、 CREATE INDEX idx_名前 ON 社員(氏,名) と言う感じになりますが 例えばこんなコード CREATE INDEX idx_名前 ON 社員(氏) and CREATE INDEX idx_名前 ON 社員(名) これはエラーになるんでしょうか?

    • ベストアンサー
    • MySQL
  • 効率的なインデックスのつけ方は?

    効率的なインデックスのつけ方は? MYSQLでのインデックスのつけ方をご教授して頂けますでしょうか? ・データ数とかその他もろもろにもよるかと思いますが、一般的に考えてってことでよろしくお願いいたします。 以下のようなテーブル定義があったとします。 CREATE TABLE TEST_TBL ( C1 VARCHAR(10) NOT NULL, C2 VARCHAR(10) NOT NULL, C3 VARCHAR(10) NOT NULL, C4 VARCHAR(10) NOT NULL, PRIMARY KEY (C1) ) 検索条件としては、 ・(C1) ・(C2) ・(C3) ・(C4) ・(C1,C2) ・(C1,C3) ・(C1,C4) ・(C2,C3) ・(C2,C4) ・(C3,C4) ・(C1,C2,C3) ・(C1,C2,C4) ・(C1,C3,C4) ・(C2,C3,C4) ・(C1,C2,C3,C4) と言うような、すべての場合の条件があるとします。 それぞれの検索条件の頻度は同程度とします。 この場合、どのINDEXとどのINDEXを作成するがベターなのでしょうか? 1. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1); 2. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2); 3. CREATE INDEX TEST_IDX1 ON TEST_TBL (C3); 4. CREATE INDEX TEST_IDX1 ON TEST_TBL (C4); 5. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2); 6. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3); 7. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C4); 8. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3); 9. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C4); 10.CREATE INDEX TEST_IDX1 ON TEST_TBL (C3,C4); 11.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3); 12.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C4); 13.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3,C4); 14.CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3,C4); 15.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3,C4);

    • ベストアンサー
    • MySQL
  • テーブル定義書作成時のIndex付加について

    基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • 主キー、インデックスが作成できない

    お世話になります。 SQLserver2000とACCESS(フロント)で使っております。 主キーもインデックスも設定していなかったテーブルに エンタープライズマネージャから主キーを設定しようとしたのですが、保存しようとすると以下のエラーが出てしまいます。 もともと更新クエリを作成したのですが、”更新可能なクエリであることが必要です。”とエラーが出てしまい、いろいろ調べるうちに主キーを設定していないから??と思い、設定しようとしたのですがうまくいきません。。宜しくお願いします。 ■エラー内容 テーブル 'テーブル名 (ユーザー名)' - インデックス 'インデックス名' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'XXXX-00XXXX-00-A1 ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。

  • postgres table作成時にindex付与

    MySQLでは以下のようにテーブル作成時にインデックス付与ができます。 CREATE TABLE test ( a int(11) NOT NULL DEFAULT '0', b int(11) DEFAULT NULL, PRIMARY KEY (a), KEY test_idx (b), -- ★インデックス その1 KEY test_idx2 (a) -- ★インデックス その2 ); ポスグレではできませんか?

  • SQLのINDEX名

    素朴な疑問ですが、教えてください。 SQLのcreate index構文は「create index idx on table(id);」ですが、 そもそも、なぜindex名をこちらが名前を指定するようになっているのでしょうか。 別にシステム側で決めても良い気がします。delete index するときも 列名を指定する仕組みにして、列名に張られたindexを削除する仕組みにすればいいのにと 思います。 よろしくお願いします。

  • ■検索時にINDEX(インデックス)がどう役立つのか?

    いつもお世話になっております。 MySQLのカテゴリにて質問をさせて頂きますが、このことに意味はありません。 SQLにおける、INDEXの考え方を知ることができれば良いなと思っております。 SQLについては初心者ですので、分かりやすく教えて頂けると助かります。 では、本題へ。 ------------- あるデータテーブルの検索速度を上げる方法として、 INDEXを設定することもその1つに挙げられるかと思いますが、 あるテーブルにおける、ある列(フィールド)に対しINDEXを設定した場合、 検索時、それはどう利用されるのでしょうか、というのが質問です。 例えば、 会員データベース ・会員番号:id ・年齢:age ※その他、複数のフィールドを持つ、とする。 上記の会員データベースにおいて、 CREATE INDEX idx ON tbl_member(id); という風に、tbl_memberテーブルに対し、 会員番号(id)をINDEXに設定したとします、 idは唯一無二の(ユニークな)データです。 この会員テーブルにおいて、 年齢(age)フィールドをもとに、40歳以上の会員を抽出(検索)したい場合、 INDEX(idが設定されている)はこの検索において、 どういう仕組みで活かされることになるのでしょうか? ageと無関係のidが、どう役に立つのか分からずにいる、ということです。 ネット上で色々調べたのですが、 あるフィールドをINDEXに設定した場合に、 それが検索時にどう活かされるのかについて説明されているページを 私は見つけることができませんでしたので、質問させて頂きました。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。

  • SQLServer2008でタイムアウト

    SQLServer2008を使っています。 レセプトを入れた大きなテーブル(1000万行以上)から、何年何月にどの保険者(たとえば国保)に何件請求があったかを取り出したいと思います。 保険者は保険者番号(10桁前後の数値)、診療年月は200904のような形で入っています。 主キーになる項目はないので主キーは設定していません。 ManagementStudioにて保険者番号、診療年月に下記のコマンドでインデックスを設定しました。 CREATE NONCLUSTERED INDEX IDX_レセプト1 ON dbo.レセプト(保険者番号) CREATE NONCLUSTERED INDEX IDX_レセプト2 ON dbo.レセプト(診療年月) その後、目的の集計を行うべくManagementStudioで下記のSelectコマンドを実行しました。 SELECT 保険者番号, 診療年月, COUNT(保険者番号) AS Expr1 FROM dbo.レセプト GROUP BY 保険者番号, 診療年月 ところがタイムアウトになってしまうのです。 オブジェクトエクスプローラーで一番上のアイコンを右クリックし、プロパティで接続のタイムアウトを0に設定してみましたが改善しません。 どうしたらいいでしょうか。

  • インデックスの削除と、インデック名のつけ方について

    PostgreSQL8.2.24を使っています。 インデックスの削除と、インデック名のつけ方についてお聞きしたいです。 まず、削除ですが、create index tbl_fld_key on tbl (fld); としたものは、drop index tbl_fld_key;で削除できますが、 create tbl ( fld integer, unique key (fld) ); としたものは、drop index tbl_fld_keyで削除できません。 インデックス名は\diコマンドで表示されている tbk_fld_keyです。 メッセージは次のとおりです。 db =# drop index tbl_fld_key; ERROR: cannot drop index tbl_fld_key because constraint tbl_fld_key on table tbl requires it HINT: You may drop constraint tbl_fld_key on table tbl instead. あと、PostgreSQLのインデック名の規則について インデックス名を見ただけで判断できるように作られるようですが PRIMARY KEY テーブル名_フィールド名_pkey UNIQUE    テーブル名_フィールド名_key 重複可    テーブル名_フィールド名_??? <<--- この部分が知りたいです。