板検索:
インデックスはどこに貼るべきか? (44)
まとめビュー
1
NAME IS NULL[sage]   投稿日:2006/06/20 11:28:32  ID:???(26)
無知な私に教えてくださいm(_ _)m
Where文でよく使う項目にインデックスを貼っていたのですが
ググったりして探してみるとどうも違うようですが、みんな曖昧な言いまわしで
よくわかりません。
たとえば、PostgreSQLで以下のようなテーブルがあるとします。
---------------------------
SNO          NUMERIC(8) [PRIMARY KEY]
NAME         VARCHAR(100)
SEX           NUMERIC(1) -- 0:男、1:女
---------------------------
SNOは通し番号でPRIMARY KEYなのでインデックスが貼られますが
クエリー発行時に「where SEX = 1 」とよく利用する場合にSEXにはインデックスを
貼るべきなのか貼らないべきなのかが分かりません。


2
1[sage]   投稿日:2006/06/20 11:31:40  ID:???(26)
試しに二つのテーブルを用意して実験してみました。
--テーブル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のほうが
インデックスが使われています。ということはやはりよく検索する項目にはインデックスを張るべきなのでしょうか??

3
NAME IS NULL[sage]   投稿日:2006/06/20 12:19:13  ID:???(26)

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

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


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

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


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


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

4
NAME IS NULL[]   投稿日:2006/06/20 12:53:47  ID:QOvjXAXI
判らなきゃ聞かずに勉強しろ。
このあたりはSQL知ってるレベルから、DB使えるってレベルへの大事な部分だ。
コメント1件

5
U ◆CZtFsGiu0c [sage]   投稿日:2006/06/20 16:23:53  ID:???(26)
Postgresってコストベースでしょ?
たかだかデータ10件でインデックススキャンを選択するオプティマイザ
って信用できるのだろうか。

それはともかく、

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

SEXって男性、女性(+NULL?)しかないわけでしょ? そのフィールドに
インデックス貼って本当に効率がどこまで上がるのかな? それから、
>4も書いているとおりそんな単純な問題ではないから、基礎から
勉強しましょう。
#まあプランを検証しているだけマシか…

6
NAME IS NULL[sage]   投稿日:2006/06/21 15:20:04  ID:???(26)
いや、単発質問スレ立ててる時点で勉強しても許しがたい

7
NAME IS NULL[sage]   投稿日:2006/06/22 09:36:01  ID:???(26)
お尻に張ってください

8
NAME IS NULL[]   投稿日:2006/06/22 13:05:59  ID:IC52MLFC
尻でもSEXでもいいが、張って高速化できるんなら張れば。
ちなみにDBMSやindexの種類にもよるが、値の分布が少ない場合はあんまり効果無いぞ。
場合によっちゃ、張っても全スキャンの方が速いと判断して使ってくれない場合もある。

9
NAME IS NULL[sage]   投稿日:2006/06/22 17:17:28  ID:???(26)
昔は、使ってくれないだけならまだしも、使った上に全件より遅くなったりしたもんだ。
今でもそういうDBMSあるだろね。

10
NAME IS NULL[]   投稿日:2006/06/25 16:34:46  ID:xGXxj73z
SEXの値のデータ分布が 1 対 1 なら、あまり意味が無い
男(0):女(1)=9:1なんかで SEX = 1 という検索を行う必要があれば、インデックスを張る価値があるよ
この場合、SEX = 0 の検索では効果はないけどね

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

結局、その検索条件でデータをガッツリ絞り込めることが保証されるなら
インデックスを張るべきだね。
コメント2件


11
NAME IS NULL[sage]   投稿日:2006/06/25 16:43:07  ID:???(26)
まぁ、列のカーディナリティが低いなら、ビットマップインデックスはるか、
パーティションテーブル使った方がいいかもな

12
NAME IS NULL[sage]   投稿日:2006/06/25 20:11:03  ID:???(26)
男と女のデータの数が1:1でも
インデックスを使うとデータは半分になるわけだが。
コメント1件

13
NAME IS NULL[sage]   投稿日:2006/06/26 00:26:19  ID:???(26)
>12
ほぅ・・・
100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
データ分布が1対1で、レコードをある程度絞り込めるならインデックスを使う必要はないだろ。

>10の考え方は、インデックスをインデックスらしく使うのではなく
インデックスを介して、そのノードが保持するテーブル内に散乱したレコードの
行番号リストを得ることを目的としてるんだが。

14
NAME IS NULL[sage]   投稿日:2006/07/01 23:02:23  ID:???(26)
カーディナリティが低い場合はインデックスを忘れろ。

15
NAME IS NULL[]   投稿日:2006/07/06 10:21:52  ID:vCGruU6t
> 100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
100万件全スキャンさせるのよりも、50万件全スキャンさせるほうが
半分ですむ。
コメント1件

16
NAME IS NULL[]   投稿日:2006/07/06 12:56:01  ID:4t2wzNRO
>15
インデックスたぐるコストのほうが、べた舐めよりかかる。

