タグ付けされた質問 「postgresql-9.4」

PostgreSQLバージョン9.4

2
PostgreSQLでマテリアライズドビューを段階的に更新する
PostgreSQLでマテリアライズドビューを段階的に更新することはできますか。つまり、新規または変更されたデータに対してのみですか。 次の表とマテリアライズドビューを検討してください。 CREATE TABLE graph ( xaxis integer NOT NULL, value integer NOT NULL, ); CREATE MATERIALIZED VIEW graph_avg AS SELECT xaxis, AVG(value) FROM graph GROUP BY xaxis 定期的に、新しい値が追加されるgraphか、既存の値が更新されます。graph_avg更新された値についてのみ、数時間ごとにビューを更新します。ただし、PostgreSQL 9.3では、テーブル全体が更新されます。これにはかなり時間がかかります。次のバージョン9.4ではCONCURRENT更新が可能ですが、ビュー全体が更新されます。何億行もあるため、これには数分かかります。 更新された新しい値を追跡し、部分的にのみビューを更新する良い方法は何ですか?


3
Postgresのマテリアライズドビューの定義を照会する
Postgresでマテリアライズドビューの定義をクエリする方法を疑問に思っています。参考までに、私がやりたいことは、通常のビューでできることと非常に似ています。 SELECT * FROM information_schema.views WHERE table_name = 'some_view'; 次の列が表示されます。 table_catalog table_schema table_name view_definition check_option is_updatable is_insertable_into is_trigger_updatable is_trigger_deletable is_trigger_insertable_into マテリアライズドビューでこれは可能ですか? これまでの私の調査から、マテリアライズドビューはinformation_schemaから意図的に除外されているようです。 information_schemaは、SQL標準に存在するオブジェクトのみを表示できます。 (http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us) それらはinformation_schemaから完全に除外されているように見えるので、私はこれについてどうするかわかりませんが、私がやりたいことは2つあります: 特定のマテリアライズドビューが存在するかどうかを照会します。(これまでのところ、これを行うことがわかった唯一の方法は、同じ名前のマットビューを作成し、それが爆発するかどうかを確認することです。) 次に、マテリアライズドビューの定義を照会します(view_definition上の列と同様information_schema.views)。

2
ビットマップインデックススキャンを使用するクエリプランの「Recheck Cond:」行
これは、コメントから前の質問へのスピンオフです。 Postgres 9.4.4クエリには永遠に時間がかかります PostgreSQL 9.4を使用すると、Recheck Cond:によるクエリプラン出力でビットマップインデックススキャンの後に常に行があるように見えますEXPLAIN。 EXPLAIN参照された質問の出力のように: -> Bitmap Heap Scan on table_three (cost=2446.92..19686.74 rows=8159 width=7) Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0)) -> BitmapAnd (cost=2446.92..2446.92 rows=8159 width=0) -> Bitmap Index Scan on table_one_timestamp_idx (cost=0.00..1040.00 rows=79941 width=0) Index Cond: ("timestamp" > (now() - '30 days'::interval)) …


3
PostgreSQLをバージョン8.4から9.4にアップグレードする方法は?
PostgreSQLをバージョン8.4から9.4にアップグレードします。 ドキュメントは、私にとって非常に明確ではありません。 アップグレードすると古いデータベースは失われますか? アップグレード後に古いデータベースを紛失した場合、どうすれば古いデータベースをバックアップできますか? psqlをアップグレードするにはどうすればよいですか? PostgreSQLはCentOS 6.6サーバーで実行されています。

2
Postgresで1時間ごとに増分バックアップを行う方法は?
単一のPostgresサーバー(Win7 64)の1時間ごとの増分バックアップを試行しています。 私は次のセットアップをしていますpostgresql.conf: max_wal_senders = 2 wal_level = archive archive_mode = on archive_command = 'copy "%p" "c:\\postgres\\foo\\%f"' (再起動) で基本バックアップを行いました pg_basebackup -U postgres -D ..\foo -F t -x フォルダーに大きなbase.tarファイルをfoo作成し、16,384 KBのファイルを追加しました。これはWALであると思われます。 私が理解していないのは、WAL fooが変わらない理由です。data/pg_xlog変更中のWAL 。pgはそれらをコピーすることになっていないのですか?どのように決定するのですか? おそらく設定する必要がありarchive_timeout=3600ますか? pg_start_backup()とpg_stop_backup()を呼び出す必要があると言っているサイト(pgのメーリングリスト、baculaのpostgresページ)を見てきましたが、それらは必須ではないと思います。本当? 二次的な質問: WALはどのくらいの頻度でdata/pg_xlog書かれますか?何が書き込みをトリガーしますか? \qpsqlでDMLを実行すると、WALが更新されるようです。または、pgAdminでテーブルを編集してからウィンドウを閉じます。私はそれがコミット時に書き込むだろうと思った。 ベストプラクティス?pg_basebackupは週に1回ですか?WALをPGと同じマシンまたはリモートマシンにアーカイブしますか?

