user
関数を書き直しているときに、ここに列エイリアスを追加したことに気付きました:
SELECT
...
auth_user.email AS user,
customers.name AS customer,
..これは何もしません そもそも、これらのエイリアスは関数の外部では表示されず、関数の内部では参照されないためです。したがって、それらは無視されます。文書化の目的で、コメントを使用することをお勧めします。
ただし、クエリが無効になることもあります 、user
完全に予約語です 二重引用符で囲まない限り、列のエイリアスとして使用することはできません。
奇妙なことに、私のテストでは、関数は無効なエイリアスで機能しているようです。おそらくそれが無視されるためです (?)。しかし、これが副作用をもたらす可能性があるかどうかはわかりません。
関数が書き直されました(それ以外は同等):
CREATE OR REPLACE FUNCTION get_web_events_by_userid(int)
RETURNS TABLE(
id int
, time_stamp timestamptz
, description text
, origin text
, userlogin text
, customer text
, client_ip inet
) AS
$func$
SELECT w.id
, w.time_stamp
, w.description
, w.origin
, u.email -- AS user -- make this a comment!
, c.name -- AS customer
, w.client_ip
FROM public.auth_user u
JOIN public.auth_web_events w ON w.user_id_fk = u.id
JOIN public.customers c ON c.id = u.customer_id_fk
WHERE u.id = $1 -- reverted the logic here
ORDER BY w.id DESC
$func$ LANGUAGE sql STABLE;
明らかに、 STABLE
キーワードが結果を変えました。 機能の変動性 あなたが説明するテスト状況では問題にはならないはずです。この設定では、通常、単一の分離された関数呼び出しにはメリットがありません。マニュアルで詳細をお読みください。また、標準のEXPLAIN
内部で何が起こっているかについてのクエリプランは表示されません 関数。追加のモジュール自動説明を使用できます そのために:
- pgpsqlで記述されたUDF呼び出しのPostgresクエリプラン
非常に奇妙なデータ分布があります :
auth_web_eventsテーブルには100000000レコード、auth_user-> 2レコード、customers->1レコード
があります
他に定義しなかったため、この関数は1000行の推定値を想定しています。 返されます。ただし、関数は実際には2行しか返しません。 。すべての呼び出しが(近くの)2行のみを返す場合は、ROWS 2
を追加して宣言するだけです。 。 VOLATILE
のクエリプランを変更する可能性があります バリアントも同様です(STABLE
の場合でも) とにかくここで正しい選択です。