SlideShare uma empresa Scribd logo
1 de 250
Baixar para ler offline
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)




                                      Tokyo/2010-03-03/04
用語の定義
•   コオペラティブ: 他のプロセス(タスク,スレッ
    ド,...)に譲るCPU時間を自分で決めるプロセス

    ‣ 独占できる = ブロックできる(例 : Mac OS 9)
    ‣ ひとつのアプリケーションのコオペラティブスレ
     ッドは必ず同じコアで実行される




                                      Tokyo/2010-03-03/04
用語の定義
•   コオペラティブ: 他のプロセス(タスク,スレッ
    ド,...)に譲るCPU時間を自分で決めるプロセス

    ‣ 独占できる = ブロックできる(例 : Mac OS 9)
    ‣ ひとつのアプリケーションのコオペラティブスレ
     ッドは必ず同じコアで実行される

•   プリエンプティブ: それぞれのプロセスに与えられ
    るCPU時間はOSが判断する




                                      Tokyo/2010-03-03/04
用語の定義
•   コオペラティブ: 他のプロセス(タスク,スレッ
    ド,...)に譲るCPU時間を自分で決めるプロセス

    ‣ 独占できる = ブロックできる(例 : Mac OS 9)
    ‣ ひとつのアプリケーションのコオペラティブスレ
     ッドは必ず同じコアで実行される

•   プリエンプティブ: それぞれのプロセスに与えられ
    るCPU時間はOSが判断する

•   プリエンプティブな度合いが高いほど速い


                                      Tokyo/2010-03-03/04
三対のツイン




                         4
         Tokyo/2010-03-03/04
三対のツイン
•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ
    ンプロセスと対話している:
    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理
      (query, order by, create, ...)
    ‣ コオペラティブ スレッド: アプリケーションリクエストを処理
      (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)




                                                                                  4
                                                                  Tokyo/2010-03-03/04
三対のツイン
•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ
    ンプロセスと対話している:
    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理
      (query, order by, create, ...)
    ‣ コオペラティブ スレッド: アプリケーションリクエストを処理
      (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)

•   プリエンプティブな第三のスレッドと対話することもある




                                                                                  4
                                                                  Tokyo/2010-03-03/04
三対のツイン
•   4D Clientのグローバルプロセスは必ずサーバーにあるふたつのツイ
    ンプロセスと対話している:
    ‣ プリエンプティブ スレッド: «純粋な» DB4Dリクエストを処理
      (query, order by, create, ...)
    ‣ コオペラティブ スレッド: アプリケーションリクエストを処理
      (Current date(*), GET PROCESS VARIABLE(-1;...), トリガ, ...)

•   プリエンプティブな第三のスレッドと対話することもある
    ‣ これはBegin SQLが実行されると作成される




                                                                                  4
                                                                  Tokyo/2010-03-03/04
三対のツイン
•   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
三対のツイン
•   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
三対のツイン
•   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
Tokyo/2010-03-03/04
ユーザー	
 1




              プロセス	
 U1-1
  Req1...             R2…⋯   R3…⋯
  QUERY	
 (Table1)




サーバー




                                               4D	
 Server


                                コオペラティブ                      プリエンプティブ




                             コア	
 1   コア	
 2            コア	
 3    コア	
 4

                                      オペレーティングシステム




                                                                           Tokyo/2010-03-03/04
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
ユーザー	
 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
コオペラティブ            プリエンプティブ

スケジューラー




  コア	
 1   コア	
 2   コア	
 3   コア	
 4

           オペレーティングシステム




                                      Tokyo/2010-03-03/04
コオペラティブ            プリエンプティブ

スケジューラー




  コア	
 1   コア	
 2   コア	
 3    コア	
 4

           オペレーティングシステム




                              伸張性と速度
                             DBリクエストは同時に複数の
                             クライアントが実行できる




                                        Tokyo/2010-03-03/04
コオペラティブ            プリエンプティブ

   スケジューラー




      コア	
 1   コア	
 2   コア	
 3    コア	
 4

               オペレーティングシステム




ボトルネック                            伸張性と速度
ランゲージ                            DBリクエストは同時に複数の
  トリガ                            クライアントが実行できる
  メソッド «サーバーで実行»
  ストアドプロシージャー
  Web サーバー/SOAP
4D自体:
  サーバーのユーザーインタフェース
  コネクションハンドラー
  ある種の外部SQLリクエスト

                                            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 同時に実行




                                 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
いろいろなサーバー




            Tokyo/2010-03-03/04
いろいろなサーバー

 アプリケーションサーバー
            コオペラティブ




    Web /SOAP
            コオペラティブ



   SQL サーバー
           プリエンプティブ



   DB4D サーバー
           プリエンプティブ




                      Tokyo/2010-03-03/04