17
NAME IS NULL[]   投稿日:2006/07/06 16:47:53  ID:U1S8L1hg
多くの場合、インデックスは昇順でならんでいる。
だから最初と最後の位置を特定すれば、あとは舐めるだけと変わらない。
データが少ない場合は、最初と最後の位置を特定するコストに相殺されるが、
データが多くなると、スキャンする範囲が狭くなるので有効。

18
NAME IS NULL[sage]   投稿日:2006/07/06 22:59:18  ID:???(26)
それはindexのリーフに必要なデータが揃っている場合だけな。

select SEX from TABLE where SEX=1


19
NAME IS NULL[]   投稿日:2006/07/07 09:08:47  ID:+t31RxJ2
だーね、SQL鯖でいうクラスタ化インデックスって場合。

20
NAME IS NULL[sage]   投稿日:2006/07/09 16:29:41  ID:???(26)
せめて column 名は GENDER にしないか。

コメント1件

21
NAME IS NULL[sage]   投稿日:2006/07/09 20:28:12  ID:???(26)
>20
甘いな・・・
若手女プログラマに列名を言わせるのが楽しいんだろ
顔真っ赤にして言われると、こっちも苦笑いするしか無いがな

30過ぎの負け犬だと躊躇することなく列名を発するからツマラン

22
1[sage]   投稿日:2006/07/25 16:04:37  ID:???(26)
皆さん!レスありがとうございます。
B-TREEの基礎から勉強してきました。インデックスとは何かが良くわかりました。
奥が深くて回答しづらいのも良くわかりました。こんなスレたててすみませんでした。
コメント1件

23
NAME IS NULL[]   投稿日:2007/01/27 07:42:17  ID:8mHye8uN

24
NAME IS NULL[]   投稿日:2007/01/27 10:46:22  ID:O+RfWf9V
>22
んでどういう見解に至ったか説明せい。
カーディナリティという言葉を含めて。

25
NAME IS NULL[sage]   投稿日:2007/02/01 12:23:54  ID:???(26)
なにげに良スレ化。
コメント1件

26
NAME IS NULL[]   投稿日:2007/02/12 12:58:20  ID:/s74tiRC
ほしゅ

27
NAME IS NULL[sage]   投稿日:2007/02/14 09:39:15  ID:???(26)
インサートとかセックスとか、童貞にはハァハァ対象だな。

