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

PostgreSQLが関数内でクエリを異なる方法で処理するのはなぜですか?

    PostgreSQL9.2での更新

    大きな改善がありました。リリースノートを引用しますここ :

    PostgreSQL9.1以前の元の回答

    plpgsql関数には、PREPAREと同様の効果があります。 ステートメント:クエリが解析され、クエリプランがキャッシュされます。

    利点は、呼び出しごとにいくらかのオーバーヘッドが節約されることです。
    欠点は、クエリプランが呼び出される特定のパラメータ値に対して最適化されないことです。

    データ分散が均等なテーブルに対するクエリの場合、これは通常問題なく、PL/pgSQL関数は生のSQLクエリまたはSQL関数よりもいくらか高速に実行されます。ただし、クエリでWHEREの実際の値に応じて特定のインデックスを使用できる場合 句、またはより一般的には、特定の値に対してより適切なクエリプランを選択すると、最適ではないクエリプランになってしまう可能性があります。 SQL関数を試すか、 EXECUTE 呼び出しごとにクエリを強制的に再計画します。次のようになります:

    CREATE OR REPLACE FUNCTION pie(id_param integer)
    RETURNS SETOF record AS
    $BODY$
    BEGIN        
        RETURN QUERY EXECUTE
            'SELECT *
             FROM   table_name
             where  id = $1'
        USING id_param;
    END
    $BODY$
    LANGUAGE plpgsql STABLE;
    

    コメント後に編集:

    このバリアントが実行時間を変更しない場合は、見逃した、または言及しなかった可能性のある他の要因が関係している必要があります。別のデータベース?異なるパラメータ値?詳細を投稿する必要があります。

    マニュアルから 上記のステートメントをバックアップするには:




    1. SQL Server(T-SQL)で日付から月の名前を取得する3つの方法

    2. 行の数値から1を引くSQLクエリ

    3. SqlConnection SqlCommand SqlDataReader IDisposable

    4. Typo3 V6:コンテンツ要素コンテナを作成する方法は? (テレビなし)