v11-v12
                       デスクトップ            クライアント-サーバー
                                         クライアント

                  コオペラティブ   プリエンプティブ   コオペラティブ   プリエンプティブ

   インタフェース全般

       ランゲージ

ストアドプロシージャー

    HTTP	
 サーバー

アプリケーションサーバー

  インデックスビルダー

 フラッシュマネージャー

     SQL	
 サーバー

DB4D(データアクセス)




                                                            Tokyo/2010-03-03/04
v11-v12
                       デスクトップ            クライアント-サーバー
                                         クライアント

                  コオペラティブ   プリエンプティブ   コオペラティブ   プリエンプティブ

   インタフェース全般

       ランゲージ

ストアドプロシージャー

    HTTP	
 サーバー

アプリケーションサーバー

  インデックスビルダー

 フラッシュマネージャー

     SQL	
 サーバー

DB4D(データアクセス)




                                                            Tokyo/2010-03-03/04
ユーザー	
 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
Tokyo/2010-03-03/04
ボトルネック
ランゲージ
 トリガ
 メソッド «サーバーで実行»
 ストアドプロシージャー
 Web サーバー/SOAP

4D自体:
  サーバーのユーザーインタフェース
  コネクションハンドラー
  ある種の外部SQLリクエスト




                     Tokyo/2010-03-03/04
ボトルネック
ランゲージ
 トリガ
 メソッド «サーバーで実行»
 ストアドプロシージャー
 Web サーバー/SOAP




                  Tokyo/2010-03-03/04
•   サーバーが素早く終えられるように

                  •   トリガ:
ボトルネック
                       ‣ 絶対に必要な場合だけ
ランゲージ
 トリガ                   ‣ 汎用的なコードは避ける
 メソッド «サーバーで実行»
 ストアドプロシージャー      •   クライアントからプリエンプティブに (STA/
 Web サーバー/SOAP        ATS, ...)

                  •   EXECUTE ON CLIENTが活用できるかも

                  •   コンパイルモードで重度のルー IDLE
                                    プ:

                  •   コードリファクタリング: そんなにたくさんのス
                      トアドプロシージャーがほんとうに必要 ?

                  •   ...



                                            Tokyo/2010-03-03/04
•   サーバーが素早く終えられるように

                     •   トリガ:
ボトルネック
                          ‣ 絶対に必要な場合だけ
ランゲージ
 トリガ                      ‣ 汎用的なコードは避ける
 メソッド «サーバーで実行»
 ストアドプロシージャー         •   クライアントからプリエンプティブに (STA/
 Web サーバー/SOAP           ATS, ...)
                度»   •
             と速
                         EXECUTE ON CLIENTが活用できるかも
           荷
       よ «負          •   コンパイルモードで重度のルー IDLE
                                       プ:
    量 せ
考                    •   コードリファクタリング: そんなにたくさんのス
                         トアドプロシージャーがほんとうに必要 ?

                     •   ...



                                               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   ...




                                                        Clichy/2010-02-03
SQL vs 4D - パフォーマンス
 4D, 通常                              SQL
  QUERY( . . .)       SELECT   ...   FROM   ...   WHERE   ...




                  インタプリター




                                                            Clichy/2010-02-03
SQL vs 4D - パフォーマンス
 4D, 通常                                SQL
  QUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ...




                  インタプリター



                  DB4D エンジン




 データファイル/インデックスファイル
                                                              Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化




                                Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化

    ‣ QUERY
      - 検索,セレクションの作成,先頭レコードのロード
      - ここまでをすべてひとつのコマンドで




                                  Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化

    ‣ QUERY
      - 検索,セレクションの作成,先頭レコードのロード
      - ここまでをすべてひとつのコマンドで

•   SQLは汎用的

    ‣ ひとつの命令 (SELECT) であらゆる要求に対処




                                   Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化

    ‣ QUERY
      - 検索,セレクションの作成,先頭レコードのロード
      - ここまでをすべてひとつのコマンドで

•   SQLは汎用的

    ‣ ひとつの命令 (SELECT) であらゆる要求に対処
    ‣ 加えて存在するオーバーヘッド:
      - 解析
      - 検証
      - SQL パススルー


                                   Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化

    ‣ QUERY
      - 検索,セレクションの作成,先頭レコードのロード
      - ここまでをすべてひとつのコマンドで

•   SQLは汎用的

    ‣ ひとつの命令 (SELECT) であらゆる要求に対処
    ‣ 加えて存在するオーバーヘッド:
      -   解析
      -   検証
      -   SQL パススルー
      -   ランゲージバインディング

                                   Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   4Dは不可分, ワンアクションに対して高度に最適化

    ‣ QUERY
      - 検索,セレクションの作成,先頭レコードのロード
      - ここまでをすべてひとつのコマンドで

