2

複雑なクエリを生成する解析ソフトウェアを作成しています。 where句を作成すると、同じデータベースフィールドに複数の制約が追加されることがあります。私はPostgreSQLが複数の制約を単純なものに書き換えるかどうか疑問に思っていました。私はいくつかのテストを行いました:postgresqlでのAND条件の最適化

SELECT COUNT(id) FROM employee WHERE age BETWEEN 18 AND 40; 

私はこれを10回実行し、平均所要時間は65msでした。今、私は最適化するために、少し長いが、ささいなクエリを作る:

SELECT COUNT(id) FROM employee WHERE 
(age BETWEEN 18 AND 40) AND 
(age BETWEEN 18 AND 40) AND 
(age BETWEEN 18 AND 40); 

このクエリはたくさん遅いれ、平均で100ミリ秒かかります。また、次のクエリ:それは同等ですながら

SELECT COUNT(id) FROM employee WHERE 
(age BETWEEN 28 AND 70) AND 
(age BETWEEN 25 AND 40) AND 
(age BETWEEN 22 AND 33) AND 
(age BETWEEN 18 AND 30); 

は、平均で105msを取ります

SELECT COUNT(id) FROM employee WHERE age BETWEEN 28 AND 30; 

倍の速度で実行されました。

これらのクエリは意味的に同等であり、プランナがそれらに接触する前に、それらが同じクエリに最適化されることを期待していました。これは、クエリー・リライタにとっては、果敢なものではないようです。どのような隠し設定オプションがありますか?私はpostgresql 9.4.5を使用しています。

ありがとうございました!

答えて

1

オプティマイザは連続した範囲を一緒に折り畳まない。このようなデータ型レベルの分析は行われません。

PostgreSQLは、整数、浮動小数点値、またはテキスト文字列の範囲をテストする場合、実際には気にしません。このような範囲の折り畳みは、離散的なカウント可能な序数であるタイプに対してのみ正しいでしょう。あなたが浮動小数点の値のようにそれを試した場合、あなたは微妙に答えを得るかもしれません。

PostgreSQLは、これが安全であるための要件を満たすタイプがわからないため、実行できません。また、クエリプランナで実行されるすべての最適化には、最適化が適用されるかどうかを確認するための計算コストがあり、計画コストと実行コストとの間にトレードオフがあります。

TL; DR:このケースはプランナーによって自動最適化されません。

将来: PostgreSQLのバージョンとexplain (buffers, analyze)のクエリ/クエリの出力を提供します。

関連する問題