Optimisation 2013-07-02

  • 161 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
161
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 最適化
  • 2. 最適化
  • 3. 最適化 目的
  • 4. 最適化 目的 アプリケーション実行速度を向上させること
  • 5. 最適化 目的 アプリケーション実行速度を向上させること
  • 6. 最適化 目的 アプリケーション実行速度を向上させること 最適なコーディング •ランゲージの特性 •コンパイル 最適なハードウェア •メモリ •記憶装置 最適なインデックス設定 •プライマリーキー or 低選択性 •クエリ重視 or 並び替え
  • 7. ハードウェア
  • 8. ハードウェア 64ビット版サーバー
  • 9. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html
  • 10. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html 32bits 64bits キャッシュ上限 2.3GB unlimited 1度目のクエリ 69s 52s 2度目のクエリ 37s 1.4s
  • 11. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html 32bits 64bits キャッシュ上限 2.3GB unlimited 1度目のクエリ 69s 52s 2度目のクエリ 37s 1.4s インデックス無 7,500,000レコード数: 3.2GBデータファイル:
  • 12. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html 32bits 64bits キャッシュ上限 2.3GB unlimited ソート平均値 839s 108s インデックス無 7,500,000レコード数: 3.2GBデータファイル:
  • 13. ハードウェア
  • 14. ハードウェア SSD (Solid State Drive)
  • 15. ハードウェア SSD (Solid State Drive) HD SSD 1度目の検査 11:00 2:00 圧縮 17:00 5:00 2度目の検査 3:00 0:30 31:00 7:30
  • 16. ハードウェア SSD (Solid State Drive) HD SSD 1度目の検査 11:00 2:00 圧縮 17:00 5:00 2度目の検査 3:00 0:30 31:00 7:30 50GiBデータファイル:
  • 17. ランゲージの特性
  • 18. ランゲージの特性 配列の合計
  • 19. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for ランゲージの特性 配列の合計
  • 20. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for 配列の合計 ランゲージの特性
  • 21. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for 配列の要素を逐一ポインタで解決して加算 配列の合計 ランゲージの特性
  • 22. C_POINTER($1) C_REAL($0) C_LONGINT($i) ARRAY LONGINT($arrCopy) COPY ARRAY ($1->;$arrCopy) For ($i;1;Size of array($arrCopy)) $0:=$0+$arrCopy{$i} End for 配列の合計 ランゲージの特性
  • 23. C_POINTER($1) C_REAL($0) C_LONGINT($i) ARRAY LONGINT($arrCopy) COPY ARRAY ($1->;$arrCopy) For ($i;1;Size of array($arrCopy)) $0:=$0+$arrCopy{$i} End for 配列の合計 ランゲージの特性
  • 24. C_POINTER($1) C_REAL($0) C_LONGINT($i) ARRAY LONGINT($arrCopy) COPY ARRAY ($1->;$arrCopy) For ($i;1;Size of array($arrCopy)) $0:=$0+$arrCopy{$i} End for 配列をコピー(参照カウントをインクリメント)して加算 配列の合計 ランゲージの特性
  • 25. 配列の合計 ランゲージの特性 C_POINTER($1) C_REAL($0) $0:=Sum($1->)
  • 26. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性
  • 27. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性 配列に統計関数を使用して加算
  • 28. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性
  • 29. 配列の合計 ランゲージの特性 COPY $1->{$i} インタプリタ版
  • 30. 配列の合計 ランゲージの特性 COPY $1->{$i} Sum インタプリタ版
  • 31. 配列の合計 ランゲージの特性 COPY $1->{$i} コンパイル版
  • 32. 配列の合計 ランゲージの特性 COPY $1->{$i} Sum コンパイル版
  • 33. ランゲージの特性
  • 34. ランゲージの特性 文字列の比較
  • 35. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) C_LONGINT($i;$L_max) $L_max:=Length($1) If ($L_max=Length($2)) $0:=True For ($i;1;$L_max) If (Character code($1[[$i]])#Character code($2[[$i]])) $0:=False $i:=$L_max End if End for End if
  • 36. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) C_LONGINT($i;$L_max) $L_max:=Length($1) If ($L_max=Length($2)) $0:=True For ($i;1;$L_max) If (Character code($1[[$i]])#Character code($2[[$i]])) $0:=False $i:=$L_max End if End for End if
  • 37. ランゲージの特性 文字列の比較 コンパイル版 インタプリタ版
  • 38. ランゲージの特性 文字列の比較 $L_max:=Length($1) If ($L_max=Length($2)) $0:=True TEXT TO BLOB ($1;$blob1;UTF8 text without length) TEXT TO BLOB ($2;$blob2;UTF8 text without length) $L_max:=BLOB size($blob1) If ($L_max=BLOB size($blob2)) $0:=True For ($i;0;$L_max-1) If ($blob1{$i}#$blob2{$i}) $0:=False $i:=$L_max End if End for End if End if
  • 39. ランゲージの特性 文字列の比較 $L_max:=Length($1) If ($L_max=Length($2)) $0:=True TEXT TO BLOB ($1;$blob1;UTF8 text without length) TEXT TO BLOB ($2;$blob2;UTF8 text without length) $L_max:=BLOB size($blob1) If ($L_max=BLOB size($blob2)) $0:=True For ($i;0;$L_max-1) If ($blob1{$i}#$blob2{$i}) $0:=False $i:=$L_max End if End for End if End if
  • 40. ランゲージの特性 文字列の比較 $L_max:=Length($1) If ($L_max=Length($2)) $0:=True TEXT TO BLOB ($1;$blob1;UTF8 text without length) TEXT TO BLOB ($2;$blob2;UTF8 text without length) $L_max:=BLOB size($blob1) If ($L_max=BLOB size($blob2)) $0:=True For ($i;0;$L_max-1) If ($blob1{$i}#$blob2{$i}) $0:=False $i:=$L_max End if End for End if End if
  • 41. ランゲージの特性 文字列の比較 $L_max:=Length($1) If ($L_max=Length($2)) $0:=True TEXT TO BLOB ($1;$blob1;UTF8 text without length) TEXT TO BLOB ($2;$blob2;UTF8 text without length) $L_max:=BLOB size($blob1) If ($L_max=BLOB size($blob2)) $0:=True For ($i;0;$L_max-1) If ($blob1{$i}#$blob2{$i}) $0:=False $i:=$L_max End if End for End if End if Length BLOB Size "アイウエオ" 5 15 "アイウエオ" 5 10
  • 42. ランゲージの特性 文字列の比較 コンパイル版 インタプリタ版
  • 43. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  • 44. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  • 45. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case 文字コードに基づいて文字列の位置を判定
  • 46. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  • 47. ランゲージの特性 文字列の比較 Position 文字コード比較
  • 48. ランゲージの特性
  • 49. ランゲージの特性 文字列の抽出
  • 50. ランゲージの特性 $T_buffer:=$T_final Repeat $L_pos:=Position("r";$T_buffer) If ($L_pos>0) $T_line:=Substring($T_buffer;1;$L_pos-1) $T_buffer:=Substring($T_buffer;$L_pos+1) Else $T_line:=$T_buffer $T_buffer:="" End if // ...use $T_line... Until ($T_buffer="") 文字列の抽出
  • 51. ランゲージの特性 $T_buffer:=$T_final Repeat $L_pos:=Position("r";$T_buffer) If ($L_pos>0) $T_line:=Substring($T_buffer;1;$L_pos-1) $T_buffer:=Substring($T_buffer;$L_pos+1) Else $T_line:=$T_buffer $T_buffer:="" End if // ...use $T_line... Until ($T_buffer="") 文字列の抽出
  • 52. ランゲージの特性 $L_offsetMax:=Length($T_final) $L_offset:=1 Repeat $L_pos:=Position("r";$T_final;$L_offset) If ($L_pos>0) $T_line:=Substring($T_final;$L_offset;$L_pos-$L_offset) $L_offset:=$L_pos+1 Else $T_line:=Substring($T_final;$L_offset) $L_offset:=$L_offsetMax End if // ...use $T_line... Until ($L_offset>=$L_offsetMax) 文字列の抽出
  • 53. ランゲージの特性 文字列の抽出 $L_offsetMax:=Length($T_final) $L_offset:=1 Repeat $L_pos:=Position("r";$T_final;$L_offset) If ($L_pos>0) $T_line:=Substring($T_final;$L_offset;$L_pos-$L_offset) $L_offset:=$L_pos+1 Else $T_line:=Substring($T_final;$L_offset) $L_offset:=$L_offsetMax End if // ...use $T_line... Until ($L_offset>=$L_offsetMax)
  • 54. ランゲージの特性 文字列の抽出 $L_offsetMax:=Length($T_final) $L_offset:=1 Repeat $L_pos:=Position("r";$T_final;$L_offset) If ($L_pos>0) $T_line:=Substring($T_final;$L_offset;$L_pos-$L_offset) $L_offset:=$L_pos+1 Else $T_line:=Substring($T_final;$L_offset) $L_offset:=$L_offsetMax End if // ...use $T_line... Until ($L_offset>=$L_offsetMax) 判定のスタート位置を指定
  • 55. ランゲージの特性 文字列の抽出 $L_offsetMax:=Length($T_final) $L_offset:=1 Repeat $L_pos:=Position("r";$T_final;$L_offset) If ($L_pos>0) $T_line:=Substring($T_final;$L_offset;$L_pos-$L_offset) $L_offset:=$L_pos+1 Else $T_line:=Substring($T_final;$L_offset) $L_offset:=$L_offsetMax End if // ...use $T_line... Until ($L_offset>=$L_offsetMax)
  • 56. ランゲージの特性 文字列の抽出
  • 57. 0 100 200 300 400 500 600 700 800 0 2,000 4,000 6,000 8,000 10,000 12,000 14,000 16,000 18,000 20,000 Milliseconds テキストの行数 インタプリタ版 コンパイル版 インタプリタ版 (*) コンパイル版 (*) ランゲージの特性 文字列の抽出 * 判定のスタート位置を指定
  • 58. ランゲージの特性
  • 59. ランゲージの特性 文字列の連結
  • 60. ランゲージの特性 $str:="" For ($i;1;Size of array($theArr)) $str:=$str+$theArr{$i} End for 文字列の連結
  • 61. ランゲージの特性 $str:="" For ($i;1;Size of array($theArr)) $str:=$str+$theArr{$i} End for 文字列の連結
  • 62. ランゲージの特性 $str:=$totalLength*"-" $pos:=1 For ($i;1;Size of array($theArr)) $str:=Change string($str;$theArr{$i};$pos) $pos:=$pos+Length($theArr{$i}) End for 文字列の連結
  • 63. ランゲージの特性 $str:=$totalLength*"-" $pos:=1 For ($i;1;Size of array($theArr)) $str:=Change string($str;$theArr{$i};$pos) $pos:=$pos+Length($theArr{$i}) End for 文字列の連結
  • 64. ランゲージの特性 文字列の連結
  • 65. 1,000 2,000 3,000 4,000 5,000 6,000 10,000 30,000 50,000 70,000 90,000 94847769585540272013 6,292 5,293 3,941 3,009 2,232 1,515 959 522 212 40 Milliseconds 連結 置換 コンパイル版 ランゲージの特性 文字列の連結
  • 66. ランゲージの特性 文字列の連結
  • 67. ランゲージの特性 inArray = PA_GetVariableParameter( params, 1); count = PA_GetArrayNbElements(inArray); totalLength = 0; for(i = 1; i <= count; i++) { ! totalLength += PA_GetStringInArray(inArray, i).fLength; } finalStr = (PA_Unichar *) calloc( totalLength * 1.5, sizeof(PA_Unichar)); ptr = (char *) finalStr; for(i = 1; i <= count; i++) { ! theString = ( * (PA_Unistring**) (inArray.uValue.fArray.fData) )[i]; ! PA_MoveBlock(theString.fString, ptr, theString.fLength * sizeof(PA_Unichar)); ! ptr += (theString.fLength * sizeof(PA_Unichar)); } PA_ReturnString( params, finalStr); 文字列の連結
  • 68. ランゲージの特性 文字列の連結
  • 69. 20 40 60 80 100 Milliseconds 13 20 27 40 55 58 69 77 84 94 3 8 9 9 11 14 16 23 24 27 10,000 20,000 30,000 40,000 50,000 60,000 70,000 80,000 90,000 100,000 置換 プラグイン ランゲージの特性 文字列の連結 コンパイル版
  • 70. 新規プロセス
  • 71. C_BOOLEAN($1;$B_doIt) If (Count parameters>0) $B_doIt:=$1 End if If (Not($B_doIt)) $L_ignore:=New process(Current method name; 512*1024;"New order";True) Else End if 新規プロセス
  • 72. 新規プロセス C_BOOLEAN($1;$B_doIt) If (Count parameters>0) $B_doIt:=$1 End if If (Not($B_doIt)) $L_ignore:=New process(Current method name; 512*1024;"New order";True) Else End if
  • 73. 新規プロセス C_BOOLEAN($1;$B_doIt) If (Count parameters>0) $B_doIt:=$1 End if If (Not($B_doIt)) $L_ignore:=New process(Current method name; 512*1024;"New order";True) Else End if プロセス作成と同時にツインプロセスを作成
  • 74. 新規プロセス C_BOOLEAN($1;$B_doIt) If (Count parameters>0) $B_doIt:=$1 End if If (Not($B_doIt)) $L_ignore:=New process(Current method name; 512*1024;"New order";True) Else End if レコードにアクセスするまでツインプロセスの作成は延期
  • 75. 新規プロセス
  • 76. 0 27,500 55,000 82,500 110,000 Milliseconds 1,327 1,316 100,195 1,433v12 v13 ローカル グローバル 1,000プロセス数: 新規プロセス
  • 77. コンパイル
  • 78. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+Char(9) End for For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 79. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+Char(9) End for For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 80. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+Char(9) End for For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for Bad Good!
  • 81. コンパイル
  • 82. コンパイル C_BOOLEAN($0) C_LONGINT($L_platform) PLATFORM PROPERTIES ($L_platform) $0:=($L_platform=Windows) C_BOOLEAN($0) C_LONGINT(<>envL_platform) If (<>env_L_platform=0) PLATFORM PROPERTIES (<>envL_platform) End if $0:=(<>env_L_platform=Windows)
  • 83. コンパイル C_BOOLEAN($0) C_LONGINT($L_platform) PLATFORM PROPERTIES ($L_platform) $0:=($L_platform=Windows) C_BOOLEAN($0) C_LONGINT(<>envL_platform) If (<>env_L_platform=0) PLATFORM PROPERTIES (<>envL_platform) End if $0:=(<>env_L_platform=Windows)
  • 84. コンパイル C_BOOLEAN($0) C_LONGINT($L_platform) PLATFORM PROPERTIES ($L_platform) $0:=($L_platform=Windows) C_BOOLEAN($0) C_LONGINT(<>envL_platform) If (<>env_L_platform=0) PLATFORM PROPERTIES (<>envL_platform) End if $0:=(<>env_L_platform=Windows) Bad Good!
  • 85. コンパイル
  • 86. 0 1,000 2,000 3,000 4,000 Milliseconds 3,914 101 1,433 3 インタプリタ版 コンパイル版 関数コール インタープロセス 100,000コール数: コンパイル
  • 87. コンパイル
  • 88. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator
  • 89. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator
  • 90. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator Bad Good!
  • 91. コンパイル
  • 92. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 93. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 94. コンパイル デフォルトの型指定: For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 95. コンパイル デフォルトの型指定: C_REAL C_LONGINT For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  • 96. コンパイル デフォルトの型指定: C_REAL C_LONGINT For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for Good!Bad
  • 97. コンパイル
  • 98. 0 50 100 150 200 Milliseconds 163 24 C_REAL C_LONGINT コンパイル 10,000,000ループ数:
  • 99. コンパイル
  • 100. コンパイル If ($aString="") If (Length($aString)=0)
  • 101. コンパイル If ($aString="") If (Length($aString)=0)
  • 102. コンパイル Good! If ($aString="") If (Length($aString)=0) Bad
  • 103.  無駄なリクエスト
  • 104.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas])
  • 105.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas])
  • 106.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している
  • 107.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している 無駄: 全フィールドのデータを転送している(BLOBも)
  • 108.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している 無駄: 全フィールドのデータを転送している(BLOBも) バグ: 2度目のロードでレコードがロックされる可能性
  • 109.  無駄なリクエスト
  • 110.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices")
  • 111.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト
  • 112.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト + リクエスト
  • 113.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト + リクエスト + リクエスト
  • 114.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト + リクエスト + リクエスト × レコード数
  • 115.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト + リクエスト + リクエスト × レコード数 =
  • 116.  無駄なリクエスト QUERY ([Invoices];...) CREATE SET ([Customers];"CustInvoices") FIRST RECORD ([Invoices]) While (Not(End selection([Invoices]))) QUERY ([Customers];[Customers]ID=[Invoices]CustomerID) ADD TO SET ([Customers];"CustInvoices") NEXT RECORD ([Invoices]) End while USE SET ("CustInvoices") × リクエスト + リクエスト + リクエスト × レコード数 = 無駄 無駄 無駄 無駄 無駄 無駄 無駄 無駄
  • 117.  無駄なリクエスト QUERY ([Invoices];...) RELATE ONE SELECTION ([Invoices];[Customers])
  • 118. インデックス
  • 119. インデックス B-Tree Cluster
  • 120. インデックス B-Tree Cluster インデックスキー: 値が該当するレコード
  • 121. インデックス B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  • 122. インデックス B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  • 123. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  • 124. インデックス B-Tree インデックスキー: 値が該当するレコード id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 Blue Red Blue Blue Blue Red Red
  • 125. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 B-Tree インデックスキー: 値が該当するレコード id: 1Blue Red Blue Blue Blue Red Red
  • 126. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red
  • 127. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red
  • 128. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1
  • 129. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1
  • 130. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 * 実際にはインデックスページ(ビットテーブル or 圧縮)で管理されている
  • 131. インデックス Cluster 低選択性データに適している Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 low-selectivity
  • 132. インデックス Cluster 低選択性データに適している DISTINCT VALUESは圧倒的に速い Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 low-selectivity
  • 133. インデックス Cluster low-selectivity 低選択性データに適している DISTINCT VALUESは圧倒的に速い
  • 134. インデックス Cluster low-selectivity high-selectivity B-Tree 高選択性データに適している(例: プライマリーキー) 並び替えはClusterよりも速い 低選択性データに適している DISTINCT VALUESは圧倒的に速い
  • 135. 0 150 300 450 Milliseconds 30.93 346.4 0.09 5.4 259.5 322.2 270.8 435.4 B-Tree Cluster B-Tree Cluster DISTINCT VALUES QUERY 5,000,000レコード数: 値の範囲: 1 10 プライマリーキー
  • 136. 0 125 250 Milliseconds 164.82 209.1 160.02 241.25 B-Tree Cluster B-Tree Cluster ORDER BY 値の範囲: 1 10 プライマリーキー 5,000,000レコード数:
  • 137. 最適化