•   SQLは汎用的

    ‣ ひとつの命令 (SELECT) であらゆる要求に対処
    ‣ 加えて存在するオーバーヘッド:
      -   解析
      -   検証
      -   SQL パススルー
      -   ランゲージバインディング
      -   エンジン障壁
                                   Clichy/2010-02-03
4D, 通常                               SQL
QUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ...




                インタプリター



                DB4D エンジン




データファイル/インデックスファイル

                                                            Clichy/2010-02-03
4D, 通常                               SQL
QUERY( . . .)         SELECT   ...   FROM   ...   WHERE   ...




                          インタプリター



                DB4D エンジン




データファイル/インデックスファイル

                                                            Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   v11: SQL は 5-10 倍遅い場合がある




                               Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   v11: SQL は 5-10 倍遅い場合がある

    ‣ しかしこれは飽くまで平均, あまり捕われないように
    ‣ 場合によっては, SQLのほうが速いことも




                               Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   v11: SQL は 5-10 倍遅い場合がある

    ‣ しかしこれは飽くまで平均, あまり捕われないように
    ‣ 場合によっては, SQLのほうが速いことも
      - 典型例は計算を要するステートメント:
         SELECT (Debits - Credits) FROM Clients into :rBalance

      - プリエンプティブ
      - 少ないネットワークリクエスト




                                                                 Clichy/2010-02-03
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
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?




                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?

    ‣ そのほうが速いと思える根拠があるとき




                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?

    ‣ そのほうが速いと思える根拠があるとき
    ‣ SQLで記述したほうが楽なとき:




                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?

    ‣ そのほうが速いと思える根拠があるとき
    ‣ SQLで記述したほうが楽なとき:




                           Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?

    ‣ そのほうが速いと思える根拠があるとき
    ‣ SQLで記述したほうが楽(美しい ?)なとき
    ‣ 他のDB(4Dあるいはそれ以外)に接続するとき




                                Clichy/2010-02-03
SQL vs 4D - パフォーマンス
•   どのような場合にSQLを使用するべき ?

    ‣ そのほうが速いと思える根拠があるとき
    ‣ SQLで記述したほうが楽(美しい ?)なとき
    ‣ 他のDB(4Dあるいはそれ以外)に接続するとき
    ‣ SQL特有の機能が必要なとき




                                Clichy/2010-02-03
SQL-92
•   DBメーカーの数だけ仕様が存在するというのが実情:
    ‣ OracleのコードがすべてMySQLで動くわけではない
    ‣ MySQLのコードがすべてPostgreSQLで動くわけではない




                                         Clichy/2010-02-03
SQL-92
•   DBメーカーの数だけ仕様が存在するというのが実情:
    ‣ OracleのコードがすべてMySQLで動くわけではない
    ‣ MySQLのコードがすべてPostgreSQLで動くわけではない
      ➡ Oracle, MySQL, PostgreSQL...で動いたコードがそのままでは4Dで動かないかもしれ
        ない(そしてこれをバグと呼ぶことはできない)




                                                       Clichy/2010-02-03
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: データアクセス)
    ‣ 例: レコードをロードする
      - 初回はディスクから読み込み: アクセスはミリ秒の世界




                                     Tokyo/2010-03-03/04
キャッシュ
•   主要な目的は速度アップ(4D: データアクセス)
    ‣ 例: レコードをロードする
      - 初回はディスクから読み込み: アクセスはミリ秒の世界
      - 以降はキャッシュから: アクセスはナノ秒の世界




                                     Tokyo/2010-03-03/04
キャッシュ
•   主要な目的は速度アップ(4D: データアクセス)
    ‣ 例: レコードをロードする
      - 初回はディスクから読み込み: アクセスはミリ秒の世界
      - 以降はキャッシュから: アクセスはナノ秒の世界
                 1,000,000 倍高速

       もし 1 ns = 1 秒だとすれば, 1 ms = 11,5 日




                                           Tokyo/2010-03-03/04
キャッシュ
•   主要な目的は速度アップ(4D: データアクセス)
    ‣ 例: レコードをロードする
      - 初回はディスクから読み込み: アクセスはミリ秒の世界
      - 以降はキャッシュから: アクセスはナノ秒の世界




                                     Tokyo/2010-03-03/04
キャッシュ
•   主要な目的は速度アップ(4D: データアクセス)
    ‣ 例: レコードをロードする
      - 初回はディスクから読み込み: アクセスはミリ秒の世界
      - 以降はキャッシュから: アクセスはナノ秒の世界

