Tips

絞り込みクエリを単一のクエリにまとめることの利点

日付2009/04/24
ID09-043
バージョン11
プラットフォームWin & Mac

下記は典型的なクエリ文です。はじめにQUERYでレコードのセレクションを作成し、次いで複合的なQUERY SELECTIONを実行することにより、絞り込みをかけています。構文は非常に明快ですが、果たしてこれは最適のパフォーマンスを約束するコーディングでしょうか。

QUERY([Table_1];[Table_1]Field_A=a;*)
QUERY([Table_1];&;[Table_1]Field_B=b)
QUERY SELECTION([Table_1];[Table_1]Field_C=c;*)
QUERY SELECTION([Table_1];|;[Table_1]Field_D=d)

同じ条件を次のように書き換えてみましょう。

QUERY([Table_1];[Table_1]Field_C=c;*)
QUERY([Table_1];|;[Table_1]Field_D=d;*)
QUERY([Table_1];&;[Table_1]Field_A=a;*)
QUERY([Table_1];&;[Table_1]Field_B=b)

4Dのクエリ解析エンジンの特性として、4Dはクエリ条件を前のクエリ条件とグループ化し、クエリプランとクエリパスを構築しています。したがって、A | B | C は、(A | B) | Cとして評価されます。結果として次のようになります。

A = A
(A) | B = A | B
((A) | B) | C = A | B | C
(((A) | B) | C) & D = (A | B | C) & D
((((A) | B) | C) & D) & E = (A | B | C) & D & E
(((((A) | B) | C) & D) & E) | F = ((A | B | C) & D & E) | F

つまり、同じ論理演算子が続く限り、特別な細工をしなくても、ブールロジックの性質により、それらは適切にグループ化されるという意味です。

書き換えられたクエリは、必ずしも人間の自然な論理順序どおりというわけではないため、抵抗を感じるかもしれません。4Dの内部で実行されるグループ化の仕組みを理解していれば、このような効率的なクエリを書くことができます。一般的にいって、クエリプランはふたつ作るよりもひとつで済ませたほうが効率的です。