0

my_functionPL/PGSQL 関数 ( ) の実行を、その引数 ( my_table.x) が定義済みの間隔 ([100,1000] など) に属している場合にのみ許可したいと考えています。

次のクエリの例を見てみましょう。

(q) SELECT * FROM my_table WHERE my_function(mytable.x);

mytable.x間隔 [100,1000] に属しているかどうかを確認するために、このクエリが自動的に書き換えられることを望みます。

(q') SELECT * FROM my_table WHERE (my_table.x BETWEEN 100 AND 1000) AND my_function(my_table.x);

このコマンドEXPLAIN ANALYSEは、2 番目のクエリが最初のクエリよりも実際に高速であることを示しています。

クエリ書き換えのプロセスを自動化するためにクエリ実行プランを変更するにはどうすればよいですか (q から q')。に関連付けられた間隔 [100,1000] に関するメタデータをどこに適切に保存できmy_functionますか?

よろしくお願いします。

トーマス・ジロー

私が必要とする助けは、ファジーロジックの PostgreSQL への統合に関するプロジェクトに役立ちます: [https://github.com/postgresqlf/PostgreSQL_f/][PostgreSQLf]

4

1 に答える 1

1

それをキャッチする最速の方法は、関数本体の上部にある次のようなものです。

IF $1 BETWEEN 100 AND 1000 THEN
   -- proceed
ELSE
   RETURN NULL; -- Or what ever you want to return in this case
END IF;

これは非常に高速である必要があります。


実際のクエリの書き換えは、PostgreSQLのRULEシステムで行われます。ただし、ルールは関数ではなくテーブルとビューに適用されます。クエリをビューでラップすることもできますが、条件を明示的に追加することもできます。これはより安価です。

CREATE VIEW v_tbl_only_valid_x AS 
    SELECT *
    FROM   tbl
    WHERE  x BETWEEN 100 AND 1000;

電話:

SELECT * FROM v_tbl_only_valid_x WHERE my_function(x);

このようにして、クエリプランナーは、列のクエリの選択性に関する情報をx明示的に取得します。これにより、クエリプランが異なる場合があります。

WHEREしかし、クエリに2番目の条件を追加する方が簡単ではないでしょうq'か。

于 2012-05-24T12:39:33.037 に答える