4D v11 SQL  in Depth #1
4D v11 SQL    in Depth #1• アーキテクチャー / スケーラビリティ
用語の定義        Tokyo/2010-03-03/04
用語の定義•   コオペラティブ: 他のプロセス(タスク,スレッ    ド,...)に譲るCPU時間を自分で決めるプロセス                                Tokyo/2010-03-03/04
用語の定義•   コオペラティブ: 他のプロセス(タスク,スレッ    ド,...)に譲るCPU時間を自分で決めるプロセス    ‣ 独占できる = ブロックできる(例 : Mac OS 9)                          ...
用語の定義•   コオペラティブ: 他のプロセス(タスク,スレッ    ド,...)に譲るCPU時間を自分で決めるプロセス    ‣ 独占できる = ブロックできる(例 : Mac OS 9)    ‣ ひとつのアプリケーションのコオペラティブ...
用語の定義•   コオペラティブ: 他のプロセス(タスク,スレッ    ド,...)に譲るCPU時間を自分で決めるプロセス    ‣ 独占できる = ブロックできる(例 : Mac OS 9)    ‣ ひとつのアプリケーションのコオペラティブ...
用語の定義•   コオペラティブ: 他のプロセス(タスク,スレッ    ド,...)に譲るCPU時間を自分で決めるプロセス    ‣ 独占できる = ブロックできる(例 : Mac OS 9)    ‣ ひとつのアプリケーションのコオペラティブ...
三対のツイン                         4         Tokyo/2010-03-03/04
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
三対のツイン•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ    ンプロセスと対話している:    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理      (query, order b...
Tokyo/2010-03-03/04
ユーザー	 1              プロセス	 U1-1  Req1...             R2…⋯   R3…⋯  QUERY	 (Table1)サーバー                                     ...
ユーザー	 1              プロセス	 U1-1  Req1...             R2…⋯     R3…⋯  QUERY	 (Table1)サーバー                                   ...
ユーザー	 1                                 ユーザー	 2                                                 ユーザー	 3              プロセス	...
ユーザー	 1                                 ユーザー	 2                                                 ユーザー	 3              プロセス	...
ユーザー	 1                                 ユーザー	 2                                                 ユーザー	 3              プロセス	...
ユーザー	 1                                 ユーザー	 2                                                 ユーザー	 3              プロセス	...
ユーザー	 1                                 ユーザー	 2                                             ユーザー	 3              プロセス	 U1-...
ユーザー	 1                                 ユーザー	 2                                             ユーザー	 3              プロセス	 U1-...
ユーザー	 1                             ユーザー	 2                                                ユーザー	 3              プロセス	 U1-1...
ユーザー	 1                             ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1   ...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
ユーザー	 1                              ユーザー	 2                                                ユーザー	 3              プロセス	 U1-...
ユーザー	 1                              ユーザー	 2                                                ユーザー	 3              プロセス	 U1-...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
コオペラティブ            プリエンプティブスケジューラー  コア	 1   コア	 2   コア	 3   コア	 4           オペレーティングシステム                                  ...
コオペラティブ            プリエンプティブスケジューラー  コア	 1   コア	 2   コア	 3    コア	 4           オペレーティングシステム                              伸張性...
コオペラティブ            プリエンプティブ   スケジューラー      コア	 1   コア	 2   コア	 3    コア	 4               オペレーティングシステムボトルネック                ...
10 クライアント, QUERY または ORDER BY 同時に実行   ボトルネック                                 Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ                                    Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行                                 Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行                                 Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行                                 Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ                                    Tokyo/2010-03-03/04
10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ   v11: プリエンプティブ...   ...そしてスケーラブル                                      ...
いろいろなサーバー            Tokyo/2010-03-03/04
いろいろなサーバー アプリケーションサーバー            コオペラティブ    Web /SOAP            コオペラティブ   SQL サーバー           プリエンプティブ   DB4D サーバー       ...
v11-v12                       デスクトップ            クライアント-サーバー                                         クライアント                ...
v11-v12                       デスクトップ            クライアント-サーバー                                         クライアント                ...
ユーザー	 1                              ユーザー	 2                                             ユーザー	 3              プロセス	 U1-1  ...
Tokyo/2010-03-03/04
ボトルネックランゲージ トリガ メソッド «サーバーで実行» ストアドプロシージャー Web サーバー/SOAP4D自体:  サーバーのユーザーインタフェース  コネクションハンドラー  ある種の外部SQLリクエスト              ...
ボトルネックランゲージ トリガ メソッド «サーバーで実行» ストアドプロシージャー Web サーバー/SOAP                  Tokyo/2010-03-03/04
•   サーバーが素早く終えられるように                  •   トリガ:ボトルネック                       ‣ 絶対に必要な場合だけランゲージ トリガ                   ‣ 汎用的なコ...
•   サーバーが素早く終えられるように                     •   トリガ:ボトルネック                          ‣ 絶対に必要な場合だけランゲージ トリガ                    ...
4D v11 SQL    in Depth #1• アーキテクチャー / スケーラビリティ
4D v11 SQL      in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D
SQL vs 4D - パフォーマンス                      Clichy/2010-02-03
SQL vs 4D - パフォーマンス 4D, 通常                          SQL  QUERY( . . .)   SELECT   ...   FROM   ...   WHERE   ...          ...
SQL vs 4D - パフォーマンス 4D, 通常                              SQL  QUERY( . . .)       SELECT   ...   FROM   ...   WHERE   ...  ...
SQL vs 4D - パフォーマンス 4D, 通常                                SQL  QUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ....
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化                                Clichy/2010-02-03
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化    ‣ QUERY      - 検索,セレクションの作成,先頭レコードのロード      - ここまでをすべてひとつのコマンドで       ...
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化    ‣ QUERY      - 検索,セレクションの作成,先頭レコードのロード      - ここまでをすべてひとつのコマンドで•   SQL...
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化    ‣ QUERY      - 検索,セレクションの作成,先頭レコードのロード      - ここまでをすべてひとつのコマンドで•   SQL...
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化    ‣ QUERY      - 検索,セレクションの作成,先頭レコードのロード      - ここまでをすべてひとつのコマンドで•   SQL...
SQL vs 4D - パフォーマンス•   4Dは不可分, ワンアクションに対して高度に最適化    ‣ QUERY      - 検索,セレクションの作成,先頭レコードのロード      - ここまでをすべてひとつのコマンドで•   SQL...
4D, 通常                               SQLQUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ...                インタプリ...
4D, 通常                               SQLQUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ...                     ...
SQL vs 4D - パフォーマンス•   v11: SQL は 5-10 倍遅い場合がある                               Clichy/2010-02-03
SQL vs 4D - パフォーマンス•   v11: SQL は 5-10 倍遅い場合がある    ‣ しかしこれは飽くまで平均, あまり捕われないように    ‣ 場合によっては, SQLのほうが速いことも                 ...
SQL vs 4D - パフォーマンス•   v11: SQL は 5-10 倍遅い場合がある    ‣ しかしこれは飽くまで平均, あまり捕われないように    ‣ 場合によっては, SQLのほうが速いことも      - 典型例は計算を要す...
SQL vs 4D - パフォーマンス•   v11: SQL は 5-10 倍遅い場合がある    ‣ しかしこれは飽くまで平均, あまり捕われないように    ‣ 場合によっては, SQLのほうが速いことも      - 典型例は計算を要す...
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?    ‣ そのほうが速いと思える根拠があるとき                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?    ‣ そのほうが速いと思える根拠があるとき    ‣ SQLで記述したほうが楽なとき:                           Clichy...
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?    ‣ そのほうが速いと思える根拠があるとき    ‣ SQLで記述したほうが楽なとき:                           Clichy...
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?    ‣ そのほうが速いと思える根拠があるとき    ‣ SQLで記述したほうが楽(美しい ?)なとき    ‣ 他のDB(4Dあるいはそれ以外)に接続する...
SQL vs 4D - パフォーマンス•   どのような場合にSQLを使用するべき ?    ‣ そのほうが速いと思える根拠があるとき    ‣ SQLで記述したほうが楽(美しい ?)なとき    ‣ 他のDB(4Dあるいはそれ以外)に接続する...
SQL-92•   DBメーカーの数だけ仕様が存在するというのが実情:    ‣ OracleのコードがすべてMySQLで動くわけではない    ‣ MySQLのコードがすべてPostgreSQLで動くわけではない               ...
SQL-92•   DBメーカーの数だけ仕様が存在するというのが実情:    ‣ OracleのコードがすべてMySQLで動くわけではない    ‣ MySQLのコードがすべてPostgreSQLで動くわけではない      ➡ Oracle,...
4D v11 SQL      in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D
4D v11 SQL      in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D• キャッシュ
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)                               Tokyo/2010-03-03/04
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)    ‣ 例: レコードをロードする      - 初回はディスクから読み込み: アクセスはミリ秒の世界                                    ...
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)    ‣ 例: レコードをロードする      - 初回はディスクから読み込み: アクセスはミリ秒の世界      - 以降はキャッシュから: アクセスはナノ秒の世界     ...
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)    ‣ 例: レコードをロードする      - 初回はディスクから読み込み: アクセスはミリ秒の世界      - 以降はキャッシュから: アクセスはナノ秒の世界     ...
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)    ‣ 例: レコードをロードする      - 初回はディスクから読み込み: アクセスはミリ秒の世界      - 以降はキャッシュから: アクセスはナノ秒の世界     ...
キャッシュ•   主要な目的は速度アップ(4D: データアクセス)    ‣ 例: レコードをロードする      - 初回はディスクから読み込み: アクセスはミリ秒の世界      - 以降はキャッシュから: アクセスはナノ秒の世界•   キ...
キャッシュ        Tokyo/2010-03-03/04
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)                                 Tokyo/2010-03-03/04
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため                                 Tokyo/2010-03-03/04
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは       複数のアドレステ...
キャッシュ•   ほとんどは小さなオブジェクト: (<= 64 KB)    ‣ ファミリーごとにリンクしているため        - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは         複数のア...
キャッシュ        Tokyo/2010-03-03/04
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される                             Tokyo/2010-03-03/04
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される                             Tokyo/2010-03-03/04
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される                             Tokyo/2010-03-03/04
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される                             Tokyo/2010-03-03/04
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される•   FLUSH BUFFERS                             Tokyo/201...
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される•   FLUSH BUFFERS    •   «汚れた»オブジェクトをディスクの保存すること       ...
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される•   FLUSH BUFFERS    •   «汚れた»オブジェクトをディスクの保存すること    •  ...
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される•   FLUSH BUFFERS    •   «汚れた»オブジェクトをディスクの保存すること    •  ...
キャッシュ•   スタートアップで確保される•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配    置が繰り返される•   FLUSH BUFFERS    •   «汚れた»オブジェクトをディスクの保存すること    •  ...
キャッシュキャッシュがメモリを必要とするときは ?                       Tokyo/2010-03-03/04
キャッシュ    キャッシュがメモリを必要とするときは ?•   状況:      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...      - 充分なスペースがない                     ...
キャッシュ    キャッシュがメモリを必要とするときは ?•   状況:      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...      - 充分なスペースがない•   行動:          Repe...
キャッシュ    キャッシュがメモリを必要とするときは ?•   状況:      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...      - 充分なスペースがない•   行動:          Repe...
キャッシュ    キャッシュがメモリを必要とするときは ?•   状況:      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...      - 充分なスペースがない•   行動:          Repe...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeatキャッシュの 10%を パージオブジェクトを アロケートUntil 充分のスペース                            Tokyo/2010-03-03/04
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat             確保したキャッシュ合計の10%キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat                 確保したキャッシュ合計の10%キャッシュの 10%を パージ        キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェク...
キャッシュ     キャッシュがメモリを必要とするときは ?Repeat                 確保したキャッシュ合計の10%キャッシュの 10%を パージ        キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェク...
キャッシュキャッシュがメモリを必要とするときは ?     汚れていないオブジェクトをパージ                        Tokyo/2010-03-03/04
キャッシュ  キャッシュがメモリを必要とするときは ?        汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ                           Tokyo/2010-03-03/04
キャッシュ  キャッシュがメモリを必要とするときは ?        汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ  ➡ キャッシュが先にフラッシュするオブジェクトはい   つも一緒とは限らない       ...
キャッシュ  キャッシュがメモリを必要とするときは ?        汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ  ➡ キャッシュが先にフラッシュするオブジェクトはい   つも一緒とは限らない• ディスクで...
キャッシュキャッシュがメモリを必要とするときは ?     汚れていないオブジェクトをパージ                        Tokyo/2010-03-03/04
キャッシュキャッシュがメモリを必要とするときは ?     汚れていないオブジェクトをパージ   v11は2004よりも劇的に速くなった                         Tokyo/2010-03-03/04
キャッシュ     キャッシュがメモリを必要とするときは ?            汚れていないオブジェクトをパージ         v11は2004よりも劇的に速くなった•   2004: ハンドル(Mac)と連結リスト     ➡ オブジェ...
キャッシュ     キャッシュがメモリを必要とするときは ?            汚れていないオブジェクトをパージ         v11は2004よりも劇的に速くなった•   2004: ハンドル(Mac)と連結リスト     ➡ オブジェ...
キャッシュ     キャッシュがメモリを必要とするときは ?             汚れていないオブジェクトをパージ         v11は2004よりも劇的に速くなった•   2004: ハンドル(Mac)と連結リスト     ➡ オブジ...
キャッシュ                最大サイズは ?•   4D 32 ビット                           Tokyo/2010-03-03/04
キャッシュ                最大サイズは ?•   4D 32 ビット    ➡ 最大 2.5 GB    ➡ OS(32/64)に関係なく    ‣ ハードコードされた値    ‣ ユーザーが > 2.5 を設定した場合は下方修...
キャッシュ                最大サイズは ?•   4D 32 ビット    ➡ 最大 2.5 GB    ➡ OS(32/64)に関係なく    ‣ ハードコードされた値    ‣ ユーザーが > 2.5 を設定した場合は下方修...
キャッシュ                最大サイズは ?•   4D 32 ビット    ➡ 最大 2.5 GB    ➡ OS(32/64)に関係なく    ‣ ハードコードされた値    ‣ ユーザーが > 2.5 を設定した場合は下方修...
4D v11 SQL  in Depth #2
4D v11 SQL    in Depth #2• データベースコンテキスト(トリガ, ...)
ユーザー	 1           データベースコンテキスト              プロセス	 U1-1 Req1...                 R2…⋯   R3 ORDER	 BY	 (Table1)              ...
データベースコンテキスト          プロセス	 U1-1Req1...           R2…⋯      R3                                 コオペラティブ                    ...
データベースコンテキスト                                     コオペラティブ                              プロセス	 U1-1          プロセス	 U1-1Req1.....
データベースコンテキスト                                     コオペラティブ                              プロセス	 U1-1          プロセス	 U1-1Req1.....
データベースコンテキスト                                                  コオペラティブ                                           プロセス	 U1-1...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト                                                           コオペラティブ                                            ...
データベースコンテキスト•   例: リレートセレクションのsumをトリガで計算    ‣ クライアントサイド:         . . .         QUERY([OrderLines];[OrderLines]_OrderID=[Or...
データベースコンテキスト•   例: リレートセレクションのsumをトリガで計算    ‣ クライアントサイド:         . . .         QUERY([OrderLines];[OrderLines]_OrderID=[Or...
トリガ• (特性と目的を考慮する)                 Tokyo/2010-03-03/04
トリガ• (特性と目的を考慮する)                              ≠ 2004• クライアントサーバー: :   ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)   ‣ クライアントと同期が取...
トリガ • (特性と目的を考慮する)                                ≠ 2004 • クライアントサーバー: :    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)    ‣ クライアン...
トリガ • (特性と目的を考慮する)                                ≠ 2004 • クライアントサーバー: :    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)    ‣ クライアン...
トリガ • (特性と目的を考慮する)                                ≠ 2004 • クライアントサーバー: :    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)    ‣ クライアン...
トリガ • (特性と目的を考慮する)                                ≠ 2004 • クライアントサーバー: :    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)    ‣ クライアン...
トリガ • (特性と目的を考慮する)                                ≠ 2004 • クライアントサーバー: :    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)    ‣ クライアン...
4D v11 SQL    in Depth #2• データベースコンテキスト(トリガ, ...)
4D v11 SQL    in Depth #2• データベースコンテキスト(トリガ, ...)• スケジューラーを理解する
スケジューラー•   スケジューラーの目的 ?•   なぜv11になってもスケジューラーが必要なのか ?                                Tokyo/2010-03-03/04
スケジューラー•   スケジューラーの目的 ?•   なぜv11になってもスケジューラーが必要なのか ?    ‣ 4Dランゲージはスレッドセーフではないから                                Tokyo/2010-...
スケジューラー•   スケジューラーの目的 ?•   なぜv11になってもスケジューラーが必要なのか ?    ‣ 4Dランゲージはスレッドセーフではないから•   スケジューラーの擬似コード:       For 1からプロセス数まで    ...
スケジューラーFor 1からプロセス数までIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)                            Tokyo/2010-03-03/04
For 1からプロセス数まで                    スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)   •   4Dは各プロセス1 tickの徹底を試みる    ...
For 1からプロセス数まで                    スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)   •   4Dは各プロセス1 tickの徹底を試みる   •...
For 1からプロセス数まで                    スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)   •   4Dは各プロセス1 tickの徹底を試みる   •...
For 1からプロセス数まで                    スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)   •   4Dは各プロセス1 tickの徹底を試みる   •...
For 1からプロセス数まで                    スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms)   •   4Dは各プロセス1 tickの徹底を試みる   •...
スケジューラー  実際には          Tokyo/2010-03-03/04
スケジューラー               実際には1.イベントをチェック(マウス, キーボード, ...) ➡ 適切な4Dプロセスに伝達する2.その後,アクティブプロセスに1 tickずつのループに突入     For 1からプロセス数まで ...
While 4D 実行中     // システムイベントを処理     Repeat       If チェック_間隔 が経過した           If 4Dはビジーである               タイムアウト = タイムアウト_最短 ...
While 4D 実行中     // システムイベントを処理     Repeat       If チェック_間隔 が経過した           If 4Dはビジーである               タイムアウト = タイムアウト_最短 ...
While 4D 実行中     // システムイベントを処理     Repeat       If チェック_間隔 が経過した           If 4Dはビジーである               タイムアウト = タイムアウト_最短 ...
While 4D 実行中     // システムイベントを処理     Repeat       If チェック_間隔 が経過した           If 4Dはビジーである               タイムアウト = タイムアウト_最短 ...
While 4D 実行中     // システムイベントを処理     Repeat       If チェック_間隔 が経過した           If 4Dはビジーである               タイムアウト = タイムアウト_最短 ...
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
In Depth 4D v11 SQL 2010-03-03
Upcoming SlideShare
Loading in …5
×

