中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

主キーを使うな

>小さなテーブルでは、使うとかえってパフォーマンスが落ちることもある?
そうそう。これを問題にしたかったわけでして.....www)

http://blogs.wankuma.com/ognac/archive/2007/06/19/81258.aspx

主キーに限らずキーがあるということはデータベースに対して

インデックスサーチ(DB用語ではない)

データリード

と2回のナイスな読み込みを実施します。

突き詰めていけば1行1列しかないであったり、常にwhereなしで読み取るかつ十分に小さい。(ここはDBMSの実装によりけり)場合には主キーはデメリットです。

キーと値の接手であるにもかかわらずユニーク制約だけにした方が高速です。(INSERTのときの制約チェックの遅さなどが問題になりえるのですが、上記の前提でいくなら本来固定値やシステム保持値など)

ということで、主キーは使うな!! という局面もちょびっとだけ存在します。

投稿日時 : 2007年6月19日 22:06

コメントを追加

# re: 主キーを使うな 2007/06/19 22:48 シャノン

引っ掛かっていたのは、「主キーを設定するとインデックスも勝手に作られる」ということを知らなかったのが原因だと思うのです。
デメリットになっているのはインデックスなんですよね?
たられば論ですが、もしも、キーを作っても勝手にインデックスが作られない DBMS だったら、キーを作っても問題ないんですよね。

# re: 主キーを使うな 2007/06/20 12:46 通り*

DBMSの実装によりけりと書かれていることになりますが、オラクルの話をします。
参照する項目が使用されるインデックスに全て含まれる場合、オラクルではインデックス内の値が使用され、2度読みにならないという話を聞いたことがあります。
#どこで聞いたっけ...
ですので、商品マスターに対してコードで検索して商品名のみを取得することが多い場合は、商品コードだけに対してインデックスを付けるのではなく、商品コードと商品名とで複合インデックスにしてしまうと、商品名取得時のレスポンスの向上が図れるとのことでした。
#普通はそこまでしなくてもいいとは思いますけどね~
オラクルでは主キーで使用するインデックスを自分で指定することもでき、複合インデックスを1項目の主キー用のインデックスとしても使用できます。
#今初めて試してみました。
小さなテーブルの場合、メモリ内のキャッシュが参照される確率も高くなると思いますので、2度読みになってもパフォーマンスにはそれほど影響ないかもって考えてみたりします。
私は基本的にはなんにでも主キーを付けたい派です...

タイトル  
名前  
URL
コメント