postgresqlで実行計画の操作の順序を手動で変更することは可能ですか? たとえば、フィルタリングの前に常に順序付け操作を行いたい場合 (postgresql の通常の使用では意味がありませんが)、操作の内部コストを変更するなどして手動で強制することは可能ですか?
独自の関数を実装するとどうなりますか? そのような関数を常にSQLステートメントの最後で実行することは可能ですか?
postgresqlで実行計画の操作の順序を手動で変更することは可能ですか? たとえば、フィルタリングの前に常に順序付け操作を行いたい場合 (postgresql の通常の使用では意味がありませんが)、操作の内部コストを変更するなどして手動で強制することは可能ですか?
独自の関数を実装するとどうなりますか? そのような関数を常にSQLステートメントの最後で実行することは可能ですか?
サブクエリまたはCTEを使用して、特定の操作を最初に強制します。お気に入り:
SELECT *
FROM (
SELECT *
FROM tbl
LIMIT 10
) x
ORDER BY 1;
もちろん、自分が何をしているのかを理解する必要があります。この例では、任意の 10 行を選択し、最初の列で並べ替えています。
サブクエリの複数のレイヤーまたは複数の CTE を連続して使用できます。
CTE と同じ例:
WITH x AS (
SELECT *
FROM tbl
LIMIT 10
)
SELECT *
FROM x
ORDER BY 1;
通常、単純なクエリの場合はサブクエリの方が高速です。CTE は追加機能を提供します (異なるクエリ レベルの複数の場所で同じ CTE を再利用するなど)。
他にも方法があります - いくつかはここに示されていますが、処理の最後に関数呼び出しを移動する場合は、COST をより高い値に設定するだけの 2 番目の方法があります。カスタム関数のデフォルトは 100 ですが、より高い値を設定できます。
CREATE OR REPLACE FUNCTION public.test()
RETURNS integer
LANGUAGE plpgsql
IMMUTABLE COST 1000 -- very expensive function
AS $function$
declare i int;
declare j int;
begin
i := 1;
while i < 10000 loop
j := 1;
while j < 1000 loop
j := j + 1;
end loop;
i := i + 1;
end loop;
return i;
end;
$function$