Your SlideShare is downloading. ×
Optimisation 2013-07-02
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Optimisation 2013-07-02

182

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
182
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
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. 最適化

×