2
検索文字列が長くなると、トライグラム検索が非常に遅くなります
Postgres 9.1データベースには、table1約150万行と1列のテーブルがありますlabel(この質問のために簡略化された名前)。 機能的なtrigram-indexがありますlower(unaccent(label))(インデックスでunaccent()使用できるように不変にされています)。 次のクエリは非常に高速です。 SELECT count(*) FROM table1 WHERE (lower(unaccent(label)) like lower(unaccent('%someword%'))); count ------- 1 (1 row) Time: 394,295 ms ただし、次のクエリは遅くなります。 SELECT count(*) FROM table1 WHERE (lower(unaccent(label)) like lower(unaccent('%someword and some more%'))); count ------- 1 (1 row) Time: 1405,749 ms また、検索がより厳密であっても、単語の追加はさらに遅くなります。 私は最初の単語のサブクエリを実行し、次に完全な検索文字列でクエリを実行する簡単なトリックを試しましたが、クエリプランナは(悲しいことに)私の陰謀を見ました: EXPLAIN ANALYZE SELECT * FROM ( SELECT id, …

1
ctidをページ番号と行番号に分解するにはどうすればよいですか?
テーブルの各行には、行の物理的な場所を表すタイプのシステム列が ctidありますtid。 create table t(id serial); insert into t default values; insert into t default values; select ctid , id from t; ctid | id :---- | -: (0,1)| 1 (0,2)| 2 ここに dbfiddle ctid最も適切なタイプ(例えばinteger、bigintまたはnumeric(1000,0))からページ番号だけを取得する最良の方法は何ですか? 私は考えることができる唯一の方法は非常に醜いです。

1
長いPL / pgSQLコード行を複数行に分割するにはどうすればよいですか?
PL / pgSQLコードの長い行を複数行に分割する方法はありますか?私のコンテキストは、次のようにテーブルに挿入を記録するトリガー関数です。 INSERT INTO insert_log (log_time, description) VALUES ( now() , 'A description. Made up of 3 semi long sentences. That I want to split, in the code, not in the log table, over 3 lines for readability.' );

2
JSONBを使用したPostgreSQLの参加
私はこのSQLを持っています: CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB); INSERT INTO test(data) VALUES ('{"parent":null,"children":[2,3]}'), ('{"parent":1, "children":[4,5]}'), ('{"parent":1, "children":[]}'), ('{"parent":2, "children":[]}'), ('{"parent":2, "children":[]}'); それは与えるだろう: id | data ----+-------------------------------------- 1 | {"parent": null, "children": [2, 3]} 2 | {"parent": 1, "children": [4, 5]} 3 | {"parent": 1, "children": []} 4 | {"parent": …

1
複数の値に対するPostgreSQL JSONクエリ配列
jsonb顧客IDの配列に対応するグループが見つかるというPostgresのタイプに対するクエリを作成します。 この例の表を考えます: CREATE TABLE grp(d JSONB NOT NULL); INSERT INTO grp VALUES ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}') , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}') , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}'); 私は同様の質問(複数の値に対するPostgreSql JSONB SELECT)を見つけ、このクエリを使用して単純な配列で必要なものを達成することができました: SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar']; ただし、配列にJSON オブジェクトが含まれている場合は動作しません: SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}']; クエリに期待することは次のとおりです。 …

2
同じ関数の同時呼び出し:デッドロックはどのように発生しますか?
私の関数new_customerは、Webアプリケーションによって1秒あたり数回(ただし、セッションごとに1回)呼び出されます。最初に行うことは、customerテーブルをロックすることです(「存在しない場合は挿入」、つまりの単純なバリアントupsert)。 ドキュメントの私の理解は、他の呼び出しは、new_customer以前の呼び出しがすべて終了するまで単純にキューに入れる必要があるということです: LOCK TABLEは、テーブルレベルのロックを取得し、競合するロックが解放されるのを必要に応じて待機します。 代わりにデッドロックが発生することがあるのはなぜですか? 定義: create function new_customer(secret bytea) returns integer language sql security definer set search_path = postgres,pg_temp as $$ lock customer in exclusive mode; -- with w as ( insert into customer(customer_secret,customer_read_secret) select secret,decode(md5(encode(secret, 'hex')),'hex') where not exists(select * from customer where customer_secret=secret) returning customer_id ) insert …

1
インデックスは `= any()`では使用されず、 `in`で使用されます
テーブルにtは2つのインデックスがあります。 create table t (a int, b int); create type int_pair as (a int, b int); create index t_row_idx on t (((a,b)::int_pair)); create index t_a_b_idx on t (a,b); insert into t (a,b) select i, i from generate_series(1, 100000) g(i) ; any演算子ではインデックスは使用されません。 explain analyze select * from t where (a,b) = …

1
日付範囲の一意性制約
pricesこれらの列を持つテーブルを考えてみましょう。 id integer primary key product_id integer -- foreign key start_date date not null end_date date not null quantity integer price numeric データベースには、日付範囲内の特定の数量で1つの価格しか持てないというルールを適用したいのですが(を介してwhere <date> BETWEEN start_date AND end_date)。 この種の範囲ベースの制約は実行可能ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.