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

PostgreSQLのすべてのバージョン。そのコンテキストが重要な場合は、postgresql-11などのバージョン固有のタグを追加します。

1
値がNULLのブール値に対してクエリを実行すると、予期しないシーケンススキャン
auto_review列のタイプがと呼ばれるデータベース列がありますboolean。ActiveRecord ORMを使用して作成された、そのフィールドのインデックスがあります。 CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew); フィールドにブール値を照会すると、PGは期待どおりにインデックスを使用します。 EXPLAIN for: SELECT "table".* FROM "table" WHERE "table"."auto_renew" = 'f' QUERY PLAN ---------------------------------------------------------------------------------------------- Bitmap Heap Scan on table (cost=51.65..826.50 rows=28039 width=186) Filter: (NOT auto_renew) -> Bitmap Index Scan on index_domains_on_auto_renew (cost=0.00..44.64 rows=2185 width=0) Index Cond: (auto_renew = false) (4 …

3
異なる通貨での価格の効率的な比較
ユーザーが価格帯で商品を検索できるようにしたい。ユーザーは、製品で設定されている通貨に関係なく、任意の通貨(USD、EUR、GBP、JPYなど)を使用できる必要があります。したがって、製品価格は200USDであり、ユーザーが100EUR-200EURの価格の製品を検索した場合でも、ユーザーはそれを見つける可能性があります。それを速く効果的にするには? これが私が今までやってきたことです。私は保存price、currency codeおよびcalculated_priceデフォルトの通貨であるユーロ(EUR)での価格です。 CREATE TABLE "products" ( "id" serial, "price" numeric NOT NULL, "currency" char(3), "calculated_price" numeric NOT NULL, CONSTRAINT "products_id_pkey" PRIMARY KEY ("id") ); CREATE TABLE "currencies" ( "id" char(3) NOT NULL, "modified" timestamp NOT NULL, "is_default" boolean NOT NULL DEFAULT 'f', "value" numeric NOT NULL, -- ratio additional …
10 postgresql  money 

4
(変数値に基づいて)条件付きでpsqlスクリプトを停止する方法は?
次の例を考えてみましょう(psqlスクリプトの最初から)。 \c :db_to_run_on TRUNCATE the_most_important_table; -- tried to avoid similarities to anything that exists out there これをコマンドで実行すると psql [connection details] -v db_to_run_on=\'dev_database\' その後、それは実行され、ユーザーは満足しています。しかし、もし彼が特定することを決定した場合はどうなります-v db_to_run_on=production_databaseか?(人々がrm -rf / # don't try this at home!!!たまに実行するように、これが起こる可能性があると仮定しましょう。)うまくいけば、そのテーブルの新しいバックアップがあるでしょう... したがって、問題が発生します。スクリプトに渡された変数を確認し、その値に基づいて以降の処理を停止する方法は?
10 postgresql  psql 

4
サブクエリに正確に1つの異なる結果と指定された値があるかどうかを簡潔に確認するにはどうすればよいですか?
私は次のように書いていることに気づきました: select 'yes' where exists(select * from foo where val=1) and not exists(select * from foo where val<>1); 読みやすさを犠牲にせずにもっと簡潔な方法があるかどうか疑問に思っています。 回答として投稿している方法を1つ見つけましたが、完全に満足しているわけではなく、代替案に非常に興味があります。 この場合valは一意ですfoo-重複はありません

1
PostgreSQLデータ型textとvarcharの長さなし
PostgreSQL では、次のようにデータ型文字が可変(長さ精度なし)またはテキストで列を作成できます。 ALTER TABLE test ADD COLUMN c1 varchar; ALTER TABLE test ADD COLUMN c2 text; これら2つのデータ型に違いはありますか? ドキュメントはそれについて明確ではありません。彼らが言う : 文字指定が長さ指定子なしで使用される場合、型は任意のサイズの文字列を受け入れます。 [...] さらに、PostgreSQLは、任意の長さの文字列を格納するテキストタイプを提供します。 これら2つのデータ型は同等であるようですが、明示的ではありません...これについての詳細情報? ありがとう、ニコ

2
あるテーブルを別のテーブルの「エイリアス」または「シンボリックリンク」にすることはできますか?
同じ構造の2つのテーブルAとBがあります。特定のアプリケーションは、常に両方のテーブルに同じデータを書き込むように作成されています。 ドライブスペースを節約する可能性について同僚と話し合った後、mysqlまたはpostgresqlが別のテーブルの「エイリアス」または「シンボリックリンク」としてテーブルに作成できるかどうか疑問に思っています。 ソフトファイルのシンボリックリンクの動作と非常によく似た動作にしたい。シンボリックリンク自体またはそのターゲットのいずれかから読み取ると同じ出力が生成され、どちらかに書き込むとターゲットが更新されます。
10 mysql  postgresql 

2
複数列のPostgres全文検索、なぜ実行時ではなくインデックスで連結するのですか?
ここ数日、postgresで全文検索を行ったことがありますが、複数の列を検索するときのインデックス付けについて少し混乱しています。 postgresのドキュメントではts_vector、次のように、連結された列にインデックスを作成する方法について説明しています。 CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); 私はそのように検索できます: ... WHERE (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo')) ただし、タイトルだけ、本文だけ、または両方を検索する場合は、3つの個別のインデックスが必要になります。そして、3番目の列に追加すると、6つのインデックスになる可能性があります。 私がドキュメントで見たことのない別の方法は、2つの列に別々にインデックスを付けてから、通常のWHERE...ORクエリを使用することです。 ... WHERE (to_tsvector('english', title) @@ to_tsquery('english','foo')) OR (to_tsvector('english', body) @@ to_tsquery('english','foo')) 100万行までの2つをベンチマークしても、基本的にパフォーマンスに違いはないようです。 だから私の質問は: 列を個別にインデックス付けするだけでなく、このようにインデックスを連結したいのはなぜですか?両方の長所と短所は何ですか? 私の推測では、事前に両方の列だけを検索したい場合(一度に1つずつではない)は、どちらが少ないメモリを使用するかを連結することで1つのインデックスしか必要としないでしょう。

2
PostgreSQLは大文字と小文字を区別するデータベースを作成できますか?
一部のコードを一部のバージョンのSybaseからPostgreSQLに移植しています。これは、Sybaseクライアントライブラリを使用するCアプリケーションです。私のアプローチは、呼び出しdbsqlexec()をPQexec()(たとえば)に変換する変換レイヤーを記述することです。その部分はほとんど機能しています。 Sybaseデータベースは、(データベースオブジェクト名に関して)大文字と小文字を区別する方法で設定されているようです。たとえば、WIDGETテーブルとテーブルの両方がありwidgetます。このアプリケーションの規則は、すべて大文字の名前が実際のデータテーブルを示し、小文字の名前は処理を実行するときに一時テーブルとして使用されるようです。 4.1字句構造によると、「キーワードと引用符で囲まれていない識別子は大文字と小文字が区別されません。」識別子を二重引用符で囲んで小文字への自動折りたたみを無効にできることはわかっていますが、何十億行にもわたって手動で行う必要はありませんこのデータベースを使用するコードの。 データベースオブジェクト識別子のこの自動大文字小文字変換を無効にするようにPostgreSQLを設定する方法はありますか? 私の代替案は、各SQLステートメントを調べ、すべての識別子(キーワードではない)を二重引用符で囲むコードを記述することです。

2
PostgreSQL:テーブルへの最終アクセス時刻
私は、数十のテーブルを持つ大規模なPostgreSQLデータベースを担当しています。これらのテーブルの多くは決してアクセスされないと思います。 特定のテーブルに最後にアクセスしたのがいつかを確認する最良の方法は何ですか?私は上のトリガーを追加することを考えDELETE、INSERTそしてUPDATE、私は、より効率的な方法があると思います。
10 postgresql 

5
PostgreSQLデータベースが最後に変更された日時を特定する
私はバックアップがどのように行われるかを変更することを検討しており、postgreqlクラスター内のどのデータベースが最近変更されていないかを判断する方法があるかどうか疑問に思っていますか? pg_dumpallを使用する代わりに、pg_dumpを使用して、最後のバックアップ以降に変更されたデータベースのみをダンプします(一部のデータベースは頻繁に更新されません)。変更がない場合、現在のバックアップは、まだ良い。 特定のデータベースが最後に更新/変更された時期を判別する方法を知っている人はいますか? ありがとう... 更新: 1つの特定のクラスターでのデータベースの作成(データベース内のdbオブジェクトの作成はもちろん)を制御できないため、場所全体にトリガーを記述する必要がないことを望んでいました。 さらに掘り下げてみると、$ PGDATA / global / pg_databaseファイルの内容(特に2番目のフィールド)と$ PGDATA / baseの下のディレクトリ名の間に相関関係があるようです。 実際、pg_databaseファイルの2番目のフィールドはデータベースoidであり、各データベースには$ PGDATA / baseの下に独自のサブディレクトリがある(サブディレクトリ名はoidである)と思います。あれは正しいですか?もしそうなら、バックアップを必要とするトリガーとして$ PGDATA / base / *の下のファイルからのファイルのタイムスタンプを使用することは理にかなっていますか? ...またはより良い方法はありますか? 再度、感謝します...




2
測定単位を変換する
物質が異なる(ただし互換性のある)単位体積で与えられている物質のリストに最も適した測定単位を計算しようとしています。 単位換算表 単位変換テーブルには、さまざまな単位とそれらの単位の関係が格納されています。 id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 係数でソートすると、parent_id子ユニットが上位の数値にリンクされていることがわかります。 このテーブルは、PostgreSQLで以下を使用して作成できます。 CREATE TABLE unit_conversion ( id …

3
nullにできないフィールドに対してPostgreSQLでNOT NULLを指定しないことの結果は何ですか?
私はアプリケーションを持っています(データはPostgreSQLに格納されています)。テーブルのフィールドの大部分は常にnullではありませんが、これらのテーブルのスキーマはこれを強制しません。たとえば、次の偽のテーブルを見てください。 CREATE TABLE "tbl" ( "id" serial, "name" varchar(40), "num" int, "time" timestamp PRIMARY KEY ("id"), UNIQUE ("id") ); またname、num、time明示的として記載されていないNOT NULL彼らが実際に執行はアプリケーション側で起こるので、。 私の感覚では、それを変更する必要があると感じていますが、反対に、アプリケーションレベルでは、null値がここに表示されないようにし、他の誰も手動でテーブルを変更しないようにします。 私の質問は次のとおりです。明示的なNOT NULL制約? 私たちは適切なコードレビュープロセスと適度に優れたドキュメントを持っているので、新しい人がこの制約を破る何かをコミットする可能性は、変更を正当化するには実際には十分ではありません。 これは私の決定ではないので、これがまさに私が他の正当化を求めている理由です。私の意見では、何かがnullになり得ず、データベースで何かがnullでないことを指定できる場合、それを行うだけです。特に変更が非常に簡単な場合。

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