•   キャッシュに収納されるものは ?
      -   テーブル, フィールド, リレーション, インデックスなどストラクチャ定義情報
      -   現在のデータベースに関する全般的な情報(ファイルパス, プロパティなど)
      -   データファイルアロケーションビットテーブル
      -   レコード, インデックス, BLOBの追加情報, 追加プロパティなど
      -   インデックスページ
      -   レコード
      -   BLOB(キャッシュに充分のスペースがなければメインメモリに行くことも)
      -   その他のプロパティ
      -   シーケンシャルナンバー
      -   トランザクション
      -   セレクション
      -   セット
      -   並び替え用の一時的バッファ, 先読み, ディスク書き込み用バッファなど



                                                    Tokyo/2010-03-03/04
キャッシュ




        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)




                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
       複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
      - 例 #2: セットは小さなオブジェクトに圧縮・分散されている




                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
       複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
      - 例 #2: セットは小さなオブジェクトに圧縮・分散されている

•   おおきいオブジェクトはユーザーオブジェクト:




                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
       複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
      - 例 #2: セットは小さなオブジェクトに圧縮・分散されている

•   おおきいオブジェクトはユーザーオブジェクト:

    ‣ BLOB 




                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
       複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
      - 例 #2: セットは小さなオブジェクトに圧縮・分散されている

•   おおきいオブジェクトはユーザーオブジェクト:

    ‣ BLOB 
    ‣ ピクチャ



                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
      - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
       複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
      - 例 #2: セットは小さなオブジェクトに圧縮・分散されている

•   おおきいオブジェクトはユーザーオブジェクト:

    ‣ BLOB 
    ‣ ピクチャ
    ‣ テキスト


                                               Tokyo/2010-03-03/04
キャッシュ
•   ほとんどは小さなオブジェクト: (<= 64 KB)

    ‣ ファミリーごとにリンクしているため
        - 例 #1: あるテーブルのレコード100,000,000 件分のアドレスのリストは
         複数のアドレステーブルに読み込まれる(それぞれは <= 64 KB)
        - 例 #2: セットは小さなオブジェクトに圧縮・分散されている

•   おおきいオブジェクトはユーザーオブジェクト:

    ‣   BLOB 
    ‣   ピクチャ
                            «BLOBs»と総称する
    ‣   テキスト
    ‣   (レコード)

                                                 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
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される




                             Tokyo/2010-03-03/04
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される
•   FLUSH BUFFERS




                             Tokyo/2010-03-03/04
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される
•   FLUSH BUFFERS
    •   «汚れた»オブジェクトをディスクの保存すること




                                  Tokyo/2010-03-03/04
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される
•   FLUSH BUFFERS
    •   «汚れた»オブジェクトをディスクの保存すること

    •   その後 «汚れていない»という印が付けられる




                                  Tokyo/2010-03-03/04
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される
•   FLUSH BUFFERS
    •   «汚れた»オブジェクトをディスクの保存すること

    •   その後 «汚れていない»という印が付けられる

    •   それにより, パージしても良い状態になる




                                  Tokyo/2010-03-03/04
キャッシュ
•   スタートアップで確保される

•   アプリケーション実行中,書き込み,パージ,フラッシュ,再配
    置が繰り返される
•   FLUSH BUFFERS
    •   «汚れた»オブジェクトをディスクの保存すること

    •   その後 «汚れていない»という印が付けられる

    •   それにより, パージしても良い状態になる
        ディスクアクセスはミリ秒の世界

不必要にFLUSH BUFFERSしてはいけない




                                  Tokyo/2010-03-03/04
キャッシュ
キャッシュがメモリを必要とするときは ?




                       Tokyo/2010-03-03/04
キャッシュ
    キャッシュがメモリを必要とするときは ?
•   状況:
      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...
      - 充分なスペースがない




                                           Tokyo/2010-03-03/04
キャッシュ
    キャッシュがメモリを必要とするときは ?
•   状況:
      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...
      - 充分なスペースがない

•   行動:
          Repeat
          キャッシュの 10%を パージ
          オブジェクトを アロケート
          Until 充分のスペース




                                           Tokyo/2010-03-03/04
キャッシュ
    キャッシュがメモリを必要とするときは ?
•   状況:
      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...
      - 充分なスペースがない

•   行動:
          Repeat
          キャッシュの 10%を パージ
          オブジェクトを アロケート
          Until 充分のスペース




                                           Tokyo/2010-03-03/04
キャッシュ
    キャッシュがメモリを必要とするときは ?
•   状況:
      - ロードしなければならないオブジェクトがある:レコード,アドレステーブル,...
      - 充分なスペースがない

•   行動:
          Repeat
          キャッシュの 10%を パージ
          オブジェクトを アロケート
          Until 充分のスペース




                                           Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat
キャッシュの 10%を パージ
オブジェクトを アロケート
Until 充分のスペース




                            Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース




                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース
                        パージ




                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース
                        パージ
                   汚れていないオブジェクトをパージ




                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース
                        パージ
                   汚れていないオブジェクトをパージ


                      メモリをアロケート




                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース
                        パージ
                   汚れていないオブジェクトをパージ


                      メモリをアロケート




                         OK?



                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat             確保したキャッシュ合計の10%
