Questions tagged «postgresql»

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

2
关于“交易ID环绕”
现在,我阅读了有关“ Transaction ID Wraparound”的文档,但是我确实不了解某些内容,该文档为以下网址 http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html#VACUUM-FOR-WRAPAROUND 23.1.4。防止事务ID绕回失败 PostgreSQL的MVCC事务语义取决于能否比较事务ID(XID)编号:插入XID大于当前事务XID的行版本是“将来的”,并且对当前事务不可见。但是,由于事务ID的大小有限(32位),因此运行时间较长(超过40亿个事务)的群集将遭受事务ID环绕:XID计数器环绕为零,并且所有突然出现的交易过去似乎是未来-这意味着它们的输出将变得不可见。简而言之,灾难性的数据丢失。(实际上,数据仍然存在,但是如果您不能获得它,那真是令人感到安慰。)为避免这种情况,有必要对每个数据库中的每个表进行至少20亿次事务清理。 我不理解以下语句:“将使事务ID发生折回:XID计数器回绕为零,过去突然出现的所有事务似乎都将在将来发生-这意味着它们的输出变得不可见” 有人可以解释吗?为什么在数据库遭受事务ID折回后,过去的事务似乎会在将来出现?简而言之,我想知道PostgreSQL在自动清除事务ID后是否会处于“数据丢失”的情况。 就我个人而言,我们可以使用txid_current()函数获取当前事务ID,该函数的输出是64位并且不会被循环。所以我认为知道xmin的元组的插入事务ID会比获得通过txid_current()函数。除了在关闭PostgreSQL Server之后将使用pg_resetxlog reset reset transaction ID之外。我对吗 ?谢谢
10 postgresql 


