インデックスはどこに貼るべきか? (55レス)
1-

1
(3): 2006/06/20(火)11:28 ID:??? AAS
無知な私に教えてくださいm(_ _)m
Where文でよく使う項目にインデックスを貼っていたのですが
ググったりして探してみるとどうも違うようですが、みんな曖昧な言いまわしで
よくわかりません。
たとえば、PostgreSQLで以下のようなテーブルがあるとします。
---------------------------
SNO          NUMERIC(8) [PRIMARY KEY]
NAME         VARCHAR(100)
SEX           NUMERIC(1) -- 0:男、1:女
---------------------------
省3
2: 1 2006/06/20(火)11:31 ID:??? AAS
試しに二つのテーブルを用意して実験してみました。
--テーブル1
create table test1(
sno serial not null,
name varchar(100),
sex numeric(2),
primary key(sno)
);

--テーブル2
create table test2(
省22
3: 2006/06/20(火)12:19 ID:??? AAS
  ( ゚д゚)
_(__つ/ ̄ ̄ ̄/_
  \/    /

    _, ._
  ( ゚ Д゚)
_(__つ/ ̄ ̄ ̄/_
  \/    /

 ( ゚д゚)
_(__つ/ ̄ ̄ ̄/_
省11
4
(1): 2006/06/20(火)12:53 ID:QOvjXAXI(1) AAS
判らなきゃ聞かずに勉強しろ。
このあたりはSQL知ってるレベルから、DB使えるってレベルへの大事な部分だ。
5: U ◆CZtFsGiu0c 2006/06/20(火)16:23 ID:??? AAS
Postgresってコストベースでしょ?
たかだかデータ10件でインデックススキャンを選択するオプティマイザ
って信用できるのだろうか。

それはともかく、

>クエリー発行時に「where SEX = 1 」とよく利用する場合にSEXにはインデックスを
貼るべきなのか貼らないべきなのかが分かりません。

SEXって男性、女性(+NULL?)しかないわけでしょ? そのフィールドに
インデックス貼って本当に効率がどこまで上がるのかな? それから、
>>4も書いているとおりそんな単純な問題ではないから、基礎から
勉強しましょう。
省1
6: 2006/06/21(水)15:20 ID:??? AAS
いや、単発質問スレ立ててる時点で勉強しても許しがたい
7: 2006/06/22(木)09:36 ID:??? AAS
お尻に張ってください
8: 2006/06/22(木)13:05 ID:IC52MLFC(1) AAS
尻でもSEXでもいいが、張って高速化できるんなら張れば。
ちなみにDBMSやindexの種類にもよるが、値の分布が少ない場合はあんまり効果無いぞ。
場合によっちゃ、張っても全スキャンの方が速いと判断して使ってくれない場合もある。
9: 2006/06/22(木)17:17 ID:??? AAS
昔は、使ってくれないだけならまだしも、使った上に全件より遅くなったりしたもんだ。
今でもそういうDBMSあるだろね。
10
(2): 2006/06/25(日)16:34 ID:xGXxj73z(1) AAS
SEXの値のデータ分布が 1 対 1 なら、あまり意味が無い
男(0):女(1)=9:1なんかで SEX = 1 という検索を行う必要があれば、インデックスを張る価値があるよ
この場合、SEX = 0 の検索では効果はないけどね

と経験上の話を書いたけど、残念ながら Oracle(たしか8iくらい?) は SEX = 1 のような検索でも
インデックスは使ってくれなかった。
入力された検索条件をユーザープログラム側で解析して、SEX = 1 となるような
検索になるときは、ヒントでインデックスを使うように指示した記憶がある。
ある特殊な検索だったんだけど、結果を出すのに数十秒かかってた処理が
一瞬で返るようになってビックリした。

結局、その検索条件でデータをガッツリ絞り込めることが保証されるなら
省1
11: 2006/06/25(日)16:43 ID:??? AAS
まぁ、列のカーディナリティが低いなら、ビットマップインデックスはるか、
パーティションテーブル使った方がいいかもな
12
(1): 2006/06/25(日)20:11 ID:??? AAS
男と女のデータの数が1:1でも
インデックスを使うとデータは半分になるわけだが。
13: 2006/06/26(月)00:26 ID:??? AAS
>>12
ほぅ・・・
100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
データ分布が1対1で、レコードをある程度絞り込めるならインデックスを使う必要はないだろ。

>>10の考え方は、インデックスをインデックスらしく使うのではなく
インデックスを介して、そのノードが保持するテーブル内に散乱したレコードの
行番号リストを得ることを目的としてるんだが。
14: 2006/07/01(土)23:02 ID:??? AAS
カーディナリティが低い場合はインデックスを忘れろ。
15
(1): 2006/07/06(木)10:21 ID:vCGruU6t(1) AAS
> 100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
100万件全スキャンさせるのよりも、50万件全スキャンさせるほうが
半分ですむ。
16: 2006/07/06(木)12:56 ID:4t2wzNRO(1) AAS
>>15
インデックスたぐるコストのほうが、べた舐めよりかかる。
17: 2006/07/06(木)16:47 ID:U1S8L1hg(1) AAS
多くの場合、インデックスは昇順でならんでいる。
だから最初と最後の位置を特定すれば、あとは舐めるだけと変わらない。
データが少ない場合は、最初と最後の位置を特定するコストに相殺されるが、
データが多くなると、スキャンする範囲が狭くなるので有効。
18: 2006/07/06(木)22:59 ID:??? AAS
それはindexのリーフに必要なデータが揃っている場合だけな。

select SEX from TABLE where SEX=1
19: 2006/07/07(金)09:08 ID:+t31RxJ2(1) AAS
だーね、SQL鯖でいうクラスタ化インデックスって場合。
20
(1): 2006/07/09(日)16:29 ID:??? AAS
せめて column 名は GENDER にしないか。
1-
あと 35 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.423s*