キャッシュの 10%を パージ    キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート      100MBパージしようとする
Until 充分のスペース
                        パージ
                   汚れていないオブジェクトをパージ


                      メモリをアロケート



                               はい
                         OK?



                                          Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat                 確保したキャッシュ合計の10%
キャッシュの 10%を パージ        キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート          100MBパージしようとする
Until 充分のスペース
                              パージ
                       汚れていないオブジェクトをパージ


                          メモリをアロケート



                        いいえ         はい
      FLUSH BUFFERS           OK?



                                              Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
Repeat                 確保したキャッシュ合計の10%
キャッシュの 10%を パージ        キャッシュが1GBの場合,キャッシュマネー ジャーは
オブジェクトを アロケート          100MBパージしようとする
Until 充分のスペース
                              パージ
                       汚れていないオブジェクトをパージ


                          メモリをアロケート



                        いいえ         はい
      FLUSH BUFFERS           OK?



                                              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
キャッシュ
キャッシュがメモリを必要とするときは ?
     汚れていないオブジェクトをパージ




                        Tokyo/2010-03-03/04
キャッシュ
キャッシュがメモリを必要とするときは ?
     汚れていないオブジェクトをパージ

   v11は2004よりも劇的に速くなった




                         Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
            汚れていないオブジェクトをパージ

         v11は2004よりも劇的に速くなった

•   2004: ハンドル(Mac)と連結リスト
     ➡ オブジェクトは動いた
     ➡ 4Dはリスト全体をたどる必要があった




                               Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
            汚れていないオブジェクトをパージ

         v11は2004よりも劇的に速くなった

•   2004: ハンドル(Mac)と連結リスト
     ➡ オブジェクトは動いた
     ➡ 4Dはリスト全体をたどる必要があった

•   V11: ポインタと一種のアドレステーブル
     ➡ オブジェクトは動かない
     ➡ 最大 3 アクセスでオブジェクトに到達

                               Tokyo/2010-03-03/04
キャッシュ
     キャッシュがメモリを必要とするときは ?
             汚れていないオブジェクトをパージ

         v11は2004よりも劇的に速くなった

•   2004: ハンドル(Mac)と連結リスト
     ➡ オブジェクトは動いた
     ➡ 4Dはリスト全体をたどる必要があった

•   V11: ポインタと一種のアドレステーブル
     ➡ オブジェクトは動かない
     ➡ 最大 3 アクセスでオブジェクトに到達
        (v11の新しいキャッシュメモリマネージャーのおかげ)

                                      Tokyo/2010-03-03/04
キャッシュ
                最大サイズは ?
•   4D 32 ビット




                           Tokyo/2010-03-03/04
キャッシュ
                最大サイズは ?
•   4D 32 ビット

    ➡ 最大 2.5 GB
    ➡ OS(32/64)に関係なく
    ‣ ハードコードされた値
    ‣ ユーザーが > 2.5 を設定した場合は下方修正




                                 Tokyo/2010-03-03/04
キャッシュ
                最大サイズは ?
•   4D 32 ビット

    ➡ 最大 2.5 GB
    ➡ OS(32/64)に関係なく
    ‣ ハードコードされた値
    ‣ ユーザーが > 2.5 を設定した場合は下方修正

•   4D 64 ビット(4D Server v12のみ)



                                 Tokyo/2010-03-03/04
キャッシュ
                最大サイズは ?
•   4D 32 ビット

    ➡ 最大 2.5 GB
    ➡ OS(32/64)に関係なく
    ‣ ハードコードされた値
    ‣ ユーザーが > 2.5 を設定した場合は下方修正

•   4D 64 ビット(4D Server v12のみ)

    ➡ «制限なし»

                                 Tokyo/2010-03-03/04
4D v11 SQL
  in Depth #2
4D v11 SQL
    in Depth #2

• データベースコンテキスト(トリガ, ...)
ユーザー	
 1
           データベースコンテキスト

              プロセス	
 U1-1
 Req1...                 R2…⋯   R3
 ORDER	
 BY	
 (Table1)




                                 19813                                 19814

                                               4D	
 Server


                                     コオペラティブ                 プリエンプティブ
                            プロセス	
 U1-1                  プロセス	
 U1-1




                                                                               Tokyo/2010-03-03/04
データベースコンテキスト

          プロセス	
 U1-1
Req1...           R2…⋯      R3




                                 コオペラティブ
                        プロセス	
 U1-1




                                           Tokyo/2010-03-03/04
データベースコンテキスト
                                     コオペラティブ
                              プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




                                            Tokyo/2010-03-03/04
