不久前我遇到了这个错误,我对两件事很好奇 -
1- postgres 的内部机制如何首先导致此消息发生?与数据库创建的临时文件的创建有关的哈希连接是什么?我知道这与创建一个超出数据库内存分配范围的临时文件有关,但我不知道为什么将其称为散列连接。
2- 我怎样才能预测和防止将来发生这样的错误(与性能和内存有关)?
postgresql performance postgresql-9.1 temporary-tables postgresql-performance
我正在处理启用了intarray扩展的 Postgres 9.4项目。我们有一个看起来像这样的表:
items
-------------------------------------
id name tag_ids
--------------------------------------
1 a car {1,4}
2 a room to rent {1}
3 a boat {1,2,4,11}
4 a wine {2}
5 emily {3}
Run Code Online (Sandbox Code Playgroud)
如果可能,我想对标签 ID 进行分组。就像获取具有tag_id“{1,2,4,11}”的所有元素的计数
tag_id count
1 3
2 2
4 2
11 1
Run Code Online (Sandbox Code Playgroud)
这可能吗?我会认为这样的交叉点:
select * from items where tag_ids && '{1,2,4,11}'
Run Code Online (Sandbox Code Playgroud)
但我需要按交集结果内的数组元素进行分组。如果我按 tag_ids 分组,它只是唯一值。
我该怎么做?
PostgreSQL newbie here trying to put together a transactional DDL script to atomically create a database and its schema in Postgres 9.3: in a transaction, create a few tables; if any errors, roll the whole thing back; otherwise commit. I'm having a hard time getting the syntax right, and I suspect my problems might stem from conflating SQL DDL with PL/pgSQL and/or not grokking the transaction semantics.
Long story short, what's the PL/pgSQL boilerplate for a script to do something …
我在 Postgres 9.4.1 中有两个表,events并event_refs具有以下模式:
events 桌子
CREATE TABLE events (
id serial NOT NULL PRIMARY KEY,
event_type text NOT NULL,
event_path jsonb,
event_data jsonb,
created_at timestamp with time zone NOT NULL
);
-- Index on type and created time
CREATE INDEX events_event_type_created_at_idx
ON events (event_type, created_at);
Run Code Online (Sandbox Code Playgroud)
event_refs 桌子
CREATE TABLE event_refs (
event_id integer NOT NULL,
reference_key text NOT NULL,
reference_value text NOT NULL,
CONSTRAINT event_refs_pkey PRIMARY KEY (event_id, reference_key, reference_value),
CONSTRAINT event_refs_event_id_fkey FOREIGN KEY (event_id) …Run Code Online (Sandbox Code Playgroud) postgresql performance execution-plan group-by postgresql-9.4 postgresql-performance
使用 PostgreSQL。
有一个触发器,它在删除后做一些事情,并制定了一个规则,如果某些事情是真的,则停止删除。
我的问题是:该规则是否也会阻止触发器的发生?
触发器定义:
CREATE TRIGGER wypo AFTER INSERT ON "Wyp" FOR EACH ROW EXECUTE PROCEDURE funk_wyp();
Run Code Online (Sandbox Code Playgroud)
触发功能
CREATE OR REPLACE FUNCTION funk_wyp() RETURNS TRIGGER AS '
DECLARE
dodatek real := (SELECT f.cena FROM filmy f WHERE f.ID = NEW.co);
BEGIN
UPDATE "zyskiklient"
SET "ile" = ile + dodatek
WHERE kto = NEW.kto;
UPDATE "istotnoscklienta"
SET "poziom" = (SELECT poziom(NEW."kto"))
WHERE "kto" = NEW.kto;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
规则:
CREATE OR REPLACE RULE zasada_delete_konto
AS ON DELETE …Run Code Online (Sandbox Code Playgroud) 我正在使用pg_dump转储大型(396 GB)PostgreSQL 数据库:
pg_dump --clean --create mydatabase
Run Code Online (Sandbox Code Playgroud)
运行一天后,语句失败ERROR: compressed data is corrupt并pg_dump退出。
100% 的数据完整性不是我的首要任务。这可能只是一个断行阻止我移动或备份一个需要数周时间创建的数据库。输了那行我没问题。
有什么方法可以创建忽略此类数据错误的转储?我在pg_dump文档中什么也没找到。
如果没有,如何查找并删除表中所有损坏的行?其他表中的行指向它们,也需要删除。
所以我有这个 pgbouncer 配置:
[databases]
my_db = host=10.10.10.10
my_db_with_conn_limit = host=10.10.10.10 dbname=my_db pool_size=55
max_client_conn = 300
default_pool_size = 65
reserve_pool_size = 5
reserve_pool_timeout = 1
Run Code Online (Sandbox Code Playgroud)
目标是限制来自特定应用程序的连接数 - 当数据库名称为 database_with_conn_limit 时,只允许 55 个连接。
基本上,这些应用程序是相同的,但我希望其中一个限制连接,另一个获取任意数量的连接。
使用 PostgreSQL 9.5。似乎 Postgres 与它比较类似于??. 一个唯一的约束是考虑一些相等的字符串,GROUP BY而这些字符串是不同的。
我有一个GROUP BY在TEXT列上使用的选择查询和在其他一些列上使用的聚合函数以确保TEXT输出中列的唯一性,并且我将结果插入到具有主键(因此是唯一的)约束的表中这TEXT列。
看起来与此相似;为简单起见,我刚刚更改了表名:
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT
sq1.string string, sq2.score / sq1.score
FROM
(
SELECT n.string string, SUM(n.score) score
FROM
othertable1 n % has string TEXT (non-unique) and score INT
GROUP BY string
) sq1,
(
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score …Run Code Online (Sandbox Code Playgroud) 我正在进入我的神秘查询的下一个级别。看起来在一个存在的内部有一个子选择,但在同一个表上。我认为这可能可以通过INNER JOIN更高的方式简化。
使用 PostgreSQL 9.4.2。
表定义 ( /d+):https : //gist.github.com/neezer/879f5d3649ca1903c6f3
基数:
billing_pricequote: 1,462,625 行
billing_pricequotestatus: 3,331,657 行
billing_lineitem: 43,687,855 行
这是原始查询,不建议对里面的子EXISTS查询进行修改:
SELECT i.quote_id, i.acct_id AS account_id, SUM(i.delta_amount) AS amt
FROM billing_lineitem i
INNER JOIN billing_pricequote pq ON i.quote_id = pq.id
WHERE pq.date_applied AT TIME ZONE 'PST' BETWEEN '2016-02-02T00:00:00'::timestamp
AND '2016-03-03T22:27:41.734102-08:00'::timestamptz
AND EXISTS(
SELECT s1.quote_id
FROM billing_pricequotestatus s1
INNER JOIN (
SELECT DISTINCT ON (quote_id) quote_id, MAX(created_at) AS max_created_at …Run Code Online (Sandbox Code Playgroud) postgresql performance timestamp greatest-n-per-group postgresql-performance
postgresql ×10
performance ×3
aggregate ×1
array ×1
backup ×1
ddl ×1
group-by ×1
join ×1
pg-dump ×1
pgbouncer ×1
plpgsql ×1
timestamp ×1
transaction ×1
trigger ×1
unicode ×1