sql >> データベース >  >> RDS >> PostgreSQL

関数ラッパーなしのクエリと比較して、SQL関数は非常に遅い

    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の場合でも) とにかくここで正しい選択です。



    1. 自動車修理店のデータモデル

    2. AzureDataStudioを使用してMacでSQLServerデータベースを復元する方法

    3. MySQLUpdate内部結合テーブルクエリ

    4. EasysoftリリースODBC-Windows10用のODBCブリッジ