データベースコンテキスト
                                     コオペラティブ
                              プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




                                                           44
                                            Tokyo/2010-03-03/04
データベースコンテキスト
                                                  コオペラティブ
                                           プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド




                                                                        44
                                                         Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード



                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード                                   (*)
                                                (*) トリガのテーブルのみ

                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
                                                           コオペラティブ
                                                    プロセス	
 U1-1
          プロセス	
 U1-1
Req1...           R2…⋯   R3




          コオペラティブツインプロセスが使用するもの:
                  - トリガ
                  - “サーバーで実行” プロパティが有効にされたメソッド

                                        “サーバーで実行”                 トリガ
          トランザクションステート
                    レコードロッキング
                              プロセスセット
          プロセス命名セレクション
               カレントセレクション
                         カレントレコード                                   (*)
                                                (*) トリガのテーブルのみ

                                                                                       44
                                                                        Tokyo/2010-03-03/04
データベースコンテキスト
•   例: リレートセレクションのsumをトリガで計算

    ‣ クライアントサイド:
         . . .
         QUERY([OrderLines];[OrderLines]_OrderID=[Order]ID)
         SAVE RECORD([Order])
         . . .

    ‣ サーバーサイド («On save existing record»)
         [Order]Total:=Sum([OrderLines]Price)




                                                              Tokyo/2010-03-03/04
データベースコンテキスト
•   例: リレートセレクションの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
トリガ
• (特性と目的を考慮する)




                 Tokyo/2010-03-03/04
トリガ
• (特性と目的を考慮する)
                              ≠ 2004
• クライアントサーバー: :
   ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
   ‣ クライアントと同期が取られていない => 再現する必要がある




                                         Tokyo/2010-03-03/04
トリガ
 • (特性と目的を考慮する)
                                ≠ 2004
 • クライアントサーバー: :
    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
    ‣ クライアントと同期が取られていない => 再現する必要がある
プロセスセット,プロセス命名セレクション,レコードロッキング,トランザク




                                          Tokyo/2010-03-03/04
トリガ
 • (特性と目的を考慮する)
                                ≠ 2004
 • クライアントサーバー: :
    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
    ‣ クライアントと同期が取られていない => 再現する必要がある
プロセスセット,プロセス命名セレクション,レコードロッキング,トランザク
ションステートは同期がとられている




                                          Tokyo/2010-03-03/04
トリガ
 • (特性と目的を考慮する)
                                ≠ 2004
 • クライアントサーバー: :
    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
    ‣ クライアントと同期が取られていない => 再現する必要がある
プロセスセット,プロセス命名セレクション,レコードロッキング,トランザク
ションステートは同期がとられている

 • 複数が “同時に走る” (コオペラティブスレッドのプールの中で)
 • 制限



                                          Tokyo/2010-03-03/04
トリガ
 • (特性と目的を考慮する)
                                ≠ 2004
 • クライアントサーバー: :
    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
    ‣ クライアントと同期が取られていない => 再現する必要がある
プロセスセット,プロセス命名セレクション,レコードロッキング,トランザク
ションステートは同期がとられている

 • 複数が “同時に走る” (コオペラティブスレッドのプールの中で)
 • 制限
    ‣ コオペラティブ(前述のとおり)




                                          Tokyo/2010-03-03/04
トリガ
 • (特性と目的を考慮する)
                                ≠ 2004
 • クライアントサーバー: :
    ‣ セレクションとカレントレコード (カレントテーブルのレコード以外)
    ‣ クライアントと同期が取られていない => 再現する必要がある
プロセスセット,プロセス命名セレクション,レコードロッキング,トランザク
ションステートは同期がとられている

 • 複数が “同時に走る” (コオペラティブスレッドのプールの中で)
 • 制限
    ‣ コオペラティブ(前述のとおり)

    ‣ 最短の時間で終了しなければならない=(汎用的でない)


                                          Tokyo/2010-03-03/04
4D v11 SQL
    in Depth #2

• データベースコンテキスト(トリガ, ...)
4D v11 SQL
    in Depth #2

• データベースコンテキスト(トリガ, ...)
• スケジューラーを理解する
スケジューラー

•   スケジューラーの目的 ?

•   なぜv11になってもスケジューラーが必要なのか ?




                                Tokyo/2010-03-03/04
スケジューラー

•   スケジューラーの目的 ?

•   なぜv11になってもスケジューラーが必要なのか ?

    ‣ 4Dランゲージはスレッドセーフではないから




                                Tokyo/2010-03-03/04
スケジューラー

•   スケジューラーの目的 ?

•   なぜv11になってもスケジューラーが必要なのか ?

    ‣ 4Dランゲージはスレッドセーフではないから