In Depth 4D v11 SQL 2010-03-03

407 views
325 views

Published on

2010年3月3日デベロッパ・カンファレンス資料。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
407
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

In Depth 4D v11 SQL 2010-03-03

  1. 1. 4D v11 SQL in Depth #1
  2. 2. 4D v11 SQL in Depth #1• アーキテクチャー / スケーラビリティ
  3. 3. 用語の定義 Tokyo/2010-03-03/04
  4. 4. 用語の定義• コオペラティブ: 他のプロセス(タスク,スレッ ド,...)に譲るCPU時間を自分で決めるプロセス Tokyo/2010-03-03/04
  5. 5. 用語の定義• コオペラティブ: 他のプロセス(タスク,スレッ ド,...)に譲るCPU時間を自分で決めるプロセス ‣ 独占できる = ブロックできる(例 : Mac OS 9) Tokyo/2010-03-03/04
  6. 6. 用語の定義• コオペラティブ: 他のプロセス(タスク,スレッ ド,...)に譲るCPU時間を自分で決めるプロセス ‣ 独占できる = ブロックできる(例 : Mac OS 9) ‣ ひとつのアプリケーションのコオペラティブスレ ッドは必ず同じコアで実行される Tokyo/2010-03-03/04
  7. 7. 用語の定義• コオペラティブ: 他のプロセス(タスク,スレッ ド,...)に譲るCPU時間を自分で決めるプロセス ‣ 独占できる = ブロックできる(例 : Mac OS 9) ‣ ひとつのアプリケーションのコオペラティブスレ ッドは必ず同じコアで実行される• プリエンプティブ: それぞれのプロセスに与えられ るCPU時間はOSが判断する Tokyo/2010-03-03/04
  8. 8. 用語の定義• コオペラティブ: 他のプロセス(タスク,スレッ ド,...)に譲るCPU時間を自分で決めるプロセス ‣ 独占できる = ブロックできる(例 : Mac OS 9) ‣ ひとつのアプリケーションのコオペラティブスレ ッドは必ず同じコアで実行される• プリエンプティブ: それぞれのプロセスに与えられ るCPU時間はOSが判断する• プリエンプティブな度合いが高いほど速い Tokyo/2010-03-03/04
  9. 9. 三対のツイン 4 Tokyo/2010-03-03/04
  10. 10. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...) 4 Tokyo/2010-03-03/04
  11. 11. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)• プリエンプティブな第三のスレッドと対話することもある 4 Tokyo/2010-03-03/04
  12. 12. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)• プリエンプティブな第三のスレッドと対話することもある ‣ これはBegin SQLが実行されると作成される 4 Tokyo/2010-03-03/04
  13. 13. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)• プリエンプティブな第三のスレッドと対話することもある ‣ これはBegin SQLが実行されると作成される• それぞれの対話は異なるネットワークポートを使用する: ... $date:=Current date(*) ... QUERY([City];[City]Name=”Paris”) ... Begin SQL ... 4 Tokyo/2010-03-03/04
  14. 14. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)• プリエンプティブな第三のスレッドと対話することもある ‣ これはBegin SQLが実行されると作成される• それぞれの対話は異なるネットワークポートを使用する: ... $date:=Current date(*) アプリケーションサーバーポート: 19813 ... QUERY([City];[City]Name=”Paris”) ... Begin SQL ... 4 Tokyo/2010-03-03/04
  15. 15. 三対のツイン• 4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ ンプロセスと対話している: ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理 (query, order by, create, ...) ‣ コオペラティブ スレッド: アプリケーションリクエストを処理 (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)• プリエンプティブな第三のスレッドと対話することもある ‣ これはBegin SQLが実行されると作成される• それぞれの対話は異なるネットワークポートを使用する: ... $date:=Current date(*) アプリケーションサーバーポート: 19813 ... QUERY([City];[City]Name=”Paris”) DB4D ポート: 19814 ... SQLサーバーポート: 19812 Begin SQL ... 4 Tokyo/2010-03-03/04
  16. 16. Tokyo/2010-03-03/04
  17. 17. ユーザー 1 プロセス U1-1 Req1... R2…⋯ R3…⋯ QUERY (Table1)サーバー 4D Server コオペラティブ プリエンプティブ コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  18. 18. ユーザー 1 プロセス U1-1 Req1... R2…⋯ R3…⋯ QUERY (Table1)サーバー 4D Server 19813 19814 コオペラティブ プリエンプティブ プロセス U1-1 プロセス U1-1 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  19. 19. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3…⋯ R1... R2.. R1.. R3 R1…⋯ R2 R1…⋯ R2 QUERY (Table1) Current date(*) サーバー 4D Server 19813 19814 コオペラティブ プリエンプティブ プロセス U1-1 プロセス U1-1 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  20. 20. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3…⋯ R1... R2.. R1.. R3 R1…⋯ R2 R1…⋯ R2 QUERY (Table1) Current date(*) サーバー 4D Server 19813 19814 コオペラティブ プリエンプティブ プロセス U1-1 プロセス U3-1 プロセス U1-1 プロセス U3-1 プロセス U2-1 プロセス U3-2 プロセス U2-1 プロセス U3-2 プロセス U2-2 プロセス U2-2 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  21. 21. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3…⋯ R1... R2.. R1.. R3 R1…⋯ R2 R1…⋯ R2 QUERY (Table1) Current date(*) サーバー 4D Server 19813 19814 コオペラティブ プリエンプティブ プロセス U1-1 プロセス U3-1 プロセス U1-1 プロセス U3-1 プロセス U2-1 プロセス U3-2 プロセス U2-1 プロセス U3-2 プロセス U2-2 プロセス U2-2 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  22. 22. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3…⋯ R1... R2.. R1.. R3 R1…⋯ R2 R1…⋯ R2 QUERY (Table1) Current date(*) サーバー 4D Server 19813 19814 コオペラティブ プリエンプティブ プロセス U1-1 プロセス U3-1 プロセス U1-1 プロセス U3-1 プロセス U2-1 プロセス U3-2 プロセス U2-1 プロセス U3-2 プロセス U2-2 プロセス U2-2 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  23. 23. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*)サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ プロセス U1-1 プロセス U3-1 プロセス U1-1 プロセス U3-1 プロセス U2-1 プロセス U3-2 プロセス U2-1 プロセス U3-2 プロセス U2-2 プロセス U2-2 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  24. 24. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*)サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ プロセス U1-1 プロセス U3-1 プロセス U1-1 プロセス U3-1 プロセス U2-1 プロセス U3-2 プロセス U2-1 プロセス U3-2 プロセス U2-2 プロセス U2-2 コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  25. 25. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R3 R1…⋯ R2 R1…⋯ R2 QUERY (Table1) Current date(*) サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  26. 26. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*)サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  27. 27. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  28. 28. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  29. 29. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  30. 30. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  31. 31. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 Process U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  32. 32. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 Process U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  33. 33. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 19812 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  34. 34. コオペラティブ プリエンプティブスケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  35. 35. コオペラティブ プリエンプティブスケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム 伸張性と速度 DBリクエストは同時に複数の クライアントが実行できる Tokyo/2010-03-03/04
  36. 36. コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステムボトルネック 伸張性と速度ランゲージ DBリクエストは同時に複数の トリガ クライアントが実行できる メソッド «サーバーで実行» ストアドプロシージャー Web サーバー/SOAP4D自体: サーバーのユーザーインタフェース コネクションハンドラー ある種の外部SQLリクエスト Tokyo/2010-03-03/04
  37. 37. 10 クライアント, QUERY または ORDER BY 同時に実行 ボトルネック Tokyo/2010-03-03/04
  38. 38. 10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ Tokyo/2010-03-03/04
  39. 39. 10 クライアント, QUERY または ORDER BY 同時に実行 Tokyo/2010-03-03/04
  40. 40. 10 クライアント, QUERY または ORDER BY 同時に実行 Tokyo/2010-03-03/04
  41. 41. 10 クライアント, QUERY または ORDER BY 同時に実行 Tokyo/2010-03-03/04
  42. 42. 10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ Tokyo/2010-03-03/04
  43. 43. 10 クライアント, QUERY または ORDER BY 同時に実行2004以前: コオペラティブ v11: プリエンプティブ... ...そしてスケーラブル Tokyo/2010-03-03/04
  44. 44. いろいろなサーバー Tokyo/2010-03-03/04
  45. 45. いろいろなサーバー アプリケーションサーバー コオペラティブ Web /SOAP コオペラティブ SQL サーバー プリエンプティブ DB4D サーバー プリエンプティブ Tokyo/2010-03-03/04
  46. 46. v11-v12 デスクトップ クライアント-サーバー クライアント コオペラティブ プリエンプティブ コオペラティブ プリエンプティブ インタフェース全般 ランゲージストアドプロシージャー HTTP サーバーアプリケーションサーバー インデックスビルダー フラッシュマネージャー SQL サーバーDB4D(データアクセス) Tokyo/2010-03-03/04
  47. 47. v11-v12 デスクトップ クライアント-サーバー クライアント コオペラティブ プリエンプティブ コオペラティブ プリエンプティブ インタフェース全般 ランゲージストアドプロシージャー HTTP サーバーアプリケーションサーバー インデックスビルダー フラッシュマネージャー SQL サーバーDB4D(データアクセス) Tokyo/2010-03-03/04
  48. 48. ユーザー 1 ユーザー 2 ユーザー 3 プロセス U1-1 プロセス U2-1 プロセス U2-2 プロセス U3-1 プロセス U3-2 Req1... R2…⋯ R3 R1... R2.. R1.. R2 R1…⋯ R2 R1.. R2 QUERY (Table1) Current date(*) Begin SQL... Begin SQL... Begin SQL... Begin SQL... Begin SQL...サーバー 19813 19814 4D Server コオペラティブ プリエンプティブ スケジューラー コア 1 コア 2 コア 3 コア 4 オペレーティングシステム Tokyo/2010-03-03/04
  49. 49. Tokyo/2010-03-03/04
  50. 50. ボトルネックランゲージ トリガ メソッド «サーバーで実行» ストアドプロシージャー Web サーバー/SOAP4D自体: サーバーのユーザーインタフェース コネクションハンドラー ある種の外部SQLリクエスト Tokyo/2010-03-03/04
  51. 51. ボトルネックランゲージ トリガ メソッド «サーバーで実行» ストアドプロシージャー Web サーバー/SOAP Tokyo/2010-03-03/04
  52. 52. • サーバーが素早く終えられるように • トリガ:ボトルネック ‣ 絶対に必要な場合だけランゲージ トリガ ‣ 汎用的なコードは避ける メソッド «サーバーで実行» ストアドプロシージャー • クライアントからプリエンプティブに (STA/ Web サーバー/SOAP ATS, ...) • EXECUTE ON CLIENTが活用できるかも • コンパイルモードで重度のルー IDLE プ: • コードリファクタリング: そんなにたくさんのス トアドプロシージャーがほんとうに必要 ? • ... Tokyo/2010-03-03/04
  53. 53. • サーバーが素早く終えられるように • トリガ:ボトルネック ‣ 絶対に必要な場合だけランゲージ トリガ ‣ 汎用的なコードは避ける メソッド «サーバーで実行» ストアドプロシージャー • クライアントからプリエンプティブに (STA/ Web サーバー/SOAP ATS, ...) 度» • と速 EXECUTE ON CLIENTが活用できるかも 荷 よ «負 • コンパイルモードで重度のルー IDLE プ: 量 せ考 • コードリファクタリング: そんなにたくさんのス トアドプロシージャーがほんとうに必要 ? • ... Tokyo/2010-03-03/04
  54. 54. 4D v11 SQL in Depth #1• アーキテクチャー / スケーラビリティ
  55. 55. 4D v11 SQL in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D
  56. 56. SQL vs 4D - パフォーマンス Clichy/2010-02-03
  57. 57. SQL vs 4D - パフォーマンス 4D, 通常 SQL QUERY( . . .) SELECT ... FROM ... WHERE ... Clichy/2010-02-03
  58. 58. SQL vs 4D - パフォーマンス 4D, 通常 SQL QUERY( . . .) SELECT ... FROM ... WHERE ... インタプリター Clichy/2010-02-03
  59. 59. SQL vs 4D - パフォーマンス 4D, 通常 SQL QUERY( . . .) SELECT ... FROM ... WHERE ... インタプリター DB4D エンジン データファイル/インデックスファイル Clichy/2010-02-03
  60. 60. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 Clichy/2010-02-03
  61. 61. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 ‣ QUERY - 検索,セレクションの作成,先頭レコードのロード - ここまでをすべてひとつのコマンドで Clichy/2010-02-03
  62. 62. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 ‣ QUERY - 検索,セレクションの作成,先頭レコードのロード - ここまでをすべてひとつのコマンドで• SQLは汎用的 ‣ ひとつの命令 (SELECT) であらゆる要求に対処 Clichy/2010-02-03
  63. 63. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 ‣ QUERY - 検索,セレクションの作成,先頭レコードのロード - ここまでをすべてひとつのコマンドで• SQLは汎用的 ‣ ひとつの命令 (SELECT) であらゆる要求に対処 ‣ 加えて存在するオーバーヘッド: - 解析 - 検証 - SQL パススルー Clichy/2010-02-03
  64. 64. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 ‣ QUERY - 検索,セレクションの作成,先頭レコードのロード - ここまでをすべてひとつのコマンドで• SQLは汎用的 ‣ ひとつの命令 (SELECT) であらゆる要求に対処 ‣ 加えて存在するオーバーヘッド: - 解析 - 検証 - SQL パススルー - ランゲージバインディング Clichy/2010-02-03
  65. 65. SQL vs 4D - パフォーマンス• 4Dは不可分, ワンアクションに対して高度に最適化 ‣ QUERY - 検索,セレクションの作成,先頭レコードのロード - ここまでをすべてひとつのコマンドで• SQLは汎用的 ‣ ひとつの命令 (SELECT) であらゆる要求に対処 ‣ 加えて存在するオーバーヘッド: - 解析 - 検証 - SQL パススルー - ランゲージバインディング - エンジン障壁 Clichy/2010-02-03
  66. 66. 4D, 通常 SQLQUERY( . . .) SELECT ... FROM ... WHERE ... インタプリター DB4D エンジンデータファイル/インデックスファイル Clichy/2010-02-03
  67. 67. 4D, 通常 SQLQUERY( . . .) SELECT ... FROM ... WHERE ... インタプリター DB4D エンジンデータファイル/インデックスファイル Clichy/2010-02-03
  68. 68. SQL vs 4D - パフォーマンス• v11: SQL は 5-10 倍遅い場合がある Clichy/2010-02-03
  69. 69. SQL vs 4D - パフォーマンス• v11: SQL は 5-10 倍遅い場合がある ‣ しかしこれは飽くまで平均, あまり捕われないように ‣ 場合によっては, SQLのほうが速いことも Clichy/2010-02-03
  70. 70. SQL vs 4D - パフォーマンス• v11: SQL は 5-10 倍遅い場合がある ‣ しかしこれは飽くまで平均, あまり捕われないように ‣ 場合によっては, SQLのほうが速いことも - 典型例は計算を要するステートメント: SELECT (Debits - Credits) FROM Clients into :rBalance - プリエンプティブ - 少ないネットワークリクエスト Clichy/2010-02-03
  71. 71. SQL vs 4D - パフォーマンス• v11: SQL は 5-10 倍遅い場合がある ‣ しかしこれは飽くまで平均, あまり捕われないように ‣ 場合によっては, SQLのほうが速いことも - 典型例は計算を要するステートメント: SELECT (Debits - Credits) FROM Clients into :rBalance - プリエンプティブ - 少ないネットワークリクエスト• SQL 12 vs SQL v11 ‣ ローカルデータフェッチング => 2-3 倍高速 ‣ リモートデータフェッチング => 5-20 倍高速 Clichy/2010-02-03
  72. 72. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? Clichy/2010-02-03
  73. 73. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? ‣ そのほうが速いと思える根拠があるとき Clichy/2010-02-03
  74. 74. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? ‣ そのほうが速いと思える根拠があるとき ‣ SQLで記述したほうが楽なとき: Clichy/2010-02-03
  75. 75. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? ‣ そのほうが速いと思える根拠があるとき ‣ SQLで記述したほうが楽なとき: Clichy/2010-02-03
  76. 76. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? ‣ そのほうが速いと思える根拠があるとき ‣ SQLで記述したほうが楽(美しい ?)なとき ‣ 他のDB(4Dあるいはそれ以外)に接続するとき Clichy/2010-02-03
  77. 77. SQL vs 4D - パフォーマンス• どのような場合にSQLを使用するべき ? ‣ そのほうが速いと思える根拠があるとき ‣ SQLで記述したほうが楽(美しい ?)なとき ‣ 他のDB(4Dあるいはそれ以外)に接続するとき ‣ SQL特有の機能が必要なとき Clichy/2010-02-03
  78. 78. SQL-92• DBメーカーの数だけ仕様が存在するというのが実情: ‣ OracleのコードがすべてMySQLで動くわけではない ‣ MySQLのコードがすべてPostgreSQLで動くわけではない Clichy/2010-02-03
  79. 79. SQL-92• DBメーカーの数だけ仕様が存在するというのが実情: ‣ OracleのコードがすべてMySQLで動くわけではない ‣ MySQLのコードがすべてPostgreSQLで動くわけではない ➡ Oracle, MySQL, PostgreSQL...で動いたコードがそのままでは4Dで動かないかもしれ ない(そしてこれをバグと呼ぶことはできない) Clichy/2010-02-03
  80. 80. 4D v11 SQL in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D
  81. 81. 4D v11 SQL in Depth #1• アーキテクチャー / スケーラビリティ• SQL vs 4D• キャッシュ
  82. 82. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) Tokyo/2010-03-03/04
  83. 83. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) ‣ 例: レコードをロードする - 初回はディスクから読み込み: アクセスはミリ秒の世界 Tokyo/2010-03-03/04
  84. 84. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) ‣ 例: レコードをロードする - 初回はディスクから読み込み: アクセスはミリ秒の世界 - 以降はキャッシュから: アクセスはナノ秒の世界 Tokyo/2010-03-03/04
  85. 85. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) ‣ 例: レコードをロードする - 初回はディスクから読み込み: アクセスはミリ秒の世界 - 以降はキャッシュから: アクセスはナノ秒の世界 1,000,000 倍高速 もし 1 ns = 1 秒だとすれば, 1 ms = 11,5 日 Tokyo/2010-03-03/04
  86. 86. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) ‣ 例: レコードをロードする - 初回はディスクから読み込み: アクセスはミリ秒の世界 - 以降はキャッシュから: アクセスはナノ秒の世界 Tokyo/2010-03-03/04
  87. 87. キャッシュ• 主要な目的は速度アップ(4D: データアクセス) ‣ 例: レコードをロードする - 初回はディスクから読み込み: アクセスはミリ秒の世界 - 以降はキャッシュから: アクセスはナノ秒の世界• キャッシュに収納されるものは ? - テーブル, フィールド, リレーション, インデックスなどストラクチャ定義情報 - 現在のデータベースに関する全般的な情報(ファイルパス, プロパティなど) - データファイルアロケーションビットテーブル - レコード, インデックス, BLOBの追加情報, 追加プロパティなど - インデックスページ - レコード - BLOB(キャッシュに充分のスペースがなければメインメモリに行くことも) - その他のプロパティ - シーケンシャルナンバー - トランザクション - セレクション - セット - 並び替え用の一時的バッファ, 先読み, ディスク書き込み用バッファなど Tokyo/2010-03-03/04
  88. 88. キャッシュ Tokyo/2010-03-03/04
  89. 89. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) Tokyo/2010-03-03/04
  90. 90. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため Tokyo/2010-03-03/04
  91. 91. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) Tokyo/2010-03-03/04
  92. 92. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている Tokyo/2010-03-03/04
  93. 93. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている• おおきいオブジェクトはユーザーオブジェクト: Tokyo/2010-03-03/04
  94. 94. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている• おおきいオブジェクトはユーザーオブジェクト: ‣ BLOB  Tokyo/2010-03-03/04
  95. 95. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている• おおきいオブジェクトはユーザーオブジェクト: ‣ BLOB  ‣ ピクチャ Tokyo/2010-03-03/04
  96. 96. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている• おおきいオブジェクトはユーザーオブジェクト: ‣ BLOB  ‣ ピクチャ ‣ テキスト Tokyo/2010-03-03/04
  97. 97. キャッシュ• ほとんどは小さなオブジェクト: (<= 64 KB) ‣ ファミリーごとにリンクしているため - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは 複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB) - 例 #2: セットは小さなオブジェクトに圧縮・分散されている• おおきいオブジェクトはユーザーオブジェクト: ‣ BLOB  ‣ ピクチャ «BLOBs»と総称する ‣ テキスト ‣ (レコード) Tokyo/2010-03-03/04
  98. 98. キャッシュ Tokyo/2010-03-03/04
  99. 99. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される Tokyo/2010-03-03/04
  100. 100. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される Tokyo/2010-03-03/04
  101. 101. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される Tokyo/2010-03-03/04
  102. 102. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される Tokyo/2010-03-03/04
  103. 103. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される• FLUSH BUFFERS Tokyo/2010-03-03/04
  104. 104. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される• FLUSH BUFFERS • «汚れた»オブジェクトをディスクの保存すること Tokyo/2010-03-03/04
  105. 105. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される• FLUSH BUFFERS • «汚れた»オブジェクトをディスクの保存すること • その後 «汚れていない»という印が付けられる Tokyo/2010-03-03/04
  106. 106. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される• FLUSH BUFFERS • «汚れた»オブジェクトをディスクの保存すること • その後 «汚れていない»という印が付けられる • それにより, パージしても良い状態になる Tokyo/2010-03-03/04
  107. 107. キャッシュ• スタートアップで確保される• アプリケーション実行中,書き込み,パージ,フラッシュ,再配 置が繰り返される• FLUSH BUFFERS • «汚れた»オブジェクトをディスクの保存すること • その後 «汚れていない»という印が付けられる • それにより, パージしても良い状態になる ディスクアクセスはミリ秒の世界不必要にFLUSH BUFFERSしてはいけない Tokyo/2010-03-03/04
  108. 108. キャッシュキャッシュがメモリを必要とするときは ? Tokyo/2010-03-03/04
  109. 109. キャッシュ キャッシュがメモリを必要とするときは ?• 状況: - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,... - 充分なスペースがない Tokyo/2010-03-03/04
  110. 110. キャッシュ キャッシュがメモリを必要とするときは ?• 状況: - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,... - 充分なスペースがない• 行動: Repeat キャッシュの 10%を パージ オブジェクトを アロケート Until 充分のスペース Tokyo/2010-03-03/04
  111. 111. キャッシュ キャッシュがメモリを必要とするときは ?• 状況: - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,... - 充分なスペースがない• 行動: Repeat キャッシュの 10%を パージ オブジェクトを アロケート Until 充分のスペース Tokyo/2010-03-03/04
  112. 112. キャッシュ キャッシュがメモリを必要とするときは ?• 状況: - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,... - 充分なスペースがない• 行動: Repeat キャッシュの 10%を パージ オブジェクトを アロケート Until 充分のスペース Tokyo/2010-03-03/04
  113. 113. キャッシュ キャッシュがメモリを必要とするときは ?Repeatキャッシュの 10%を パージオブジェクトを アロケートUntil 充分のスペース Tokyo/2010-03-03/04
  114. 114. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース Tokyo/2010-03-03/04
  115. 115. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ Tokyo/2010-03-03/04
  116. 116. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ Tokyo/2010-03-03/04
  117. 117. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ メモリをアロケート Tokyo/2010-03-03/04
  118. 118. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ メモリをアロケート OK? Tokyo/2010-03-03/04
  119. 119. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ メモリをアロケート はい OK? Tokyo/2010-03-03/04
  120. 120. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ メモリをアロケート いいえ はい FLUSH BUFFERS OK? Tokyo/2010-03-03/04
  121. 121. キャッシュ キャッシュがメモリを必要とするときは ?Repeat 確保したキャッシュ合計の10%キャッシュの 10%を パージ キャッシュが1GBの場合,キャッシュマネー ジャーはオブジェクトを アロケート 100MBパージしようとするUntil 充分のスペース パージ 汚れていないオブジェクトをパージ メモリをアロケート いいえ はい FLUSH BUFFERS OK? Tokyo/2010-03-03/04
  122. 122. キャッシュキャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ Tokyo/2010-03-03/04
  123. 123. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ Tokyo/2010-03-03/04
  124. 124. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ ➡ キャッシュが先にフラッシュするオブジェクトはい つも一緒とは限らない Tokyo/2010-03-03/04
  125. 125. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ• フラッシュする最初のオブジェクトまでジャンプ ➡ キャッシュが先にフラッシュするオブジェクトはい つも一緒とは限らない• ディスクでの近接度を考慮して最適のフラッシュを試みる Tokyo/2010-03-03/04
  126. 126. キャッシュキャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ Tokyo/2010-03-03/04
  127. 127. キャッシュキャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ v11は2004よりも劇的に速くなった Tokyo/2010-03-03/04
  128. 128. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ v11は2004よりも劇的に速くなった• 2004: ハンドル(Mac)と連結リスト ➡ オブジェクトは動いた ➡ 4Dはリスト全体をたどる必要があった Tokyo/2010-03-03/04
  129. 129. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ v11は2004よりも劇的に速くなった• 2004: ハンドル(Mac)と連結リスト ➡ オブジェクトは動いた ➡ 4Dはリスト全体をたどる必要があった• V11: ポインタと一種のアドレステーブル ➡ オブジェクトは動かない ➡ 最大 3 アクセスでオブジェクトに到達 Tokyo/2010-03-03/04
  130. 130. キャッシュ キャッシュがメモリを必要とするときは ? 汚れていないオブジェクトをパージ v11は2004よりも劇的に速くなった• 2004: ハンドル(Mac)と連結リスト ➡ オブジェクトは動いた ➡ 4Dはリスト全体をたどる必要があった• V11: ポインタと一種のアドレステーブル ➡ オブジェクトは動かない ➡ 最大 3 アクセスでオブジェクトに到達 (v11の新しいキャッシュメモリマネージャーのおかげ) Tokyo/2010-03-03/04
  131. 131. キャッシュ 最大サイズは ?• 4D 32 ビット Tokyo/2010-03-03/04
  132. 132. キャッシュ 最大サイズは ?• 4D 32 ビット ➡ 最大 2.5 GB ➡ OS(32/64)に関係なく ‣ ハードコードされた値 ‣ ユーザーが > 2.5 を設定した場合は下方修正 Tokyo/2010-03-03/04
  133. 133. キャッシュ 最大サイズは ?• 4D 32 ビット ➡ 最大 2.5 GB ➡ OS(32/64)に関係なく ‣ ハードコードされた値 ‣ ユーザーが > 2.5 を設定した場合は下方修正• 4D 64 ビット(4D Server v12のみ) Tokyo/2010-03-03/04
  134. 134. キャッシュ 最大サイズは ?• 4D 32 ビット ➡ 最大 2.5 GB ➡ OS(32/64)に関係なく ‣ ハードコードされた値 ‣ ユーザーが > 2.5 を設定した場合は下方修正• 4D 64 ビット(4D Server v12のみ) ➡ «制限なし» Tokyo/2010-03-03/04
  135. 135. 4D v11 SQL in Depth #2
  136. 136. 4D v11 SQL in Depth #2• データベースコンテキスト(トリガ, ...)
  137. 137. ユーザー 1 データベースコンテキスト プロセス U1-1 Req1... R2…⋯ R3 ORDER BY (Table1) 19813 19814 4D Server コオペラティブ プリエンプティブ プロセス U1-1 プロセス U1-1 Tokyo/2010-03-03/04
  138. 138. データベースコンテキスト プロセス U1-1Req1... R2…⋯ R3 コオペラティブ プロセス U1-1 Tokyo/2010-03-03/04
  139. 139. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 Tokyo/2010-03-03/04
  140. 140. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 44 Tokyo/2010-03-03/04
  141. 141. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド 44 Tokyo/2010-03-03/04
  142. 142. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  143. 143. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  144. 144. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  145. 145. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  146. 146. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  147. 147. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード 44 Tokyo/2010-03-03/04
  148. 148. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード (*) (*) トリガのテーブルのみ 44 Tokyo/2010-03-03/04
  149. 149. データベースコンテキスト コオペラティブ プロセス U1-1 プロセス U1-1Req1... R2…⋯ R3 コオペラティブツインプロセスが使用するもの: - トリガ - “サーバーで実行” プロパティが有効にされたメソッド “サーバーで実行” トリガ トランザクションステート レコードロッキング プロセスセット プロセス命名セレクション カレントセレクション カレントレコード (*) (*) トリガのテーブルのみ 44 Tokyo/2010-03-03/04
  150. 150. データベースコンテキスト• 例: リレートセレクションのsumをトリガで計算 ‣ クライアントサイド: . . . QUERY([OrderLines];[OrderLines]_OrderID=[Order]ID) SAVE RECORD([Order]) . . . ‣ サーバーサイド («On save existing record») [Order]Total:=Sum([OrderLines]Price) Tokyo/2010-03-03/04
  151. 151. データベースコンテキスト• 例: リレートセレクションのsumをトリガで計算 ‣ クライアントサイド: . . . QUERY([OrderLines];[OrderLines]_OrderID=[Order]ID) SAVE RECORD([Order]) . . . ‣ サーバーサイド («On save existing record») [Order]Total:=Sum([OrderLines]Price) [OrderLines] のセレクションは空 Tokyo/2010-03-03/04
  152. 152. トリガ• (特性と目的を考慮する) Tokyo/2010-03-03/04
  153. 153. トリガ• (特性と目的を考慮する) ≠ 2004• クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要がある Tokyo/2010-03-03/04
  154. 154. トリガ • (特性と目的を考慮する) ≠ 2004 • クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要があるプロセスセット,プロセス命名セレクション,レコードロッキング,トランザク Tokyo/2010-03-03/04
  155. 155. トリガ • (特性と目的を考慮する) ≠ 2004 • クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要があるプロセスセット,プロセス命名セレクション,レコードロッキング,トランザクションステートは同期がとられている Tokyo/2010-03-03/04
  156. 156. トリガ • (特性と目的を考慮する) ≠ 2004 • クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要があるプロセスセット,プロセス命名セレクション,レコードロッキング,トランザクションステートは同期がとられている • 複数が “同時に走る” (コオペラティブスレッドのプールの中で) • 制限 Tokyo/2010-03-03/04
  157. 157. トリガ • (特性と目的を考慮する) ≠ 2004 • クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要があるプロセスセット,プロセス命名セレクション,レコードロッキング,トランザクションステートは同期がとられている • 複数が “同時に走る” (コオペラティブスレッドのプールの中で) • 制限 ‣ コオペラティブ(前述のとおり) Tokyo/2010-03-03/04
  158. 158. トリガ • (特性と目的を考慮する) ≠ 2004 • クライアントサーバー: : ‣ セレクションとカレントレコード (カレントテーブルのレコード以外) ‣ クライアントと同期が取られていない => 再現する必要があるプロセスセット,プロセス命名セレクション,レコードロッキング,トランザクションステートは同期がとられている • 複数が “同時に走る” (コオペラティブスレッドのプールの中で) • 制限 ‣ コオペラティブ(前述のとおり) ‣ 最短の時間で終了しなければならない=(汎用的でない) Tokyo/2010-03-03/04
  159. 159. 4D v11 SQL in Depth #2• データベースコンテキスト(トリガ, ...)
  160. 160. 4D v11 SQL in Depth #2• データベースコンテキスト(トリガ, ...)• スケジューラーを理解する
  161. 161. スケジューラー• スケジューラーの目的 ?• なぜv11になってもスケジューラーが必要なのか ? Tokyo/2010-03-03/04
  162. 162. スケジューラー• スケジューラーの目的 ?• なぜv11になってもスケジューラーが必要なのか ? ‣ 4Dランゲージはスレッドセーフではないから Tokyo/2010-03-03/04
  163. 163. スケジューラー• スケジューラーの目的 ?• なぜv11になってもスケジューラーが必要なのか ? ‣ 4Dランゲージはスレッドセーフではないから• スケジューラーの擬似コード: For 1からプロセス数まで If プロセスが遅延あるいは停止されていなければ そのコードを 1 tick 実行する(16 ms) Tokyo/2010-03-03/04
  164. 164. スケジューラーFor 1からプロセス数までIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) Tokyo/2010-03-03/04
  165. 165. For 1からプロセス数まで スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) • 4Dは各プロセス1 tickの徹底を試みる Tokyo/2010-03-03/04
  166. 166. For 1からプロセス数まで スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) • 4Dは各プロセス1 tickの徹底を試みる • スケジューラーに制御を返さないプロセスは他すべ てを妨害する(ユーザーインタフェースも !): Tokyo/2010-03-03/04
  167. 167. For 1からプロセス数まで スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) • 4Dは各プロセス1 tickの徹底を試みる • スケジューラーに制御を返さないプロセスは他すべ てを妨害する(ユーザーインタフェースも !): ‣ インタプリタモードでは大丈夫 Tokyo/2010-03-03/04
  168. 168. For 1からプロセス数まで スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) • 4Dは各プロセス1 tickの徹底を試みる • スケジューラーに制御を返さないプロセスは他すべ てを妨害する(ユーザーインタフェースも !): ‣ インタプリタモードでは大丈夫 ‣ コンパイルモードでは起こり得る(典型的な 例はIDLEをコールしない高密度ループ) Tokyo/2010-03-03/04
  169. 169. For 1からプロセス数まで スケジューラーIf プロセスが遅延あるいは停止されていなければそのコードを 1 tick 実行する(16 ms) • 4Dは各プロセス1 tickの徹底を試みる • スケジューラーに制御を返さないプロセスは他すべ てを妨害する(ユーザーインタフェースも !): ‣ インタプリタモードでは大丈夫 ‣ コンパイルモードでは起こり得る(典型的な 例はIDLEをコールしない高密度ループ) ‣ プラグインは PA_Yield() あるいは PA_PieldAbsolute()をコールするべき Tokyo/2010-03-03/04
  170. 170. スケジューラー 実際には Tokyo/2010-03-03/04
  171. 171. スケジューラー 実際には1.イベントをチェック(マウス, キーボード, ...) ➡ 適切な4Dプロセスに伝達する2.その後,アクティブプロセスに1 tickずつのループに突入 For 1からプロセス数まで If プロセスが遅延あるいは停止されていなければ そのコードを 1 tick 実行する(16 ms) Tokyo/2010-03-03/04
  172. 172. While 4D 実行中 // システムイベントを処理 Repeat If チェック_間隔 が経過した If 4Dはビジーである タイムアウト = タイムアウト_最短 Else タイムアウト = タイムアウト_最長 End if // ここでシステムに制御を返す Get イベントあるいは タイムアウト まで待機 If イベントは4Dプロセスに関係 Pass イベントをプロセスに伝達 End if End if Until イベントがない // それぞれの4Dプロセスに時間を与える For 4D プロセスそれぞれにつき Give 最低 1 tick アクティブプロセスを実行End while Tokyo/2010-03-03/04
  173. 173. While 4D 実行中 // システムイベントを処理 Repeat If チェック_間隔 が経過した If 4Dはビジーである タイムアウト = タイムアウト_最短 Else タイムアウト = タイムアウト_最長 End if // ここでシステムに制御を返す Get イベントあるいは タイムアウト まで待機 If イベントは4Dプロセスに関係 Pass イベントをプロセスに伝達 End if End if Until イベントがない For 1からプロセス数まで // それぞれの4Dプロセスに時間を与える For 4D If プロセスが遅延あるいは停止されていなければ プロセスそれぞれにつき Give そのコードを 1 tick 実行する(16 ms) 最低 1 tick アクティブプロセスを実行End while Tokyo/2010-03-03/04
  174. 174. While 4D 実行中 // システムイベントを処理 Repeat If チェック_間隔 が経過した If 4Dはビジーである タイムアウト = タイムアウト_最短 Else タイムアウト = タイムアウト_最長 End if // ここでシステムに制御を返す Get イベントあるいは タイムアウト まで待機 If イベントは4Dプロセスに関係 Pass イベントをプロセスに伝達 End if End if Until イベントがない // それぞれの4Dプロセスに時間を与える For 4D プロセスそれぞれにつき Give 最低 1 tick アクティブプロセスを実行End while Tokyo/2010-03-03/04
  175. 175. While 4D 実行中 // システムイベントを処理 Repeat If チェック_間隔 が経過した If 4Dはビジーである タイムアウト = タイムアウト_最短 Else タイムアウト = タイムアウト_最長 End if // ここでシステムに制御を返す Get イベントあるいは タイムアウト まで待機 If イベントは4Dプロセスに関係 Pass イベントをプロセスに伝達 End if End if Until イベントがない // それぞれの4Dプロセスに時間を与える For 4D プロセスそれぞれにつき Give 最低 1 tick アクティブプロセスを実行End while Tokyo/2010-03-03/04
  176. 176. While 4D 実行中 // システムイベントを処理 Repeat If チェック_間隔 が経過した If 4Dはビジーである タイムアウト = タイムアウト_最短 Else タイムアウト = タイムアウト_最長 End if // ここでシステムに制御を返す Get イベントあるいは タイムアウト まで待機 If イベントは4Dプロセスに関係 Pass イベントをプロセスに伝達 End if End if Until イベントがない // それぞれの4Dプロセスに時間を与える For 4D プロセスそれぞれにつき Give 最低 1 tick アクティブプロセスを実行End while Tokyo/2010-03-03/04

×