.................................................
<< 10年10月 >>
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31


最近のコメント
10/07 北本
09/29 拝承
07/28 北本
07/20 ばてれん
10/26 北本
.............................
何となくリンク
.............................

2020年
02月
05月
2019年
04月 05月
08月 09月
2018年
01月 02月 03月
04月 05月 06月
09月
10月
2017年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2016年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2015年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2014年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2013年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2012年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2011年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2010年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2009年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2008年
01月 02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月
2007年
02月 03月
04月 05月 06月
07月 08月 09月
10月 11月 12月

2010年10月27日の雑記


SQL Server 2008自習書のINDEX編が間違ってるんだが大丈夫か? 2010年10月27日(水)20時45分
分類:マメ知識 [この記事のURL]

SQL Server 2008 の勉強を進めているんですが、
自習書シリーズという公式の学習書があります。
この中にある「インデックスの基礎とメンテナンス」に関して
致命的な間違いがあると思うんだが大丈夫か?

問題となっているのは 45ページから書かれている
「カバリング インデックス(複合インデックス)」という項目です。

複合INDEXを以下のSQL文で作成しています。PDF/46頁下段。
CREATE INDEX index_姓名 ON 社員(姓, 名)
作成されたINDEXの図が以下の通りです。

「姓」と「名」だけの複合なのに「社員番号」も入ってます。

上記の複合INDEXを作成し、以下の検索を行った場合、
SELECT 社員番号, 姓, 名 FROM 社員 WHERE 姓 = 'Aoki'
RID Lookupが発生しないと記載されています。
PDF/47頁 項番3 の実行プランにRID Lookupがない
※RID LookupはPDF/17頁「非クラスタ化インデックスの内部構造」参照。

select文で、姓と社員番号と名を引っ張ってきている為、
姓と名の複合INDEXでは社員番号の情報が入ってません。
よって、実際は、RID Lookupが発生します

実際に姓と名の複合INDEXを作成後、作成されている事を確認します。

Oracleで言う、user_ind_columns が sys.index_columnsなんですが、
Oracleと違い、TABLE名、INDEX名、カラム名が全てidで管理されてます。

よってIDに紐付く和名を取得する為に3つのTABLEを結合しなければいけません。
超めんどくさいです。もっと良い方法ないでしょうかねぇ?
id管理の為、容量は小さく済むんですが面倒ですな!

object_idは一意の為、object_idを名前に変換するOBJECT_NAMEという組み込み関数があるので良いが、index_idやcolumn_idは結合で取得するしかないと思うので大変です(ノД`)

SELECT 社員番号, 姓, 名 FROM 社員 WHERE 姓 = 'Aoki' で検索を行います。

INDEXには姓と名しか情報がない為、実際のデータ行への参照(RID Lookup)が拝承されています。

今度は一番最初の図の通りの複合INDEXを作成してみました。

INDEX自体に、姓、社員番号、名の情報を持たしています。

姓、社員番号、名を引っ張ってくる検索を行います。

INDEXの検索のみで全てのデータが揃うため、RID Lookpが発生しません。

結論から申し上げますと、
【誤】create index INDEX_姓名 ON 社員(姓,名)
【正】create index INDEX_姓名 ON 社員(姓,社員番号,名)
です。

これかなり致命的な間違いだと思うが大丈夫か?


nik5.144