ソートメカニズムとして機能する、テンポラリテーブルを最初のテンポラリテーブル/ソートから次のものにカスケードする機能を最適化しようとしています。最後のもの、例えば7番目の一時テーブル/ソート。plpgpsql - ソートを行うためのテンポラリテーブルの異なる形式
Gist here:この種のコードは禁止する必要があります。
WITH
ソートを実際の一時テーブル(例えば、CREATE TEMPORARY TABLE <table_name> AS SELECT col1 FROM another_table;
)に置き換えようとしています。目的は、現在の形式のクエリが非常に遅いため、パフォーマンスを向上させることです。
これは私が関数の作成は結構ですが、このよう
SELECT * FROM report.get_sa001('2017-01-01'::date, '2017-01-31'::date, 32)
機能を実行するときにこれは私が
ERROR: cannot open query CREATE TABLE AS like cursor
État SQL :42P11
Contexte : fonction PL/pgsql report.get_sa001(timestamp without time zone,timestamp without time zone,integer), ligne 11 à RETURN QUERY
持っているものである
CREATE OR REPLACE FUNCTION report.get_sa001(
IN "date_D" timestamp without time zone,
IN "date_F" timestamp without time zone,
IN frequence integer)
RETURNS TABLE(
"Period_date" timestamp without time zone,
"Site" character varying,
"Customer_code" character varying,
"Internal_reference" character varying,
"InvoiceNumber" character varying,
"Value_in_currency" numeric,
"Value_in_EUR" numeric,
"Value_Budget_in_EUR" numeric,
"Selling_price_CUR" numeric,
"Selling_price_EUR" numeric,
"Currency_code" character varying,
"Selling_quantity" numeric,
"Variance_price_CUR" numeric,
"Variance_price_EUR" numeric,
"Variance_value_CUR" numeric,
"Variance_value_EUR" numeric,
"Selling_date" timestamp without time zone) AS
$BODY$
DECLARE
p_debut timestamp without time zone;
DECLARE
p_fin timestamp without time zone;
BEGIN
p_debut = dw.get_period_end("date_D", "frequence");
p_fin = dw.get_period_end("date_F", "frequence");
RETURN QUERY
CREATE TEMPORARY TABLE "dates_1" AS
SELECT
p_debut::date + n AS "date",
dw.period_frequency(p_debut::date + n) AS "frequency"
FROM generate_series(0, p_fin::date - p_debut::date) AS x(n)
WHERE (dw.period_frequency(p_debut::date + n) & frequence != 0);
SELECT * FROM "dates_1"; -- Thanks to Vao Tsun
END;
$BODY$
LANGUAGE plpgsql STABLE
COST 100
ROWS 1000;
を提案してきた変化であり、
CREATE TEMPORARY TABLE
をSELECT * INTO TEMPORARY TABLE
に置き換えようとしました。作成はもう一度OKですが、実行時に同じエラーが発生します。
SOのアーカイブをチェックすると、一時テーブル(チェックhere)を使用してPLPGSQLが禁止していると聞きます。
アイデアがあれば、歓迎されています。
おかげ
あなたの関数はテーブルを返すように定義されていますが、クエリ 'create temporary table ...'を返します。あなたは 'SELECT * FROM" Sales_final ";"のようにスムースを追加する必要があります –
こんにちは@ VaoTsun、返信いただきありがとうございます。あなたが言及した部分を追加しましたが、そうでないようです。私は恐れています。 –
@VaoTsun実際には同じエラー –