•   スケジューラーの擬似コード:
       For 1からプロセス数まで
       If プロセスが遅延あるいは停止されていなければ
       そのコードを 1 tick 実行する(16 ms)




                                   Tokyo/2010-03-03/04
スケジューラー




For 1からプロセス数まで
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)




                            Tokyo/2010-03-03/04
For 1からプロセス数まで
                    スケジューラー
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)


   •   4Dは各プロセス1 tickの徹底を試みる




                               Tokyo/2010-03-03/04
For 1からプロセス数まで
                    スケジューラー
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)


   •   4Dは各プロセス1 tickの徹底を試みる

   •   スケジューラーに制御を返さないプロセスは他すべ
       てを妨害する(ユーザーインタフェースも !):




                                 Tokyo/2010-03-03/04
For 1からプロセス数まで
                    スケジューラー
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)


   •   4Dは各プロセス1 tickの徹底を試みる

   •   スケジューラーに制御を返さないプロセスは他すべ
       てを妨害する(ユーザーインタフェースも !):

       ‣ インタプリタモードでは大丈夫




                                 Tokyo/2010-03-03/04
For 1からプロセス数まで
                    スケジューラー
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)


   •   4Dは各プロセス1 tickの徹底を試みる

   •   スケジューラーに制御を返さないプロセスは他すべ
       てを妨害する(ユーザーインタフェースも !):

       ‣ インタプリタモードでは大丈夫
       ‣ コンパイルモードでは起こり得る(典型的な
          例はIDLEをコールしない高密度ループ)




                                 Tokyo/2010-03-03/04
For 1からプロセス数まで
                    スケジューラー
If プロセスが遅延あるいは停止されていなければ
そのコードを 1 tick 実行する(16 ms)


   •   4Dは各プロセス1 tickの徹底を試みる

   •   スケジューラーに制御を返さないプロセスは他すべ
       てを妨害する(ユーザーインタフェースも !):

       ‣ インタプリタモードでは大丈夫
       ‣ コンパイルモードでは起こり得る(典型的な
          例はIDLEをコールしない高密度ループ)

       ‣ プラグインは PA_Yield() あるいは
          PA_PieldAbsolute()をコールするべき
                                       Tokyo/2010-03-03/04
スケジューラー
  実際には




          Tokyo/2010-03-03/04
スケジューラー
               実際には


1.イベントをチェック(マウス, キーボード, ...)
 ➡ 適切な4Dプロセスに伝達する

2.その後,アクティブプロセスに1 tickずつのループに突入

     For 1からプロセス数まで
     If プロセスが遅延あるいは停止されていなければ
     そのコードを 1 tick 実行する(16 ms)




                                 Tokyo/2010-03-03/04
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
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
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
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
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
While 4D 実行中
     // システムイベントを処理
     Repeat
       If チェック_間隔 が経過した
           If 4Dはビジーである
               タイムアウト = タイムアウト_最短
           Else
               タイムアウト = タイムアウト_最長
           End if
           // ここでシステムに制御を返す
           Get イベントあるいは タイムアウト まで待機
           If イベントは4Dプロセスに関係DATABASE PARAMETER
                           SET
               Pass イベントをプロセスに伝達
                                  4D Server Scheduler
           End if                 4D Remote Scheduler
       End if
     Until イベントがない                4D Local Mode Scheduler

     // それぞれの4Dプロセスに時間を与える
     For 4D プロセスそれぞれにつき
       Give 最低 1 tick アクティブプロセスを実行
End while

                                                   Tokyo/2010-03-03/04
スケジューラー
 デフォルト値




          Tokyo/2010-03-03/04
スケジューラー
                 デフォルト値




         タイムアウト_最短   タイムアウト_最長   チェック_間隔


4Dを最高に       0            1         5

4Dを標準に       0            8         0

4Dを最低に       1            16        0

                                        Tokyo/2010-03-03/04
スケジューラー
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
スケジューラー: 4Dを最高に
While 4D 実行中
     // システムイベントを処理
     Repeat
       If 5 ticks が経過した
           If 4Dはビジーである
               タイムアウト = 0 tick
           Else
               タイムアウト = 1 ticks
           End if
           // ここでシステムに制御を返す
           Get イベントあるいは タイムアウト まで待機
           If イベントは4Dプロセスに関係
               Pass イベントをプロセスに伝達
           End if
       End if
     Until イベントがない

     // それぞれの4Dプロセスに時間を与える
     For 4D プロセスそれぞれにつき
       Give 最低 1 tick アクティブプロセスを実行
End while

                                      Tokyo/2010-03-03/04
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

Mais conteúdo relacionado

Destaque

Picture 2013-05-28
Picture 2013-05-28Picture 2013-05-28
Picture 2013-05-28kmiyako
 
Japanese Collation 2010-03-03
Japanese Collation 2010-03-03Japanese Collation 2010-03-03
Japanese Collation 2010-03-03kmiyako
 
