【仕様】ORDER BY FORMULAがサーバー上で実行されないケース

前のトピックを表示 次のトピックを表示 Go down

【仕様】ORDER BY FORMULAがサーバー上で実行されないケース

投稿 by miyako on 2017-08-14, 12:19 pm

v11.2以降,ORDER BY FORMULAコマンドは,クライアントではなく,サーバー側でフォーミュラーを評価するようになりました。

http://doc.4d.com/4Dv16/4D/16/ORDER-BY-FORMULA.301-3036513.ja.html
http://doc.4d.com/4Dv16/4D/16.1/Compatibility-page.300-3373287.ja.html

v2004まで

カレントセレクションのレコードは,1件ずつ,クライアントに送信され,その評価値が並び替えのキーとしてサーバー側で使用されました。

v11.2以降

カレントセレクションのレコードは,1件ずつ,サーバー側で評価され,そのまま値が並び替えのキーとして使用されました。

新しい動きは,ネットワークトラフィックが少なくて済む,というメリットがあります。

しかし,実際に試してみると,今までどおり,フォーミュラがクライアント側で評価されているケースもあることに気づきます。カレントセレクションのレコードが,1件ずつ,クライアントに送信されていることは,ネットワークリクエストログで見れば一目瞭然です。

http://doc.4d.com/4Dv16/4D/16.1/Appendix-E-Description-of-log-files.300-3373556.ja.html

注記:付録 E「ログファイルの詳細」は,デベロッパーにとって非常に有意義な技術資料です。「ネットワークリクエストログ」とは何か,クライアント/サーバーアプリケーションの開発に不可欠なのはなぜか,といった点についてさらに知りたい方は,下記の記事をご覧ください。

https://github.com/4D-JP/4d-tips-network-analysis

これは仕様です。

技術背景

並び替えのフォーミュラにFind in arrayのような関数が使用されている場合,配列はクライアント側に存在するものなので,これをサーバー側で正しく評価するためには,配列をサーバー側に送信しなければなりません。また,並び替えのフォーミュラにコンパイルされたメソッドが含まれる場合(つまりコンパイルモード),「サーバー上で実行」メソッドプロパティが有効にされていない限り,コンパイルされたメソッドは常にクライアント側で実行されるものなので,結局のところ,設定に関係なく,フォーミュラはクライアント側で評価されることになります。それで,メソッド内でFind in arrayが使用されている場合,インタープリターモード(フォーミュラはサーバー側で評価されるが,配列が存在しないので結果がランダム)とコンパイルモード(結果は正しいが,フォーミュラはクライアント側で評価される)の動きを合わせるため,配列を使用するコマンド(代表例:Find in array)やプロジェクトメソッドが含まれるフォーミュラは,モードに関係なく,クライアント側で評価されるよう,実装が見直された経緯があります(ACI0071465: v12.3)。

miyako

投稿数 : 204
登録日 : 2016/07/05

トップに戻る Go down

前のトピックを表示 次のトピックを表示 トップに戻る


 
Permissions in this forum:
返信投稿: 不可