2ch勢いランキング 全部 1- 最新50

インデックスはどこに貼るべきか?


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

--テーブル2
create table test2(
sno serial not null,
name varchar(100),
sex numeric(2),
primary key(sno)
);

create index test2_indexA1
on test2
(sex);

この二つのテーブルにまったく同じデータを10個ほど入れて
・explain select * from test1 where sex = 1 ;
・explain select * from test2 where sex = 1 ;
を実行してみました。

test1のほうは
Seq Scan on test1 (cost=0.00..22.50 rows=5 width=183)
Filter: (sex = 1::numeric)
という結果でした。

test2のほうは
Index Scan using test2_indexa1 on test2 (cost=0.00..17.07 rows=5 width=183)
Index Cond: (sex = 1::numeric)
という結果でした。

データ数も少ないのでコストはあまり変わりませんがusing indexと出てるのでtest2のほうが
インデックスが使われています。ということはやはりよく検索する項目にはインデックスを張るべきなのでしょうか??
NAME IS NULL [sage] 2006/06/20(火) 12:19:13ID:???

  ( ゚д゚)
_(__つ/ ̄ ̄ ̄/_
  \/    /

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


 ( ゚д゚)
_(__つ/ ̄ ̄ ̄/_
  \/    /

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


  (゚д゚ )
_(__つ/ ̄ ̄ ̄/_
  \/    /


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

それはともかく、

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

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

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

結局、その検索条件でデータをガッツリ絞り込めることが保証されるなら
インデックスを張るべきだね。
NAME IS NULL [sage] 2006/06/25(日) 16:43:07ID:???
まぁ、列のカーディナリティが低いなら、ビットマップインデックスはるか、
パーティションテーブル使った方がいいかもな
NAME IS NULL [sage] 2006/06/25(日) 20:11:03ID:???
男と女のデータの数が1:1でも
インデックスを使うとデータは半分になるわけだが。
NAME IS NULL [sage] 2006/06/26(月) 00:26:19ID:???

ほぅ・・・
100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
データ分布が1対1で、レコードをある程度絞り込めるならインデックスを使う必要はないだろ。

の考え方は、インデックスをインデックスらしく使うのではなく
インデックスを介して、そのノードが保持するテーブル内に散乱したレコードの
行番号リストを得ることを目的としてるんだが。
NAME IS NULL [sage] 2006/07/01(土) 23:02:23ID:???
カーディナリティが低い場合はインデックスを忘れろ。
NAME IS NULL [] 2006/07/06(木) 10:21:52:vCGruU6t
> 100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
100万件全スキャンさせるのよりも、50万件全スキャンさせるほうが
半分ですむ。
NAME IS NULL [] 2006/07/06(木) 12:56:01:4t2wzNRO

インデックスたぐるコストのほうが、べた舐めよりかかる。
NAME IS NULL [] 2006/07/06(木) 16:47:53:U1S8L1hg
多くの場合、インデックスは昇順でならんでいる。
だから最初と最後の位置を特定すれば、あとは舐めるだけと変わらない。
データが少ない場合は、最初と最後の位置を特定するコストに相殺されるが、
データが多くなると、スキャンする範囲が狭くなるので有効。
NAME IS NULL [sage] 2006/07/06(木) 22:59:18ID:???
それはindexのリーフに必要なデータが揃っている場合だけな。

select SEX from TABLE where SEX=1

NAME IS NULL [] 2006/07/07(金) 09:08:47:+t31RxJ2
だーね、SQL鯖でいうクラスタ化インデックスって場合。
NAME IS NULL [sage] 2006/07/09(日) 16:29:41ID:???
せめて column 名は GENDER にしないか。
NAME IS NULL [sage] 2006/07/09(日) 20:28:12ID:???

甘いな・・・
若手女プログラマに列名を言わせるのが楽しいんだろ
顔真っ赤にして言われると、こっちも苦笑いするしか無いがな

30過ぎの負け犬だと躊躇することなく列名を発するからツマラン
1 [sage] 2006/07/25(火) 16:04:37ID:???
皆さん!レスありがとうございます。
B-TREEの基礎から勉強してきました。インデックスとは何かが良くわかりました。
奥が深くて回答しづらいのも良くわかりました。こんなスレたててすみませんでした。
NAME IS NULL [] 2007/01/27(土) 07:42:17:8mHye8uN
オカマの思う壺
ttp://megabbs.com/pickles/index.html
NAME IS NULL [] 2007/01/27(土) 10:46:22:O+RfWf9V

んでどういう見解に至ったか説明せい。
カーディナリティという言葉を含めて。
NAME IS NULL [sage] 2007/02/01(木) 12:23:54ID:???
なにげに良スレ化。
NAME IS NULL [] 2007/02/12(月) 12:58:20:/s74tiRC
ほしゅ
NAME IS NULL [sage] 2007/02/14(水) 09:39:15ID:???
インサートとかセックスとか、童貞にはハァハァ対象だな。
NAME IS NULL [sage] 2008/10/30(木) 11:31:29ID:???
インデックスたん(;´Д`)ハァハァ
NAME IS NULL [sage] 2008/11/11(火) 22:48:21ID:???

できるよ。
以上。
はい次の方。
NAME IS NULL [] 2009/04/06(月) 09:50:39:gtB4cOSs
ソートで使う列(値はバラバラ)に
インデックスは効果ありますか?
NAME IS NULL [] 2009/04/11(土) 20:01:58:691PehwU

意味はあるよ。
でもバラバラにインデックスを定義するよりも、複合インデックスにした方が効果的なのは言うまでもない。
NAME IS NULL [] 2009/04/11(土) 20:10:45:691PehwU

Oracle8iのオプティマイザは糞だからな。
統計情報を採取した後に、急激にパフォーマンスが悪くなるなんてこともあった。
現在のバージョンのオプティマイザは優秀になったが。

Oracle10gや11gは、カーディナリティが低いSEXのインデックスでも使用してくれるだろう。
だが1つだけ注意しないといけないことがあってな。
それはSEXの抽出条件にバインド変数を使用してしまうと、
女で抽出する場合と男で抽出する場合でも、同じ実行計画を組み立ててしまうということ。

だから、オマイの案のようなそういう特殊条件をやる場合は、
SEXの抽出条件にバインド変数を利用しないようにしないと問題が発生するだろう。
NAME IS NULL [] 2009/04/11(土) 20:13:26:691PehwU
やべ、3年前のレスに返信してしもうたわw
ハズカシー (/ω\)
NAME IS NULL [sage] 2009/04/13(月) 13:05:07ID:???
 x‐‐―…―‐--x
人人        \
   (ー:‐:‐:‐:‐:‐:‐:‐:i ヽ
 マ (_________!  !
 ジ (ノへハノハノィi::i::ハ !
 で (r心`   r心ヘ::l::!|
  っ(弋ソ  弋ソ}ノ::N.|
 !? (:::ー''/\ー'::Y:::|  て
::ハ⌒i u \/  .イ:|:|  (
`ヽ::i:|\`  7{ ノ:|::!:! |
NAME IS NULL [] 2009/06/17(水) 23:31:00:fu0ZnfDa
ビットマップはテーブルの目的によっちゃ使わないほうが良い事もある。

トランザクション系なら避けたほうがいい。

おいらは本番で痛い目を見た......
NAME IS NULL [] 2009/08/27(木) 00:10:55:vGxTqY7s
MySQL5.x系を使っているのですが、どうも件数が遅くなりそうで心配です。

簡単に言うと、名簿を作っているのですが、
'部' '課' '係' というカラムで個人情報があって、それに対して、

( 部1 = 部2 and 課1 = null and 係1 = null ) or
( 部1 = 部2 and 課1 = 課2 and 係1 = null ) or
( 部1 = 部2 and 課1 = 課2 and 係1 = 課2l ) or

というマッチングを頻繁にやってます。

この場合、部、課、係の複合インデックスのほかに、部、課、係それぞれの
インデックスを作ることは効果あるでしょうか?

NAME IS NULL [sage] 2009/08/27(木) 14:28:08ID:???
エンジンによっても違うらしいから
explainしてみるか実測してみたら?
NAME IS NULL [sage] 2009/08/27(木) 20:54:57ID:???
やっぱり個別インデックスをつけた方が速かったです。
エンジンは、ISAMを使っています。

更新時に重くなければ、このままインデックスをつけて
やってみます。混雑時じゃないと実測できないけど・・・。
NAME IS NULL [sage] 2009/12/01(火) 01:36:35ID:???
              _.. -――- ._
            ./ ,―――‐- .._` .、
        x   /  ./  / /    ``\.  +
           /_.. ィ7T.フ厂 ̄`フi ‐- ._ |〉     x
       .x    !  ̄フ/l/_×// |ハハl .ト、  x
    |! /    |  /|,イ._T_i`   .r≦lハ!|``   +
    ll/_     .|  | |'弋..!ノ     i'+!l |
   / ミr`!   /   l |' ' '  ,‐- ..__゙ー' .!l .|
   ト、ソ .! ./   .,!l .ト、  l  `,!   .ハ.! 
   /ll\ `テヽ、 /_,| |l: > .ヽ.. ィ <l   l|
  ./' l|/l. >' / /\. | | \ \ー'/ ./ ,,;:`:;'゙"r;:゙c
  '  l|l l/ ./ /    | |  _\_×_/.ィ'...二二二l ヽ
     | ヽ./ /   /|.|i彡_           \\
     | //  ./ .l|| ´   ̄,「 ̄ 「 li ̄二ニ -'´ ヽ.
    └――'"l// .|!   / / ! .| |' |l //
         / __l_/_/__.|__|__l_`_ー_'_____./
南沢木綿子 ◆qdIdLOElrVy2 [sage] 2010/09/08(水) 10:12:20ID:???
  ∧,,,∧ 
 (  ・∀・) ほー それで
  (  : ) 
  し─J
【38.6m】 電脳プリオン [sage] 2012/05/26(土) 14:48:22.22ID:???


最近このコテよく見かける
NAME IS NULL [] 2013/06/12(水) 19:30:30.22:dhCfeG4A
お!今話題のスレタイ!
NAME IS NULL [sage] 2013/06/21(金) 18:05:24.95ID:???
最初か最後のページだな。
NAME IS NULL [sage] 2013/08/11(日) NY:AN:NY.ANID:???
痛いとこにでも貼っとけば良いんでない?
NAME IS NULL [sage] 2015/01/03(土) 03:54:34.12ID:???
第1章 赤・緑・青編             1巻~3巻
第2章 イエロー編              4巻~7巻
第3章 金・銀・クリスタル編        8巻~15巻
第4章 ルビー・サファイア編        15巻~22巻
第5章 ファイアレッド・リーフグリーン編 22巻~26巻
第6章 エメラルド編             26巻~29巻
第7章 ダイヤモンド・パール編      30巻~38巻
第8章 プラチナ編              38巻~40巻
第9章 ハートゴールド・ソウルシルバー編 41巻~43巻
第10章 ブラック・ホワイト編        43巻~51巻
第11章 ブラック2・ホワイト2編        52巻~
第12章 エックス・ワイ編            XY編2巻~
NAME IS NULL [] 2015/01/23(金) 00:48:08.85:458VLz89
◆cqxclbaQk/hG [sage] 2015/02/01(日) 15:23:39.19ID:???
最初に無があった
無から有が生まれた
これが全ての真理
NAME IS NULL [sage] 2015/02/01(日) 16:41:47.17ID:???
あそこ。
NAME IS NULL [sage] 2015/02/10(火) 00:16:06.77ID:???
ttp://http://jbbs.shitaraba.net/sports/42269/
NAME IS NULL [] 2015/09/19(土) 02:46:04.98:atvU/TBs

インデックスは作るもの。
ギンコ ◆BonGinkoCc [sage] 2015/12/14(月) 20:18:32.99ID:???
インデックスは、DATで言うと、スタートID、DVDやBDでいうとチャプターに該当する。

スタートIDやチャプターを任意の場所に振っておくと、録音後や録画後に後から簡単に探し出せますよね。
インデックスを降っていないファイルの場合は、シーケンシャルアクセスを行い、目的のデータが見つかるまで
順番にたどり着くしか方法が無い。
NAME IS NULL [] 2015/12/14(月) 23:00:31.65:3cSRdEx7

かなり違うが?
NAME IS NULL [] 2017/12/29(金) 12:04:37.50:dtNZwIie
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

95548V17E0

勢い5万以上のスレをメールでお知らせするサービス、実施中!!
憧れボディをGETしたい!その夢、ボニックで!

2ch勢いランキング 全部 1- 最新50 データベース板ランキング はてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加

凡例:

レス番

100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている

名前

名無しさん (青) → sage のレス
名無しさん (緑) → age のレス

ID

ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID

このページは2ch勢いランキングが作成したキャッシュです。元のページはこちら。削除についてはこちら