SlideShare ist ein Scribd-Unternehmen logo
1 von 139
Downloaden Sie, um offline zu lesen
最適化
最適化
最適化
目的
最適化
目的
アプリケーション実行速度を向上させること
最適化
目的
アプリケーション実行速度を向上させること
最適化
目的
アプリケーション実行速度を向上させること
最適なコーディング
•ランゲージの特性
•コンパイル
最適なハードウェア
•メモリ
•記憶装置
最適なインデックス設定
•プライマリーキー or 低選択性
•クエリ重視 or 並び替え
ハードウェア
ハードウェア
64ビット版サーバー
ハードウェア
64ビット版サーバー
http://www.4d.com/jp/support/resources.html
ハードウェア
64ビット版サーバー
http://www.4d.com/jp/support/resources.html
32bits 64bits
キャッシュ上限 2.3GB unlimited
1度目のクエリ 69s 52s
2度目のクエリ 37s 1.4s
ハードウェア
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データファイル:
ハードウェア
64ビット版サーバー
http://www.4d.com/jp/support/resources.html
32bits 64bits
キャッシュ上限 2.3GB unlimited
ソート平均値 839s 108s
インデックス無
7,500,000レコード数:
3.2GBデータファイル:
ハードウェア
ハードウェア
SSD (Solid State Drive)
ハードウェア
SSD (Solid State Drive)
HD SSD
1度目の検査 11:00 2:00
圧縮 17:00 5:00
2度目の検査 3:00 0:30
31:00 7:30
ハードウェア
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データファイル:
ランゲージの特性
ランゲージの特性
配列の合計
C_POINTER($1)
C_REAL($0)
C_LONGINT($i)
For($i;1;Size of array($1->))
$0:=$0+$1->{$i}
End for
ランゲージの特性
配列の合計
C_POINTER($1)
C_REAL($0)
C_LONGINT($i)
For($i;1;Size of array($1->))
$0:=$0+$1->{$i}
End for
配列の合計
ランゲージの特性
C_POINTER($1)
C_REAL($0)
C_LONGINT($i)
For($i;1;Size of array($1->))
$0:=$0+$1->{$i}
End for
配列の要素を逐一ポインタで解決して加算
配列の合計
ランゲージの特性
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
配列の合計
ランゲージの特性
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
配列の合計
ランゲージの特性
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
配列をコピー(参照カウントをインクリメント)して加算
配列の合計
ランゲージの特性
配列の合計
ランゲージの特性
C_POINTER($1)
C_REAL($0)
$0:=Sum($1->)
C_POINTER($1)
C_REAL($0)
$0:=Sum($1->)
配列の合計
ランゲージの特性
C_POINTER($1)
C_REAL($0)
$0:=Sum($1->)
配列の合計
ランゲージの特性
配列に統計関数を使用して加算
C_POINTER($1)
C_REAL($0)
$0:=Sum($1->)
配列の合計
ランゲージの特性
配列の合計
ランゲージの特性
COPY
$1->{$i}
インタプリタ版
配列の合計
ランゲージの特性
COPY
$1->{$i}
Sum
インタプリタ版
配列の合計
ランゲージの特性
COPY
$1->{$i}
コンパイル版
配列の合計
ランゲージの特性
COPY
$1->{$i}
Sum
コンパイル版
ランゲージの特性
ランゲージの特性
文字列の比較
ランゲージの特性
文字列の比較
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
ランゲージの特性
文字列の比較
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
ランゲージの特性
文字列の比較
コンパイル版
インタプリタ版
ランゲージの特性
文字列の比較
$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
ランゲージの特性
文字列の比較
$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
ランゲージの特性
文字列の比較
$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
ランゲージの特性
文字列の比較
$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
ランゲージの特性
文字列の比較
コンパイル版
インタプリタ版
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End case
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End case
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End case
文字コードに基づいて文字列の位置を判定
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End case
ランゲージの特性
文字列の比較
Position
文字コード比較
ランゲージの特性
ランゲージの特性
文字列の抽出
ランゲージの特性
$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="")
文字列の抽出
ランゲージの特性
$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="")
文字列の抽出
ランゲージの特性
$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)
文字列の抽出
ランゲージの特性
文字列の抽出
$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)
ランゲージの特性
文字列の抽出
$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)
判定のスタート位置を指定
ランゲージの特性
文字列の抽出
$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)
ランゲージの特性
文字列の抽出
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
テキストの行数
インタプリタ版 コンパイル版 インタプリタ版 (*) コンパイル版 (*)
ランゲージの特性
文字列の抽出
* 判定のスタート位置を指定
ランゲージの特性
ランゲージの特性
文字列の連結
ランゲージの特性
$str:=""
For ($i;1;Size of array($theArr))
$str:=$str+$theArr{$i}
End for
文字列の連結
ランゲージの特性
$str:=""
For ($i;1;Size of array($theArr))
$str:=$str+$theArr{$i}
End for
文字列の連結
ランゲージの特性
$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
文字列の連結
ランゲージの特性
$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
文字列の連結
ランゲージの特性
文字列の連結
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
連結 置換 コンパイル版
ランゲージの特性
文字列の連結
ランゲージの特性
文字列の連結
ランゲージの特性
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);
文字列の連結
ランゲージの特性
文字列の連結
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
置換 プラグイン
ランゲージの特性
文字列の連結
コンパイル版
新規プロセス
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
新規プロセス
新規プロセス
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
新規プロセス
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
プロセス作成と同時にツインプロセスを作成
新規プロセス
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
レコードにアクセスするまでツインプロセスの作成は延期
新規プロセス
0
27,500
55,000
82,500
110,000
Milliseconds
1,327
1,316
100,195
1,433v12
v13
ローカル
グローバル
1,000プロセス数:
新規プロセス
コンパイル
コンパイル
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+Char(9)
End for
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+Char(9)
End for
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
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!
コンパイル
コンパイル
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)
コンパイル
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)
コンパイル
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!
コンパイル
0
1,000
2,000
3,000
4,000
Milliseconds
3,914
101
1,433
3
インタプリタ版
コンパイル版
関数コール
インタープロセス
100,000コール数:
コンパイル
コンパイル
コンパイル
C_TEXT($0)
If (Env_B_IsWindows)
$0:="¥¥"
Else
$0:=":"
End if
C_TEXT($0)
$0:=Folder separator
コンパイル
C_TEXT($0)
If (Env_B_IsWindows)
$0:="¥¥"
Else
$0:=":"
End if
C_TEXT($0)
$0:=Folder separator
コンパイル
C_TEXT($0)
If (Env_B_IsWindows)
$0:="¥¥"
Else
$0:=":"
End if
C_TEXT($0)
$0:=Folder separator
Bad
Good!
コンパイル
コンパイル
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
デフォルトの型指定:
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
デフォルトの型指定:
C_REAL C_LONGINT
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
コンパイル
デフォルトの型指定:
C_REAL C_LONGINT
For ($i;1;$max)
$aText:=$aText+$anArray{$i}+"t"
End for
Good!Bad
コンパイル
0
50
100
150
200
Milliseconds
163
24
C_REAL
C_LONGINT
コンパイル
10,000,000ループ数:
コンパイル
コンパイル
If ($aString="")
If (Length($aString)=0)
コンパイル
If ($aString="")
If (Length($aString)=0)
コンパイル
Good!
If ($aString="")
If (Length($aString)=0)
Bad
 無駄なリクエスト
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
無駄: 1度目のリクエストで済んだことを繰り返している
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
無駄: 1度目のリクエストで済んだことを繰り返している
無駄: 全フィールドのデータを転送している(BLOBも)
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
無駄: 1度目のリクエストで済んだことを繰り返している
無駄: 全フィールドのデータを転送している(BLOBも)
バグ: 2度目のロードでレコードがロックされる可能性
 無駄なリクエスト
 無駄なリクエスト
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")
 無駄なリクエスト
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")
× リクエスト
 無駄なリクエスト
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")
× リクエスト + リクエスト
 無駄なリクエスト
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")
× リクエスト + リクエスト + リクエスト
 無駄なリクエスト
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")
× リクエスト + リクエスト + リクエスト
× レコード数
 無駄なリクエスト
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")
× リクエスト + リクエスト + リクエスト
× レコード数 =
 無駄なリクエスト
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")
× リクエスト + リクエスト + リクエスト
× レコード数 = 無駄 無駄 無駄 無駄 無駄 無駄 無駄 無駄
 無駄なリクエスト