28
NAME IS NULL[sage]   投稿日:2008/10/30 11:31:29  ID:???(26)
インデックスたん(;´Д`)ハァハァ

29
NAME IS NULL[sage]   投稿日:2008/11/11 22:48:21  ID:???(26)
>25
できるよ。
以上。
はい次の方。

30
NAME IS NULL[]   投稿日:2009/04/06 09:50:39  ID:gtB4cOSs
ソートで使う列(値はバラバラ)に
インデックスは効果ありますか?
コメント1件

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

32
NAME IS NULL[]   投稿日:2009/04/11 20:10:45  ID:691PehwU(3)
>10
Oracle8iのオプティマイザは糞だからな。
統計情報を採取した後に、急激にパフォーマンスが悪くなるなんてこともあった。
現在のバージョンのオプティマイザは優秀になったが。

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

だから、オマイの案のようなそういう特殊条件をやる場合は、
SEXの抽出条件にバインド変数を利用しないようにしないと問題が発生するだろう。

33
NAME IS NULL[]   投稿日:2009/04/11 20:13:26  ID:691PehwU(3)
やべ、3年前のレスに返信してしもうたわw
ハズカシー (/ω\)

34
NAME IS NULL[sage]   投稿日:2009/04/13 13:05:07  ID:???(26)
 x‐‐―…―‐--x
人人        \
   (ー:‐:‐:‐:‐:‐:‐:‐:i ヽ
 マ (_________!  !
 ジ (ノへハノハノィi::i::ハ !
 で (r心`   r心ヘ::l::!|
  っ(弋ソ  弋ソ}ノ::N.|
 !? (:::ー''/\ー'::Y:::|  て
::ハ⌒i u \/  .イ:|:|  (
`ヽ::i:|\`  7{ ノ:|::!:! |

35
NAME IS NULL[]   投稿日:2009/06/17 23:31:00  ID:fu0ZnfDa
ビットマップはテーブルの目的によっちゃ使わないほうが良い事もある。

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

おいらは本番で痛い目を見た......

36
NAME IS NULL[]   投稿日:2009/08/27 00:10:55  ID: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

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

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


37
NAME IS NULL[sage]   投稿日:2009/08/27 14:28:08  ID:???(26)
エンジンによっても違うらしいから
explainしてみるか実測してみたら?

38
NAME IS NULL[sage]   投稿日:2009/08/27 20:54:57  ID:???(26)
やっぱり個別インデックスをつけた方が速かったです。
エンジンは、ISAMを使っています。

更新時に重くなければ、このままインデックスをつけて
やってみます。混雑時じゃないと実測できないけど・・・。

39
NAME IS NULL[sage]   投稿日:2009/12/01 01:36:35  ID:???(26)
              _.. -――- ._
            ./ ,―――‐- .._` .、
        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_`_ー_'_____./

40
南沢木綿子 ◆qdIdLOElrVy2 [sage]   投稿日:2010/09/08 10:12:20  ID:???(26)
  ∧,,,∧ 
 (  ・∀・) ほー それで
  (  : ) 
  し─J

コメント1件

41
【38.6m】 電脳プリオン[sage]   投稿日:2012/05/26 14:48:22
>40

最近このコテよく見かける

42
NAME IS NULL[]   投稿日:2013/06/12 19:30:30  ID:dhCfeG4A
お!今話題のスレタイ!

43
NAME IS NULL[sage]   投稿日:2013/06/21 18:05:24  ID:???(26)
最初か最後のページだな。

44
NAME IS NULL[sage]   投稿日:2013/08/11 00:00:00  ID:???(26)
痛いとこにでも貼っとけば良いんでない?
更新情報
・スレッド一覧ページで過去ログのタイトル検索・一覧表示ができるようになりました(2016/1/20)
NGワード登録
登録する
スレッド内検索

データベース板 タイトル検索

このスレッドが人気です(実況系)
ぶらり途中下車の旅 JR南武線★2 (1001)NTV実況
ぶらり途中下車の旅 JR南武線★4 (184)NTV実況
王様のブランチ☆1 (580)TBS実況
週刊ニュース深読み うちの娘がアダルトビデオに!?どうする出演強要問題 ★2 (462)NHK実況
ライオンのグータッチ (415)フジ実況
実況 ◆ 日本テレビ 55609 (977)NTV実況
サタデープラス【艶髪の新常識(秘)シャンプー&ドライヤー術で劇変★銀座で極上の和】 (494)TBS実況
にじいろジーン★2 (204)フジ実況
このスレッドが人気です(ニュース系)
【この、ハゲーーーっ!】自民党 豊田真由子衆議院議員が離党届を提出 ★58 (336)ニュー速+
【この、ハゲーーーっ!】自民党 豊田真由子衆議院議員が離党届を提出 ★57 (1002)ニュー速+
【訃報/芸能】小林麻央さん死去 34歳 22日夜自宅で 闘病中にブログ続けるも力尽く ★13 (811)音楽・芸能ニュース
【消防団員】消防車で昼食にうどん店、ダメ? 擁護の声が9割でも…担当者「昔なら問題にならなかった」 (284)ニュー速+
【東京新聞】会見で食い下がった東京新聞記者 菅官房長官を動揺させた突破の質問力★2 (673)ニュー速+
【芸能】「妹が見てくれているから」小林麻耶、看取った翌日に笑顔で収録 (620)音楽・芸能ニュース
【この、ハゲーーーっ!】自民党 豊田真由子衆議院議員が離党届を提出 ★56 (1001)ニュー速+
【経済】日銀の日本株買(ETF)いが止まらない…株買い一辺倒 4社に1社で「超安定株主」に (1001)ニュー速+
データベース板の人気スレ
Oracle 質問総合スレ12 (910)
SQL初心者質問スレ (862)
PostgreSQL Part.11 (339)
Oracle 質問総合スレ9 (986)
MySQL 総合 Part24 (1010)
Oracle 質問総合スレ10 (1014)
SQL質疑応答スレ 17問目 (340)
♪つっかもうぜ!DB! (79)
SQL質疑応答スレ 15問目 (1013)
MySQL 総合 Part25 (957)
Microsoft SQL Server 総合スレ 11 (434)
SQLite Part.10 (617)
はじまりです。 (584)
XML統合スレッド (397)
【論理ファイル】AS400DB【キューリー】 (262)
RDBMS比較総合スレ 【サーバ】 (115)
このサイトについて
このサイトは2ちゃんねるからデータを取得し、表示するサービスです。
画像のインライン表示機能について
画像のURLの後ろにある[画像をインライン表示]をクリックすると、URLの下に表示します。
表示される画像は横幅100pxに縮小されていて、クリックすると原寸で表示します。
このサイトの特徴
1)スレッド内検索ができます
2)レス(「>>1」など)のポップアップができます
3)不適切な言葉を含む投稿を表示しません
4)ページ内で画像を直接表示できます
5)2ch他スレッドへのリンクはタイトル・板名つきでリンクします
6)すっきりとしたデザインで表示します
7)最新スレや前スレをチェック・一覧表示します
8)NGワード機能の搭載でイヤな言葉が目に入りません
9)荒らしを自動チェックします
10)スレッド内・同一IDの書き込みだけ表示できます
11)レスの返事をレスされた発言の下に表示する「まとめビュー」が利用できます
12)シリーズ化したスレッドの一覧を表示します
13)最新のスレッドがある場合はお知らせします
削除について
こちらをご覧ください
機能要望について
現在機能要望受付中です。
問い合わせについて
こちらのページからどうぞ
広告


首都圏の方、ソフトバンク光オススメですよ


このサイトは2ch.scからデータを取得・表示しています。削除などについてはこちらをご覧ください。 アクセスモード: