最適化
最適化
最適化
目的
最適化
目的
アプリケーション実行速度を向上させること
最適化
目的
アプリケーション実行速度を向上させること
最適化
目的
アプリケーション実行速度を向上させること
最適なコーディング
•ランゲージの特性
•コンパイル
最適なハードウェア
•メモリ
•記憶装置
最適なインデックス設定
•プライマリーキー 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度目のクエ...
ハードウェア
64ビット版サーバー
http://www.4d.com/jp/support/resources.html
32bits 64bits
キャッシュ上限 2.3GB unlimited
1度目のクエリ 69s 52s
2度目のクエ...
ハードウェア
64ビット版サーバー
http://www.4d.com/jp/support/resources.html
32bits 64bits
キャッシュ上限 2.3GB unlimited
ソート平均値 839s 108s
インデック...
ハードウェア
ハードウェア
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...
C_POINTER($1)
C_REAL($0)
C_LONGINT($i)
ARRAY LONGINT($arrCopy)
COPY ARRAY ($1->;$arrCopy)
For ($i;1;Size of array($arrCopy...
C_POINTER($1)
C_REAL($0)
C_LONGINT($i)
ARRAY LONGINT($arrCopy)
COPY ARRAY ($1->;$arrCopy)
For ($i;1;Size of array($arrCopy...
配列の合計
ランゲージの特性
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 ($...
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
C_LONGINT($i;$L_max)
$L_max:=Length($1)
If ($L_max=Length($2))
$0:=True
For ($...
ランゲージの特性
文字列の比較
コンパイル版
インタプリタ版
ランゲージの特性
文字列の比較
$L_max:=Length($1)
If ($L_max=Length($2))
$0:=True
TEXT TO BLOB ($1;$blob1;UTF8 text without length)
TEXT ...
ランゲージの特性
文字列の比較
$L_max:=Length($1)
If ($L_max=Length($2))
$0:=True
TEXT TO BLOB ($1;$blob1;UTF8 text without length)
TEXT ...
ランゲージの特性
文字列の比較
$L_max:=Length($1)
If ($L_max=Length($2))
$0:=True
TEXT TO BLOB ($1;$blob1;UTF8 text without length)
TEXT ...
ランゲージの特性
文字列の比較
$L_max:=Length($1)
If ($L_max=Length($2))
$0:=True
TEXT TO BLOB ($1;$blob1;UTF8 text without length)
TEXT ...
ランゲージの特性
文字列の比較
コンパイル版
インタプリタ版
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End ca...
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End ca...
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End ca...
ランゲージの特性
文字列の比較
C_TEXT($1;$2)
C_BOOLEAN($0)
Case of
: (Length($1)#Length($2))
: (Position($1;$2;*)#1)
Else
$0:=True
End ca...
ランゲージの特性
文字列の比較
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:=$T_final
Repeat
$L_pos:=Position("r";$T_buffer)
If ($L_pos>0)
$T_line:=Substring($T_buffer;1;$L_pos-1)...
ランゲージの特性
$L_offsetMax:=Length($T_final)
$L_offset:=1
Repeat
$L_pos:=Position("r";$T_final;$L_offset)
If ($L_pos>0)
$T_line...
ランゲージの特性
文字列の抽出
$L_offsetMax:=Length($T_final)
$L_offset:=1
Repeat
$L_pos:=Position("r";$T_final;$L_offset)
If ($L_pos>0)
...
ランゲージの特性
文字列の抽出
$L_offsetMax:=Length($T_final)
$L_offset:=1
Repeat
$L_pos:=Position("r";$T_final;$L_offset)
If ($L_pos>0)
...
ランゲージの特性
文字列の抽出
$L_offsetMax:=Length($T_final)
$L_offset:=1
Repeat
$L_pos:=Position("r";$T_final;$L_offset)
If ($L_pos>0)
...
ランゲージの特性
文字列の抽出
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:...
ランゲージの特性
$str:=$totalLength*"-"
$pos:=1
For ($i;1;Size of array($theArr))
$str:=Change string($str;$theArr{$i};$pos)
$pos:...
ランゲージの特性
文字列の連結
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
...
ランゲージの特性
文字列の連結
ランゲージの特性
inArray = PA_GetVariableParameter( params, 1);
count = PA_GetArrayNbElements(inArray);
totalLength = 0;
for(i = 1...
ランゲージの特性
文字列の連結
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...
新規プロセス
C_BOOLEAN($1;$B_doIt)
If (Count parameters>0)
$B_doIt:=$1
End if
If (Not($B_doIt))
$L_ignore:=New process(Current method n...
新規プロセス
C_BOOLEAN($1;$B_doIt)
If (Count parameters>0)
$B_doIt:=$1
End if
If (Not($B_doIt))
$L_ignore:=New process(Current m...
新規プロセス
C_BOOLEAN($1;$B_doIt)
If (Count parameters>0)
$B_doIt:=$1
End if
If (Not($B_doIt))
$L_ignore:=New process(Current m...
新規プロセス
C_BOOLEAN($1;$B_doIt)
If (Count parameters>0)
$B_doIt:=$1
End if
If (Not($B_doIt))
$L_ignore:=New process(Current m...
新規プロセス
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
...
コンパイル
コンパイル
C_BOOLEAN($0)
C_LONGINT($L_platform)
PLATFORM PROPERTIES ($L_platform)
$0:=($L_platform=Windows)
C_BOOLEAN($0)
C_LON...
コンパイル
C_BOOLEAN($0)
C_LONGINT($L_platform)
PLATFORM PROPERTIES ($L_platform)
$0:=($L_platform=Windows)
C_BOOLEAN($0)
C_LON...
コンパイル
C_BOOLEAN($0)
C_LONGINT($L_platform)
PLATFORM PROPERTIES ($L_platform)
$0:=($L_platform=Windows)
C_BOOLEAN($0)
C_LON...
コンパイル
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度目のリクエストで済んだことを繰り返している
無駄: 全フィールドのデータを転送して...
 無駄なリクエスト
QUERY ([Pizzas];[Pizzas]WithOnions=True)
FIRST RECORD ([Pizzas])
無駄: 1度目のリクエストで済んだことを繰り返している
無駄: 全フィールドのデータを転送して...
 無駄なリクエスト
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
QUERY ([Invoices];...)
CREATE SET ([Customers];"CustInvoices")
FIRST RECORD ([Invoices])
While (Not(End selectio...
 無駄なリクエスト
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
* 実際にはインデックス...
インデックス
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...
インデックス
Cluster
low-selectivity
低選択性データに適している
DISTINCT VALUESは圧倒的に速い
インデックス
Cluster
low-selectivity
high-selectivity
B-Tree
高選択性データに適している(例: プライマリーキー)
並び替えはClusterよりも速い
低選択性データに適している
DISTINCT...
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
QUER...
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レコード...
最適化
Optimisation 2013-07-02
Optimisation 2013-07-02
Upcoming SlideShare
Loading in …5
×

Optimisation 2013-07-02

312 views
251 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
312
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Optimisation 2013-07-02

  1. 1. 最適化
  2. 2. 最適化
  3. 3. 最適化 目的
  4. 4. 最適化 目的 アプリケーション実行速度を向上させること
  5. 5. 最適化 目的 アプリケーション実行速度を向上させること
  6. 6. 最適化 目的 アプリケーション実行速度を向上させること 最適なコーディング •ランゲージの特性 •コンパイル 最適なハードウェア •メモリ •記憶装置 最適なインデックス設定 •プライマリーキー or 低選択性 •クエリ重視 or 並び替え
  7. 7. ハードウェア
  8. 8. ハードウェア 64ビット版サーバー
  9. 9. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html
  10. 10. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html 32bits 64bits キャッシュ上限 2.3GB unlimited 1度目のクエリ 69s 52s 2度目のクエリ 37s 1.4s
  11. 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. 12. ハードウェア 64ビット版サーバー http://www.4d.com/jp/support/resources.html 32bits 64bits キャッシュ上限 2.3GB unlimited ソート平均値 839s 108s インデックス無 7,500,000レコード数: 3.2GBデータファイル:
  13. 13. ハードウェア
  14. 14. ハードウェア SSD (Solid State Drive)
  15. 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. 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. 17. ランゲージの特性
  18. 18. ランゲージの特性 配列の合計
  19. 19. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for ランゲージの特性 配列の合計
  20. 20. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for 配列の合計 ランゲージの特性
  21. 21. C_POINTER($1) C_REAL($0) C_LONGINT($i) For($i;1;Size of array($1->)) $0:=$0+$1->{$i} End for 配列の要素を逐一ポインタで解決して加算 配列の合計 ランゲージの特性
  22. 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. 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. 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. 25. 配列の合計 ランゲージの特性 C_POINTER($1) C_REAL($0) $0:=Sum($1->)
  26. 26. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性
  27. 27. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性 配列に統計関数を使用して加算
  28. 28. C_POINTER($1) C_REAL($0) $0:=Sum($1->) 配列の合計 ランゲージの特性
  29. 29. 配列の合計 ランゲージの特性 COPY $1->{$i} インタプリタ版
  30. 30. 配列の合計 ランゲージの特性 COPY $1->{$i} Sum インタプリタ版
  31. 31. 配列の合計 ランゲージの特性 COPY $1->{$i} コンパイル版
  32. 32. 配列の合計 ランゲージの特性 COPY $1->{$i} Sum コンパイル版
  33. 33. ランゲージの特性
  34. 34. ランゲージの特性 文字列の比較
  35. 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. 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. 37. ランゲージの特性 文字列の比較 コンパイル版 インタプリタ版
  38. 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. 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. 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. 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. 42. ランゲージの特性 文字列の比較 コンパイル版 インタプリタ版
  43. 43. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  44. 44. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  45. 45. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case 文字コードに基づいて文字列の位置を判定
  46. 46. ランゲージの特性 文字列の比較 C_TEXT($1;$2) C_BOOLEAN($0) Case of : (Length($1)#Length($2)) : (Position($1;$2;*)#1) Else $0:=True End case
  47. 47. ランゲージの特性 文字列の比較 Position 文字コード比較
  48. 48. ランゲージの特性
  49. 49. ランゲージの特性 文字列の抽出
  50. 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. 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. 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. 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. 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. 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. 56. ランゲージの特性 文字列の抽出
  57. 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. 58. ランゲージの特性
  59. 59. ランゲージの特性 文字列の連結
  60. 60. ランゲージの特性 $str:="" For ($i;1;Size of array($theArr)) $str:=$str+$theArr{$i} End for 文字列の連結
  61. 61. ランゲージの特性 $str:="" For ($i;1;Size of array($theArr)) $str:=$str+$theArr{$i} End for 文字列の連結
  62. 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. 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. 64. ランゲージの特性 文字列の連結
  65. 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. 66. ランゲージの特性 文字列の連結
  67. 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. 68. ランゲージの特性 文字列の連結
  69. 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. 70. 新規プロセス
  71. 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. 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. 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. 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. 75. 新規プロセス
  76. 76. 0 27,500 55,000 82,500 110,000 Milliseconds 1,327 1,316 100,195 1,433v12 v13 ローカル グローバル 1,000プロセス数: 新規プロセス
  77. 77. コンパイル
  78. 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. 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. 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. 81. コンパイル
  82. 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. 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. 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. 85. コンパイル
  86. 86. 0 1,000 2,000 3,000 4,000 Milliseconds 3,914 101 1,433 3 インタプリタ版 コンパイル版 関数コール インタープロセス 100,000コール数: コンパイル
  87. 87. コンパイル
  88. 88. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator
  89. 89. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator
  90. 90. コンパイル C_TEXT($0) If (Env_B_IsWindows) $0:="¥¥" Else $0:=":" End if C_TEXT($0) $0:=Folder separator Bad Good!
  91. 91. コンパイル
  92. 92. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  93. 93. コンパイル For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  94. 94. コンパイル デフォルトの型指定: For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  95. 95. コンパイル デフォルトの型指定: C_REAL C_LONGINT For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for
  96. 96. コンパイル デフォルトの型指定: C_REAL C_LONGINT For ($i;1;$max) $aText:=$aText+$anArray{$i}+"t" End for Good!Bad
  97. 97. コンパイル
  98. 98. 0 50 100 150 200 Milliseconds 163 24 C_REAL C_LONGINT コンパイル 10,000,000ループ数:
  99. 99. コンパイル
  100. 100. コンパイル If ($aString="") If (Length($aString)=0)
  101. 101. コンパイル If ($aString="") If (Length($aString)=0)
  102. 102. コンパイル Good! If ($aString="") If (Length($aString)=0) Bad
  103. 103.  無駄なリクエスト
  104. 104.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas])
  105. 105.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas])
  106. 106.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している
  107. 107.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している 無駄: 全フィールドのデータを転送している(BLOBも)
  108. 108.  無駄なリクエスト QUERY ([Pizzas];[Pizzas]WithOnions=True) FIRST RECORD ([Pizzas]) 無駄: 1度目のリクエストで済んだことを繰り返している 無駄: 全フィールドのデータを転送している(BLOBも) バグ: 2度目のロードでレコードがロックされる可能性
  109. 109.  無駄なリクエスト
  110. 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. 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. 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. 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. 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. 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. 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. 117.  無駄なリクエスト QUERY ([Invoices];...) RELATE ONE SELECTION ([Invoices];[Customers])
  118. 118. インデックス
  119. 119. インデックス B-Tree Cluster
  120. 120. インデックス B-Tree Cluster インデックスキー: 値が該当するレコード
  121. 121. インデックス B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  122. 122. インデックス B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  123. 123. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 B-Tree Cluster インデックスキー: 値が該当するレコードのビットマップ インデックスキー: 値が該当するレコード
  124. 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. 125. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 B-Tree インデックスキー: 値が該当するレコード id: 1Blue Red Blue Blue Blue Red Red
  126. 126. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red
  127. 127. インデックス id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red
  128. 128. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1
  129. 129. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1
  130. 130. インデックス Cluster インデックスキー: 値が該当するレコードのビットマップ Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 * 実際にはインデックスページ(ビットテーブル or 圧縮)で管理されている
  131. 131. インデックス Cluster 低選択性データに適している Blue Red 0101110 1010001 id: 0 id: 3 id: 2 id: 4 id: 5 id: 6 id: 1 low-selectivity
  132. 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. 133. インデックス Cluster low-selectivity 低選択性データに適している DISTINCT VALUESは圧倒的に速い
  134. 134. インデックス Cluster low-selectivity high-selectivity B-Tree 高選択性データに適している(例: プライマリーキー) 並び替えはClusterよりも速い 低選択性データに適している DISTINCT VALUESは圧倒的に速い
  135. 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. 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. 137. 最適化

×