QUERY ([Invoices];...)
RELATE ONE SELECTION ([Invoices];[Customers])
インデックス
インデックス
B-Tree
Cluster
インデックス
B-Tree
Cluster
インデックスキー:
値が該当するレコード
インデックス
B-Tree
Cluster
インデックスキー:
値が該当するレコードのビットマップ
インデックスキー:
値が該当するレコード
インデックス
B-Tree
Cluster
インデックスキー:
値が該当するレコードのビットマップ
インデックスキー:
値が該当するレコード
インデックス
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
B-Tree
Cluster
インデックスキー:
値が該当するレコードのビットマップ
インデックスキー:
値が該当するレコード
インデックス
B-Tree
インデックスキー:
値が該当するレコード
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
Blue
Red
Blue
Blue
Blue
Red
Red
インデックス
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
B-Tree
インデックスキー:
値が該当するレコード
id: 1Blue
Red
Blue
Blue
Blue
Red
Red
インデックス
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
Cluster
インデックスキー:
値が該当するレコードのビットマップ
Blue
Red
インデックス
id: 0
id: 3
id: 2
id: 4 id: 5
id: 6
id: 1
Cluster
インデックスキー:
値が該当するレコードのビットマップ
Blue
Red
インデックス
Cluster
インデックスキー:
値が該当するレコードのビットマップ
Blue
Red
0101110
1010001
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
インデックス
Cluster
インデックスキー:
値が該当するレコードのビットマップ
Blue
Red
0101110
1010001
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
インデックス
Cluster
インデックスキー:
値が該当するレコードのビットマップ
Blue
Red
0101110
1010001
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
* 実際にはインデックスページ(ビットテーブル or 圧縮)で管理されている
インデックス
Cluster
低選択性データに適している
Blue
Red
0101110
1010001
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
low-selectivity
インデックス
Cluster
低選択性データに適している
DISTINCT VALUESは圧倒的に速い
Blue
Red
0101110
1010001
id: 0
id: 3
id: 2
id: 4
id: 5
id: 6
id: 1
low-selectivity
インデックス
Cluster
low-selectivity
低選択性データに適している
DISTINCT VALUESは圧倒的に速い
インデックス
Cluster
low-selectivity
high-selectivity
B-Tree
高選択性データに適している(例: プライマリーキー)
並び替えはClusterよりも速い
低選択性データに適している
DISTINCT VALUESは圧倒的に速い
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
プライマリーキー
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レコード数:
最適化

Weitere ähnliche Inhalte

Was ist angesagt?

081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.pptNaoya Ito
 
Zend四十八手シリーズ Zend_Cache Zend_Paginator
Zend四十八手シリーズ Zend_Cache Zend_PaginatorZend四十八手シリーズ Zend_Cache Zend_Paginator
Zend四十八手シリーズ Zend_Cache Zend_PaginatorYusuke Ando
 
テンプレートエンジンって何?
テンプレートエンジンって何?テンプレートエンジンって何?
テンプレートエンジンって何?Shoichi Takahashi
 
Mosesdecoderコード解読の勘所
Mosesdecoderコード解読の勘所Mosesdecoderコード解読の勘所
Mosesdecoderコード解読の勘所Jun-ya Norimatsu
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでKouhei Sutou
 
サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)ひとし あまの
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているpocketberserker
 

Was ist angesagt? (11)

081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
 
Zend四十八手シリーズ Zend_Cache Zend_Paginator
Zend四十八手シリーズ Zend_Cache Zend_PaginatorZend四十八手シリーズ Zend_Cache Zend_Paginator
Zend四十八手シリーズ Zend_Cache Zend_Paginator
 
テンプレートエンジンって何?
テンプレートエンジンって何?テンプレートエンジンって何?
テンプレートエンジンって何?
 
Mosesdecoderコード解読の勘所
Mosesdecoderコード解読の勘所Mosesdecoderコード解読の勘所
Mosesdecoderコード解読の勘所
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
オープンソースソフトウェア検索サーバ Solr入門
オープンソースソフトウェア検索サーバ Solr入門オープンソースソフトウェア検索サーバ Solr入門
オープンソースソフトウェア検索サーバ Solr入門
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject Introspectionで
 
サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
SPDYの話
SPDYの話SPDYの話
SPDYの話
 

Andere mochten auch

Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1kmiyako
 
Current Selection 2010-02-14
Current Selection 2010-02-14Current Selection 2010-02-14
Current Selection 2010-02-14kmiyako
 
Paint Tool 2013-05-14
Paint Tool 2013-05-14Paint Tool 2013-05-14
Paint Tool 2013-05-14kmiyako
 
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03kmiyako
 
Japanese Collation 2010-03-03
Japanese Collation 2010-03-03Japanese Collation 2010-03-03
Japanese Collation 2010-03-03kmiyako
 
Picture 2013-05-28
Picture 2013-05-28Picture 2013-05-28
Picture 2013-05-28kmiyako
 
Uminohi 2013-07-14
Uminohi 2013-07-14Uminohi 2013-07-14
Uminohi 2013-07-14kmiyako
 
Mirroring
MirroringMirroring
Mirroringkmiyako
 
⾼解像度ディスプレイ
⾼解像度ディスプレイ⾼解像度ディスプレイ
⾼解像度ディスプレイkmiyako
 
Data conversion
Data conversionData conversion
Data conversionkmiyako
 
Lep 2013-07-23
Lep 2013-07-23Lep 2013-07-23
Lep 2013-07-23kmiyako
 
Web Basics 2013-01-10
Web Basics 2013-01-10Web Basics 2013-01-10
Web Basics 2013-01-10kmiyako
 
XSLT 2010-03-03
XSLT 2010-03-03XSLT 2010-03-03
XSLT 2010-03-03kmiyako
 
正しいクエリの書き⽅
正しいクエリの書き⽅正しいクエリの書き⽅
正しいクエリの書き⽅kmiyako
 
バックアップと復元
バックアップと復元バックアップと復元
バックアップと復元kmiyako
 
Wakanda 2013-07-02
Wakanda 2013-07-02Wakanda 2013-07-02
Wakanda 2013-07-02kmiyako
 
Inside Multi-Threading
Inside Multi-ThreadingInside Multi-Threading
Inside Multi-Threadingkmiyako
 
2012 keynote-0
2012 keynote-02012 keynote-0
2012 keynote-0kmiyako
 

Andere mochten auch (19)

Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1
 
Current Selection 2010-02-14
Current Selection 2010-02-14Current Selection 2010-02-14
Current Selection 2010-02-14
 
Paint Tool 2013-05-14
Paint Tool 2013-05-14Paint Tool 2013-05-14
Paint Tool 2013-05-14
 
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
 
Japanese Collation 2010-03-03
Japanese Collation 2010-03-03Japanese Collation 2010-03-03
Japanese Collation 2010-03-03
 
4D Tags
4D Tags4D Tags
4D Tags
 
Picture 2013-05-28
Picture 2013-05-28Picture 2013-05-28
Picture 2013-05-28
 
Uminohi 2013-07-14
Uminohi 2013-07-14Uminohi 2013-07-14
Uminohi 2013-07-14
 
Mirroring
MirroringMirroring
Mirroring
 
⾼解像度ディスプレイ
⾼解像度ディスプレイ⾼解像度ディスプレイ
⾼解像度ディスプレイ
 
Data conversion
Data conversionData conversion
Data conversion
 
Lep 2013-07-23
Lep 2013-07-23Lep 2013-07-23
Lep 2013-07-23
 
Web Basics 2013-01-10
Web Basics 2013-01-10Web Basics 2013-01-10
Web Basics 2013-01-10
 
XSLT 2010-03-03
XSLT 2010-03-03XSLT 2010-03-03
XSLT 2010-03-03
 
正しいクエリの書き⽅
正しいクエリの書き⽅正しいクエリの書き⽅
正しいクエリの書き⽅
 
バックアップと復元
バックアップと復元バックアップと復元
バックアップと復元
 
Wakanda 2013-07-02
Wakanda 2013-07-02Wakanda 2013-07-02
Wakanda 2013-07-02
 
Inside Multi-Threading
Inside Multi-ThreadingInside Multi-Threading
Inside Multi-Threading
 
