問題タブ [postgresql-10]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - パラメータとして関数に渡されたときに now() はどのように評価されますか
タイムゾーン フィールドを使用してタイムスタンプで範囲分割されたテーブルがあります。次の where 条件により、プランナーがパーティション内のすべての「子」テーブルをクエリするようになったことに非常に驚きました。
私が学んだように、プランナーは実行時に now() がどうなるかを知らないため、すべての子テーブルを照会するプランを生成します。それは理解できますが、そもそもパーティションを設定する目的に反します! reading_time > '2018-03-31' を発行すると、これらの条件を満たすデータを含むテーブルのインデックス スキャンのみが実行されます。
次の関数を作成するとどうなりますか
次に、関数を呼び出すことができます
now() はいつ評価されますか? 言い換えれば、リテラル時間値 (例: 2018-03-31 1:01:01+5) が関数に渡されますか? それがリテラル値の場合、Postgres は適切な子テーブルのみをクエリしますよね? しかし、関数内で now() を評価している場合は、すべての子テーブルのインデックスをスキャンする計画に戻ります。プランナーが関数内で何をしているのかを確認するのは簡単ではないようです。あれは正しいですか?
postgresql - データベースの移行中にテーブルが ALTER された後、関数を返すテーブルを「再コンパイル」できますか?
レコード タイプを返すストアド プロシージャがあります。このストアド プロシージャが返すテーブルを ALTER する場合 (たとえば、列を追加するとします)、データベース セッションを切断するか、CREATE OR REPLACE
. そうしないと、エラーが発生しますwrong record type supplied in RETURN NEXT
。
単一のpsql
セッションで実行すると失敗するスクリプトを次に示します。
ストアド プロシージャの再コンパイルを自動化できる Postgres コマンドまたは設定はありますか? 移行後に実行するという @vao-tsun の提案を試しましDISCARD PLANS
たが、残念ながら役に立ちませんでした。