Questions tagged «postgresql»

PostgreSQL的所有版本。如果该上下文很重要,请添加其他特定于版本的标记,例如postgresql-11。

1
PostgreSQL中的多个主键
我有下表: CREATE TABLE word( word CHARACTER VARYING NOT NULL, id BIGINT NOT NULL, repeat INTEGER NOT NULL ); ALTER TABLE public.word OWNER TO postgres; ALTER TABLE ONLY word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id); 当我尝试使用以下命令还原它时: psql -U postgres -h localhost -d word -f word.sql 它给了我这个错误: 不允许表“ word”使用多个主键 如何在postgres中使用多个主键?

3
如果两个过程尝试同时同时刷新材料视图,会发生什么?
根据文档: 同步刷新实例化视图,而不会锁定实例化视图上的并发选择。(...) ...其他内容... 即使使用此选项,一次也只能针对任何 一个实例化视图运行一次REFRESH。 我有一个功能,可以检查上次刷新时间以进行材料视图,如果超过60秒,它将刷新它。 但是,如果我尝试同时从两个单独的进程中刷新实例化视图,将会发生什么?他们会排队还是会引发错误? 有没有一种方法可以检测何时刷新了材料视图,因此避免触摸它? 目前,我在刷新之前将表记录填充(设置refreshing为true),然后false在过程完成时将其设置为。 EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id; 然后,每当我调用此过程时,我都会检查最新过程last_update及其refreshing值。如果refreshing为true,则不要尝试刷新实例化视图。 EXECUTE 'SELECT extract(epoch FROM now() - (last_update))::integer, refreshing FROM refresh_status ORDER BY …

1
在PostgreSQL中取消(AUTO)VACUUM进程是否会使所有工作无效?
在某些场合,并作出巨大的后update,insert或delete从一个表,我已经开始了VACUUM FULL ANALYZE,以确保DB没有得到太臃肿。在生产数据库中进行操作使我发现这不是一个好主意,因为我可能会长时间阻塞该表。因此,我取消了此过程,可能只是尝试了一下VACUUM(未完成),或者AUTOVACUUM稍后再做任何可以做的事情。 问题是:如果我在中途停止VACUUM或AUTOVACUUM,是否已经完成所有处理? 例如,如果VACUUM已经找到1 M死行而我停止了,所有这些信息会丢失吗?VACUUM是否以完全事务性的方式工作(“全部或全部”,就像很多PostgreSQL进程一样)? 如果可以安全地中断VACUUM而不会丢失所有工作,那么有什么方法可以使vacuum工作逐步进行?[工作100毫秒,停止,等待10毫秒,以便不阻塞世界其他地方...依此类推]。我知道您可以通过调整自动真空参数来完成部分操作,但是我正在考虑能够以编程方式控制此操作,以便能够在特定时间/特定条件下执行此操作。 注意:在这种情况下,停止/取消/终止进程意味着: 如果使用pgAdmin,请按“取消查询”按钮。 如果以编程方式工作,请调用pg_cancel_backend()。 我认为两者是等效的。我还没有使用过任何shell /系统级的kill命令。

2
在Postgres中什么是“转换表”?
描述Postgres 10中新功能的页面提到“触发器的转换表”。 触发器的转换表 AFTER STATEMENT通过适当地向查询公开新旧行,此功能使触发器既有用又高效。在使用此功能之前,AFTER STATEMENT触发器无法直接访问这些触发器,并且变通办法是拜占庭式的并且性能较差。现在,可以将许多触发逻辑编写为AFTER STATEMENT,从而避免了对FOR EACH ROW触发器所需的每一行进行昂贵的上下文切换的需要。 什么是过渡表?

2
[FROM x,y]在Postgres中是什么意思?
我刚刚开始使用Postgres。阅读此文档时,我遇到了以下查询: SELECT title, ts_rank_cd(textsearch, query) AS rank FROM apod, to_tsquery('neutrino|(dark & matter)') query WHERE query @@ textsearch ORDER BY rank DESC LIMIT 10; 我可以理解此查询中的所有内容,但以下内容除外:FROM apod, ...。 这,是什么意思?我习惯于联接,但不能联接多个FROM用逗号分隔的语句。 我在网上搜索无济于事。在查看并思考之后,在我看来,它正在声明一个名为query的变量,因此它可以多次使用。但是,如果这是真的,那又有什么关系FROM呢?
12 postgresql  join 

