質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

4回答

330閲覧

テーブルでのインデックスの設定について

hositaka

総合スコア14

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2018/01/06 08:48

PostgreSQLを使ってアプリケーションの作成をしています。
その際、インデックスを設定するカラムはSELECT文で
SELECT * FROM Table WHERE ~~;
となっていたら、とりあえず「~~」の部分に記述されて記述されているカラムをインデックスにすればよいのでしょうか?
また、テーブルによっては、SELECT * FROM Table ;のようにWHEREで条件指定しないものもあるのですが、その場合はインデックスをつくらないほうが適切でしょうか?
ご回答お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

インデックスについて少々勉強なされたほうがいいかと思います。
この質問からだと、インデックスの必要さが分かりません。

インデックスは、
アプリケーションの処理時間として
ボトルネックになる(なりそうな)検索処理に使われる綱目に対して
設定されるもので、とりあえず作るものではありません。
とりあえずでしたら作らなくてよいと思います。

対象のテーブルに数万レコード以上のレコードが登録されるようでしたら
もう少し詳細を確認s

投稿2018/01/09 07:48

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hositaka

2018/01/10 04:01

ご回答ありがとうございました
guest

0

ベストアンサー

SELECT * FROM Table WHERE ~~;
となっていたら、とりあえず「~~」の部分に記述されて記述されているカラムをインデックスにすればよいのでしょうか?

SELECTが遅いものに関しては、取り敢えずWHERE区に有る項目が対象になります。インデクス作成後にexplainで利用されているかを確認します。
SELECTの遅延が事前に予測できる場合、インデクスを貼る事を検討しても良いとは思いますが、インデクス大量に作成するのには注意が必要です。。
インデクスを沢山作成すると、INSERT,UPDATE,DELETEに負荷が掛かりますし、これらが頻繁に発生するとインデックス検索も遅くなり、REINDEXを必要とする場合が発生します。
Postgresは、テーブルを8kサイズ(default)のページに格納しますが、このページが大量となるテーブルに対してはインデクスはとても有効です。逆にページ数が少ない場合、効果がでない場合が有ります。

余談ですが、PostgreSQL 9.2からは、インデックオンリースキャン機能でインデックスで定義されたカラムのデータのみの取得の場合、テーブル本体データを取得せずに結果が返せるようになりました。
ex)SELECT x, y FROM tab WHERE x = 'key'; (x,yがインデックス)

また、テーブルによっては、SELECT * FROM Table ;のようにWHEREで条件指定しないものもあるのですが、その場合はインデックスをつくらないほうが適切でしょうか?

常にORDER BYもせずに全件検索を行うテーブルで有ればインデクスは必要無いと思います。

投稿2018/01/06 18:30

編集2018/01/08 00:49
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hositaka

2018/01/10 04:01

お詳しいご回答ありがとうございました
guest

0

インデックスの適用によって高速に処理が行われるようにするには、join, where, order by , group by
などで記述される項目に対して行うのが一般的だと思います。

ですが、実行計画の確認が不可欠だと考えて下さい。
内容によっては全表検索の方が高速な場合もありますし、SQLでの記述によっても変わります。
設定するインデックスの項目順序もそれらによって影響を受けますし。

投稿2018/01/06 15:27

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hositaka

2018/01/10 04:01

ご回答ありがとうございました
guest

0

WHERE以外にもONでJOINしたテーブルの結合条件もインデックスの対象になります。
一つのテーブルに多数のインデックスがあるとデータ更新時に負荷が大きいのでご注意を。
ONもWHEREもないSQLしか記述しない場合はインデックスはなくて良いですが、通常はPRIMARY KEYくらいは設定することが多いです。

同じ列名なのにテーブルによってデータ型や桁数が違ってパフォーマンスが悪くなったり、桁落ちで落ちたりすることが少なくありません。テーブル設計・インデックス設計はきちんと勉強してください。
PostgreSQLではじめるDB入門
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう!

投稿2018/01/06 09:22

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hositaka

2018/01/10 04:02

ご回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問