Mirroring
MirroringMirroring
Mirroringkmiyako
 
Optimisation 2013-07-02
Optimisation 2013-07-02Optimisation 2013-07-02
Optimisation 2013-07-02kmiyako
 
Paint Tool 2013-05-14
Paint Tool 2013-05-14Paint Tool 2013-05-14
Paint Tool 2013-05-14kmiyako
 
Current Selection 2010-02-14
Current Selection 2010-02-14Current Selection 2010-02-14
Current Selection 2010-02-14kmiyako
 
Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1kmiyako
 
Uminohi 2013-07-14
Uminohi 2013-07-14Uminohi 2013-07-14
Uminohi 2013-07-14kmiyako
 
Data conversion
Data conversionData conversion
Data conversionkmiyako
 
⾼解像度ディスプレイ
⾼解像度ディスプレイ⾼解像度ディスプレイ
⾼解像度ディスプレイkmiyako
 
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
 

Destaque (19)

Picture 2013-05-28
Picture 2013-05-28Picture 2013-05-28
Picture 2013-05-28
 
4D Tags
4D Tags4D Tags
4D Tags
 
Japanese Collation 2010-03-03
Japanese Collation 2010-03-03Japanese Collation 2010-03-03
Japanese Collation 2010-03-03
 
Mirroring
MirroringMirroring
Mirroring
 
Optimisation 2013-07-02
Optimisation 2013-07-02Optimisation 2013-07-02
Optimisation 2013-07-02
 
Paint Tool 2013-05-14
Paint Tool 2013-05-14Paint Tool 2013-05-14
Paint Tool 2013-05-14
 
Current Selection 2010-02-14
Current Selection 2010-02-14Current Selection 2010-02-14
Current Selection 2010-02-14
 
Wakanda#1
Wakanda#1Wakanda#1
Wakanda#1
 
Uminohi 2013-07-14
Uminohi 2013-07-14Uminohi 2013-07-14
Uminohi 2013-07-14
 
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
 

Semelhante a In Depth 4D v11 SQL 2010-03-03

2013 summercamp 02
2013 summercamp 022013 summercamp 02
2013 summercamp 02openrtm
 
170622 02
170622 02170622 02
170622 02openrtm
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3openrtm
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Nagato Kasaki
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたYou&I
 
Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2Yuki Suga
 
ISUCON夏期講習2015_2 実践編
ISUCON夏期講習2015_2 実践編ISUCON夏期講習2015_2 実践編
ISUCON夏期講習2015_2 実践編SATOSHI TAGOMORI
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用Keiichi Hikita
 
mercurial-users.jp speech at OSC2013 Tokyo/Spring
mercurial-users.jp speech at OSC2013 Tokyo/Springmercurial-users.jp speech at OSC2013 Tokyo/Spring
mercurial-users.jp speech at OSC2013 Tokyo/SpringKatsunori FUJIWARA
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseMikio Hirabayashi
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門Akira Shimosako
 
loggregator update
loggregator updateloggregator update
loggregator updateKen Ojiri
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishYohei Azekatsu
 
Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Koichi Sasada
 
プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~ryouta watabe
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎Insight Technology, Inc.
 

Semelhante a In Depth 4D v11 SQL 2010-03-03 (20)

2013 summercamp 02
2013 summercamp 022013 summercamp 02
2013 summercamp 02
 
170622 02
170622 02170622 02
170622 02
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
 
osoljp 2011.08
osoljp 2011.08osoljp 2011.08
osoljp 2011.08
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみた
 
Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2Robotech2012講習会v01最終版v2
Robotech2012講習会v01最終版v2
 
ISUCON夏期講習2015_2 実践編
ISUCON夏期講習2015_2 実践編ISUCON夏期講習2015_2 実践編
ISUCON夏期講習2015_2 実践編
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
OpenStack上の環境構築自動化に向けたTerraform/Pulumiの活用
 
20201127 .NET 5
20201127 .NET 520201127 .NET 5
20201127 .NET 5
 
mercurial-users.jp speech at OSC2013 Tokyo/Spring
mercurial-users.jp speech at OSC2013 Tokyo/Springmercurial-users.jp speech at OSC2013 Tokyo/Spring
mercurial-users.jp speech at OSC2013 Tokyo/Spring
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in Japanese
 
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
 
loggregator update
loggregator updateloggregator update
loggregator update
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
 
Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新
 
プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎
 

Mais de 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
 

Mais de 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
 
⽇本語全⽂検索
⽇本語全⽂検索⽇本語全⽂検索
⽇本語全⽂検索
 
ラベルエディター
ラベルエディターラベルエディター
ラベルエディター
 

Último

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Último (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

In Depth 4D v11 SQL 2010-03-03

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