3
非常慢的简单JOIN查询
简单的数据库结构(用于在线论坛): CREATE TABLE users ( id integer NOT NULL PRIMARY KEY, username text ); CREATE INDEX ON users (username); CREATE TABLE posts ( id integer NOT NULL PRIMARY KEY, thread_id integer NOT NULL REFERENCES threads (id), user_id integer NOT NULL REFERENCES users (id), date timestamp without time zone NOT NULL, …


1
事务ID换行后,如何比较xmin和txid_current()?
除其常规列外,Postgres表还具有各种可用的系统列。其中一个xmin存储用于创建行的事务ID。它的数据类型是xid,一个四字节整数,在某个点回绕(即不一定唯一)。该函数txid_current()依次返回当前事务ID,但返回as bigint,因为它“用“ epoch”计数器扩展,因此在安装期间不会回绕”(引用手册)。 如果尚未发生事务折回,则两个值似乎匹配: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) 但是我想知道:这两个值是否总是可比的?据我了解,txid_current()在交易ID换行后(最多2 ^ 32个交易),将继续提供唯一的值,并且xmin将从零开始。这意味着两者都开始在那个时候返回不同的值? 如果是这样,是否有一种方法可以提取结果的常规xid值txid_current(),使其与xmin表中的条目匹配(例如,转换txid_current()为整数)? 编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。

1
postgres_fdw性能慢
以下针对外部对象的查询大约需要5秒钟才能在320万行上执行: SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode") FROM "IntterraNearRealTimeUnitReflexes300sForeign" x WHERE x."IncidentDateTime" >= '05/01/2016' GROUP BY x."IncidentTypeCode" ORDER BY 1; 当我在普通表上执行相同的查询时,它将在0.6秒内返回。执行计划完全不同: 普通表 Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1) Sort Key: "IncidentTypeCode" Sort Method: quicksort Memory: 25kB -> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 loops=1) Group Key: "IncidentTypeCode" -> Bitmap Heap …

2
在psql中使用\ dt(+)时,为什么看不到表(PostgreSQL)?
我已经按照以下方式donor在架构中创建了表reference: CREATE TABLE reference.donor ( donor_code smallint PRIMARY KEY, donor_name character varying NOT NULL, donor_type smallint REFERENCES reference.donor_type (type_id), alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code) ); 我已经按照以下表格填充了表格: INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code) SELECT donor_code, donor_name, donor_type, alpha_2_code FROM reference.donor_template; 当我跑步时: \dt+ reference.* 在psql里面我看到reference.donor表格: List of relations Schema | Name …

1
将两个事件表合并为一个时间表
给定两个表: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); 我想编写一个查询,对于回报值ts,foo以及bar代表最新的值的统一视图。换句话说,如果foo包含: ts | foo -------- 1 | A 7 | B 并bar包含: ts | bar -------- 3 | C 5 | D 9 | E 我想要一个返回的查询: ts | foo | bar -------------- 1 | A …

1
为什么SELECT *比按名称选择所有列(以不同的列顺序)要快得多?
在具有a,b,c,d,e,f,g,h,i,j,k列的表上,我得到: select * from misty order by a limit 25; Time: 302.068 ms 和: select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25; Time: 1258.451 ms 有没有一种方法可以使按列选择速度如此之快? 更新: 在表上没有索引,新创建了一个 这是EXPLAIN ANALYZE,似乎不太有用: explain analyze select * from misty order by a limit 25; Limit (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1) …

2
为什么在Postgres的EC2上使用RDS?
我有一个当前在EC2上运行的数据库。由于我必须将其移至更大的计算机,因此出现了使用RDS的问题。 价钱: 我可以获得一个EC2 c3.large实例,其中包含两个SSD(每个16GB),两个vCPU和4GB的按需存储,每小时的费用为0.132 USD [1]。 最接近(考虑价格)的RDS机器的价格db.m3.medium为每小时0.125美元(Single-AZ)[2]。该计算机具有相同的内存量,但只有一个vCPU [3]。另外,我将不得不为存储和io [2]支付费用。 因此,这两个的价格将非常相似。 EC2的优点: 如前所述,还有一个vCPU。 使用EC2时,我可以将Write-Ahead-Log放到第二张光盘上(将很多内容写入db时,性能会大大提高)。 我可以在EC2实例上运行pgbouncer(性能更高,因为我可以保持连接打开)。 我可以编辑配置文件(最终将提高性能) RDS的优点: 自动执行每日备份。 RDS能否涵盖EC2拥有的优势(尤其是2)?还有其他优势吗?

1
如何以扩展的树状方式对递归查询的结果进行排序?
假设您有一个nodes这样的表: CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); 它代表一个标准的类节点树结构,其中根节点在顶部,几个子节点与根节点或其他子节点悬挂在一起。 让我们插入几个示例值: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 现在,我要检索前10个根节点及其所有子节点,深度为4: WITH RECURSIVE …

4
CLUSTER之后需要REINDEX吗?
我正在考虑使用CLUSTER通过索引对表重新排序。我知道表数据的重新创建使所有现有索引要么过时,要么变得毫无用处。我已经看到一些迹象表明在集群之后需要REINDEX。我发现其他引用表明CLUSTER 执行了REINDEX。在官方文档说,一切尽在不言中约REINDEX是集群的一部分或需要(虽然它确实表明集群运行后分析), 任何人都可以明确地(例如,对官方文档进行某种程度的引用)说出在CLUSTER之后是否需要REINDEX吗?
12 postgresql 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.