* Last Updated
4D 2004では、フォーミュラはレコードごとにシーケンシャルに評価されます。
4D v11 SQLは、クエリを最適化するためにあらかじめフォーミュラを分析します。構文アナライザはクエリのシーケンシャルな部分を減少させることで最適化可能なフォーミュラを特定することができます。
私たちのテストケースでは、顧客の地理的な位置 (緯度と経度による位置)を使用します。特定のポイントの10km以内にはいる顧客を見つけたいとします。"Distance"関数により、2地点間の直線距離を知ることができます。
注: ここでは地球表面のおおよその距離を測る手段を使用しています:
Square root(((Abs($1-$3)/Radian)*6378)^2)+(((Abs($2-$4)/Radian)*6378)^2))
もし正確に距離を図りたいなら、計測方法を変更することもできます。
QUERY BY FORMULA (distance($latitude;$longitude;[customer]latitude;
[customer]longitude)<10)
4D v11 SQLでは、10,000の顧客に対するフォーミュラによるクエリで、7レコードが556ミリ秒で検索されました。これは4D 2004と比較して、特段よいという状況ではありません。検索はシーケンシャルで行われる必要があり、ファイル全体を走査しているからです。
しかしもし開始位置に対応する都市を制限することで、クエリを事前にフィルタできるとしたら、とても異なる結果が得られます:
QUERY BY FORMULA([customer];([customer]city=$city) & (distance($latitude;
$longitude;[customer]latitude;[customer]longitude)<10))
この効果により、4D v11 SQLはインデックスフィールド[customer]Cityを使用して、検索の対象を減らすことができることを識別します。この場合、42レコードまでに減少させることができます。
そして式の残りの部分がこのセレクションに対して適用され、クエリは7レコードを8ミリ秒で検索します。これは70倍も速くなっています!
ここで4D 2004との差異が大きくなっています: 4D v11 SQLと異なり、4D 2004は特定の都市を使用してシーケンシャルな検索を減少させることはできません。最初の検索と同様、データ全体をひとつづつ評価する必要があります。
QUERY BY FORMULAのパフォーマンスはもちろんリクエストのタイプなどの条件により異なります。しかし開発者は4D v11 SQLのクエリアナライザを使用して、すべての可能な最適化を自動で探すことができます。