1
通过多个联接对不同行求和
架构: CREATE TABLE "items" ( "id" SERIAL NOT NULL PRIMARY KEY, "country" VARCHAR(2) NOT NULL, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "price" NUMERIC(11, 2) NOT NULL ); CREATE TABLE "payments" ( "id" SERIAL NOT NULL PRIMARY KEY, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "amount" NUMERIC(11, 2) NOT NULL, …


3
设置会话-用于存储用户ID的自定义变量
我想将用户ID存储在自定义会话变量中,并在触发过程中使用它(读取)来授权用户操作。我发现了这样的事情: set session "myapp.user" = '12345'; ... SELECT current_setting('myapp.user'); 似乎可行-我认为应在.conf文件中声明“ myapp.user”,但似乎可以即时创建会话变量(我根本没有更改.conf文件)。 这样做有什么缺点吗?


1
PostgreSQL-如果同时运行多个查询,在什么情况下会加速?在什么情况下我会看到速度下降?
作为一个不是DBA的人,我会谦虚地对待你们,我敢肯定,我的问题充满了概念上的缺陷,并且“取决于”地雷。我也很确定,所有选择回答的人都希望在细节方面超出我目前的能力。 也就是说,我总体上对以下情况感到好奇: 假设我有两个非平凡的查询。 查询1平均需要2分钟才能完成。 查询2平均需要5分钟才能完成。 如果我连续运行它们,一个接一个地运行,那么我预计平均需要7分钟才能完成。这合理吗? 不仅如此,如果同时运行两个查询该怎么办?同时两个独立的连接。 我希望在什么情况下看到加速?(总时间<7分钟) 我预计在什么情况下会放缓?(总时间> 7分钟) 现在,如果我有1000个非平凡查询并发运行,我预感它将导致整体速度下降。在这种情况下,瓶颈可能在哪里?处理器?内存?开车吗 同样,我知道在不知道具体细节(我没有)的情况下,可能无法完全回答问题。我正在寻找一些一般性准则,以便在询问以下问题时考虑: 在什么情况下并发查询会导致整体加速? 在什么情况下并发查询会导致整体速度下降?

1
如何为PostgreSQL中的角色授予drop table / function特权?
我想将drop特定数据库的特定架构中的所有表和函数(不仅是用户拥有的那些)和特权授予特定角色。然而,GRANT ALL PRIVILEGES这还不够,我没有找到不让该角色成为超级用户的方法,怎么办-超级用户拥有同一服务器上其他数据库的权限,这不是我想要的。我不介意仅限于特定数据库的超级用户特权,但是我不确定该怎么做。 我的代码: CREATE USER _administrator PASSWORD 'pwd12345'; CREATE ROLE administrator NOLOGIN ADMIN _administrator; GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator; GRANT ALL PRIVILEGES ON SCHEMA public TO administrator; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA …


2
SELECT是否像VACUUM一样删除死行?
我在摆弄,VACUUM并注意到一些意外的行为,其中SELECT从表中读取行似乎减少了VACUUM以后的工作量。 测试数据 注意:自动真空已禁用 CREATE TABLE numbers (num bigint); ALTER TABLE numbers SET ( autovacuum_enabled = 'f', toast.autovacuum_enabled = 'f' ); INSERT INTO numbers SELECT generate_series(1, 5000); 试验1 现在,我们对所有行进行更新, UPDATE numbers SET num = 0; 当我们跑步时,VACUUM (VERBOSE) numbers;我们得到了, INFO: vacuuming "public.numbers" INFO: "numbers": removed 5000 row versions in 23 pages INFO: …

1
在Postgres中清零WAL段
我们有一个相对较小的Postgres数据库,该数据库具有连续归档功能,可以压缩每个WAL段并将其发送到S3。因为它是一种低容量系统,所以它archive_timeout每10分钟左右命中一次,并存档大部分未使用的WAL段,该段过去压缩得很好,因为它几乎只是零。 但是,Postgres回收其WAL段,以避免在每个WAL交换机上分配新文件的成本,这在高负载情况下很有用,但是这意味着在发生了比平常多的活动之后,我们的WAL段文件现在已满来自先前片段的垃圾,并且压缩效果不佳。我们正在存储所有这些垃圾的许多副本。 有没有一种方法可以减少我们用来保存WAL存档的空间?一些次优的可能性: 防止Postgres以某种方式回收WAL段,因此每次以零文件开始。该文档没有表明有这样做的选项,但我可能会错过它。 启动/完成使用后,使Postgres将WAL段文件归零。同样,文档似乎并不暗示这是可能的。 在不使用它们时从外部将其清除或删除一些WAL段文件。有没有安全的方法来确定这是哪个文件? 将段的未使用部分归零,然后使用from的输出pg_xlogdump将其归档,以查找垃圾从何处开始。可能,尽管我不喜欢它。至少通过在archive命令中执行此操作,可以确保Postgres不会重用该文件。 仅通过解释pg_xlogdump某种方式的输出来再次归档段文件的使用部分,然后在还原期间将其填充零。虽然我不太喜欢它,但听起来也可能。

3
是否实际使用了关键字“ ALIAS”?
根据PostgreSQL 7.1到9.1(目前不支持),ALIAS至少在SQL-99中被列为保留字。更高版本未显示它-表示已将其作为保留字删除。旧的PostgreSQL文档确实说过“关键字的存在并不表示功能的存在。” 给表或列加别名时我见过AS,但从没见过ALIAS。 SQL关键字在哪里(或曾经在哪里)ALIAS?它是曾经使用过还是仅保留供将来使用?

1
整个表的查询中未使用的分区索引的统计信息
在分区上进行联接与在整个表上进行联接时,以下联接具有非常不同的行估计: CREATE TABLE m_data.ga_session ( session_id BIGINT NOT NULL, visitor_id BIGINT NOT NULL, transaction_id TEXT, timestamp TIMESTAMP WITH TIME ZONE NOT NULL, day_id INTEGER NOT NULL, [...] device_category TEXT NOT NULL, [...] operating_system TEXT ); 对于所有分区: CREATE TABLE IF NOT EXISTS m_data.ga_session_20170127 ( CHECK (day_id = 20170127) ) INHERITS (m_data.ga_session); …

4
如何在PostgreSQL中生成时间序列?
如果您要生成日期序列,请参阅此问题 假设我要每24分钟每5分钟生成一个系列。如何在PostgreSQL中做到这一点? PostgreSQL可以generate_series()来自timestamp,但不能来自time。 选择任意时间戳更好还是还是有另一种方式来生成系列?

2
自定义涉及数组的jsonb键排序顺序
我在PostgreSQL中有一张表,里面有一些数据: create table t2 ( key jsonb, value jsonb ); INSERT INTO t2(key, value) VALUES ('1', '"test 1"') ,('2', '"test 2"') ,('3', '"test 3"') ,('[]', '"test 4"') ,('[1]', '"test 5"') ,('[2]', '"test 6"') ,('[3]', '"test 7"') ,('[1, 2]', '"test 8"') ,('[1, 2, 3]', '"test 9"') ,('[1, 3]', '"test 10"') ,('[1,2,4]', …

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.