2012 keynote-0
2012 keynote-02012 keynote-0
2012 keynote-0
 

Ähnlich wie Optimisation 2013-07-02

入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章Kazufumi Ohkawa
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77nkt77
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するaktsk
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77nkt77
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索Akio Ishida
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)fisuda
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践LINE Corporation
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -Hayato Mizuno
 
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)Shotaro Sano
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)fisuda
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container ServicesAmazon Web Services Japan
 

Ähnlich wie Optimisation 2013-07-02 (20)

入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.3.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.5.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.6.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.4.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.7.0対応)
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)
Microsoft Malware Classification Challenge 上位手法の紹介 (in Kaggle Study Meetup)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services20180220 AWS Black Belt Online Seminar - Amazon Container Services
20180220 AWS Black Belt Online Seminar - Amazon Container Services
 

Mehr von kmiyako

Build an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4DBuild an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4Dkmiyako
 
4D WORLD TOUR 2017
4D WORLD TOUR 20174D WORLD TOUR 2017
4D WORLD TOUR 2017kmiyako
 
Objects Fields
Objects FieldsObjects Fields
Objects Fieldskmiyako
 
Code Optimisation
Code OptimisationCode Optimisation
Code Optimisationkmiyako
 
Auto Update
Auto UpdateAuto Update
Auto Updatekmiyako
 
Classic Query Editor
Classic Query EditorClassic Query Editor
Classic Query Editorkmiyako
 
Web area-phone-home
Web area-phone-homeWeb area-phone-home
Web area-phone-homekmiyako
 
MONET研究会 #14
MONET研究会 #14MONET研究会 #14
MONET研究会 #14kmiyako
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~kmiyako
 
Journaling slides
Journaling slidesJournaling slides
Journaling slideskmiyako
 
Unicode-v11-5
Unicode-v11-5Unicode-v11-5
Unicode-v11-5kmiyako
 
Unicode-v11-0
Unicode-v11-0Unicode-v11-0
Unicode-v11-0kmiyako
 
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナーkmiyako
 
4D Write Pro
4D Write Pro4D Write Pro
4D Write Prokmiyako
 
⽇本語全⽂検索
⽇本語全⽂検索⽇本語全⽂検索
⽇本語全⽂検索kmiyako
 
ラベルエディター
ラベルエディターラベルエディター
ラベルエディターkmiyako
 

Mehr von kmiyako (20)

Build an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4DBuild an iOS app with Ionic and 4D
Build an iOS app with Ionic and 4D
 
4D WORLD TOUR 2017
4D WORLD TOUR 20174D WORLD TOUR 2017
4D WORLD TOUR 2017
 
Leaflet
LeafletLeaflet
Leaflet
 
4D Tags
4D Tags4D Tags
4D Tags
 
Objects Fields
Objects FieldsObjects Fields
Objects Fields
 
Code Optimisation
Code OptimisationCode Optimisation
Code Optimisation
 
Auto Update
Auto UpdateAuto Update
Auto Update
 
Classic Query Editor
Classic Query EditorClassic Query Editor
Classic Query Editor
 
Web area-phone-home
Web area-phone-homeWeb area-phone-home
Web area-phone-home
 
MONET研究会 #14
MONET研究会 #14MONET研究会 #14
MONET研究会 #14
 
4d
4d4d
4d
 
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
初心者からプロフェッショナルまで~データベース開発ソフト4Dの魅力を徹底紹介~
 
Xslt
XsltXslt
Xslt
 
Journaling slides
Journaling slidesJournaling slides
Journaling slides
 
Unicode-v11-5
Unicode-v11-5Unicode-v11-5
Unicode-v11-5
 
Unicode-v11-0
Unicode-v11-0Unicode-v11-0
Unicode-v11-0
 
アップグレードセミナー
アップグレードセミナーアップグレードセミナー
アップグレードセミナー
 
4D Write Pro
4D Write Pro4D Write Pro
4D Write Pro
 
⽇本語全⽂検索
⽇本語全⽂検索⽇本語全⽂検索
⽇本語全⽂検索
 
ラベルエディター
ラベルエディターラベルエディター
ラベルエディター
 

Optimisation 2013-07-02