Questions tagged «postgresql»

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

2
REINDEX危险吗?
我一直在尝试COUNT(*)使用包含主键的150,000行的表。它用了大约5分钟的时间,所以我发现这是一个索引问题。 引用PostgreSQL手册: REINDEX与删除索引和重新创建索引相似,因为索引内容是从头开始重建的。但是,锁定注意事项却大不相同。REINDEX锁定对索引的父表的写入但不对其进行读取。它还对正在处理的特定索引采取排他锁,这将阻止尝试使用该索引的读取(...)。后续的CREATE INDEX锁定写入但不读取;由于索引不存在,因此不会进行任何读取尝试,这意味着将不存在阻塞,但可能会将读取强制进行昂贵的顺序扫描。 根据您自己的经验,您能否告诉您: 有REINDEXING危险吗?会损害数据一致性吗? 会花费很多时间吗? 这是我的情况的可能解决方案吗? 更新: 对我们有用的解决方案是使用不同的名称重新创建相同的索引,然后删除旧索引。 索引创建非常快,我们将索引大小从650 MB减小到8 MB。使用COUNT(*)with between只需3秒。
17 postgresql 

1
Postgres:SET NOT NULL如何比CHECK约束“更有效”
在PostgreSQL文档Constraints中,它说 非空约束在功能上等同于创建检查约束CHECK (column_name IS NOT NULL),但是在PostgreSQL中,创建显式非空约束更为有效。 我很好奇 “更有效”到底是什么意思? 使用CHECK (column_name IS NOT NULL)代替的不利之处是SET NOT NULL什么? 我希望能够添加一个NOT VALID CHECK约束并分别对其进行验证(因此,AccessExclusiveLock对于添加约束,该约束仅保留很短的时间,然后ShareUpdateExclusiveLock对于较长的验证步骤,将其保持一段时间): ALTER TABLE table_name ADD CONSTRAINT column_constraint CHECK (column_name IS NOT NULL) NOT VALID; ALTER TABLE table_name VALIDATE CONSTRAINT column_constraint; 代替: ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

1
使用USING子句命名函数参数和JOIN结果之间的冲突
鉴于当前Postgres 9.4中的设置(来自此相关问题): CREATE TABLE foo (ts, foo) AS VALUES (1, 'A') -- int, text , (7, 'B'); CREATE TABLE bar (ts, bar) AS VALUES (3, 'C') , (5, 'D') , (9, 'E'); 上一个问题还有一个SQL Fiddle。 我写了SELECT一个FULL JOIN以实现所引用问题的目的。简化: SELECT ts, f.foo, b.bar FROM foo f FULL JOIN bar b USING (ts); 根据规范,解决列的正确方法ts是不使用表限定。任一的输入值(f.ts或b.ts)可以是NULL。该USING子句会产生一些奇怪的情况:引入输入中实际上不存在的“输入”列。到目前为止,一切都很优雅。 …

3
使用HAProxy和PGBouncer的PostgreSQL高可用性/可伸缩性
我有一个Web应用程序的多个PostgreSQL服务器。通常,一个主机和多个从机处于热备用模式(异步流复制)。 我使用PGBouncer进行连接池:在连接到本地主机上的数据库的每台PG服务器(端口6432)上安装了一个实例。我使用事务池模式。 为了在从属服务器上平衡只读连接的负载,我将HAProxy(v1.5)与conf差不多使用: listen pgsql_pool 0.0.0.0:10001 mode tcp option pgsql-check user ha balance roundrobin server master 10.0.0.1:6432 check backup server slave1 10.0.0.2:6432 check server slave2 10.0.0.3:6432 check server slave3 10.0.0.4:6432 check 因此,我的Web应用程序连接到haproxy(端口10001),该端口在每个PG从站上配置的多个pgbouncer上进行负载平衡连接。 这是我当前架构的表示图: 这样可以很好地工作,但是我意识到有些实现方式大不相同:Web应用程序连接到单个PGBouncer实例,该实例连接到HAproxy,后者在多个PG服务器上实现负载平衡: 最好的方法是什么?第一个(我当前的一个)还是第二个?一种解决方案比另一种解决方案有什么优势? 谢谢

1
如何在没有timezome的情况下将unix时间转换为PostgreSQL的Timstamp?
我有一个在其时区设置为印度时区(即UTC +5:30)的服务器上运行的PostgreSQL数据库。 我在这样创建的表中有一些数据: CREATE TABLE "CLOUDDATA" ( "CD_Tm_Obs" timestamp without time zone, "CD_Avg_Cloud" double precision ) 我想查询数据并获取特定时间的值。我的输入将是Unix时间戳(即1970年1月1日的秒数) 我发现将unix时间转换为时间戳的唯一方法是: select to_timestamp(TRUNC(CAST(1395036000 AS bigint)))。但这会创建带有时区的时间戳。我的数据在中timestamp without time zone,因此没有任何结果。 如何在没有timezome的情况下将unix时间转换为PostgreSQL的Timstamp?

3
为什么Postgres UPDATE需要39个小时?
我有一个约210万行的Postgres表。我对其进行了以下更新: WITH stops AS ( SELECT id, rank() OVER (ORDER BY offense_timestamp, defendant_dl, offense_street_number, offense_street_name) AS stop FROM consistent.master WHERE citing_jurisdiction=1 ) UPDATE consistent.master SET arrest_id=stops.stop FROM stops WHERE master.id = stops.id; 该查询运行了39个小时。我在4(物理)核心i7 Q720笔记本电脑处理器上运行此程序,有足够的RAM,大多数时间没有其他运行。没有硬盘空间限制。该表最近已被清理,分析和重新索引。 在查询运行的整个过程中,至少在初始WITH完成后,CPU使用率通常较低,并且HDD的使用率为100%。HDD使用非常困难,以至于其他任何应用程序的运行速度都比正常运行慢得多。 笔记本电脑的电源设置为“ 高性能(Windows 7 x64)”。 这是说明: Update on master (cost=822243.22..1021456.89 rows=2060910 width=312) CTE stops -> WindowAgg …
17 postgresql 

3
是否可以限制Postgres服务器上的超时?
我在我的应用程序(客户端)中将连接和命令超时设置为10分钟。 比我的应用程序运行一个简单的查询: SELECT pg_sleep(65) 在某些服务器上,它工作正常,但其他服务器在60秒后关闭了连接。 这可能是某种限制超时并忽略我的客户端设置的PostgreSQL服务器配置吗?

2
如何在PostgreSQL中复制数据库?
我需要将现有数据库(包括其架构和结构)复制到另一个新数据库。我在shell命令环境而不是pgadmin中需要它。请帮助我。 nohup pg_dump exampledb > example-01.sql createdb -O postgres exampledbclone_01 我的用户是“ postgres” nohup psql exampledbclone_01 < example-01.sql $ pg_dump mydb > db.sql $ psql -d newdb -f db.sql
17 postgresql 

1
使用子查询时,Postgres错误[列必须出现在GROUP BY子句中或在聚合函数中使用]
我有两个桌子employee和phones。员工可以使用0到n个电话号码。我想列出员工姓名和他们的电话号码。我正在使用下面的查询运行正常。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 员工表可能包含大量行。我一次只想获取一些员工。例如,我想获取3名员工的电话号码。我正在尝试运行此查询。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 但是我得到这个错误。ERROR: column …

7
有没有什么好的工具可以监视PostgreSQL数据库?
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 4年前关闭。 我计划很快有几个高负载的postgresql数据库。我在管理高负载的mysql数据库方面有一些经验,但是现在我们必须使用postgresql。 我想知道什么是用于日常数据库管理和状态报告的最佳工具。(当然,控制台是最好的控制台,但我也想知道其他选项) 欢迎所有经验!

1
PostgreSQL以什么顺序检查对象权限?
给定数据库角色,定义为存储过程user1的函数something()和创建的视图如下: CREATE VIEW view1 AS select * from something() 并且,鉴于此权限: REVOKE ALL ON FUNCTION something FROM user1 REVOKE SELECT ON view1 FROM user1 当我跑步时SELECT * FROM view1,出现错误permission denied for function something()。 我的问题是,如果我撤消了对视图的选择权限,为什么要调用该函数?我期待收到类似的东西: permission denied for relation view1 谢谢!

1
PostgreSQL中的(x IS NOT NULL)与(NOT x IS NULL)
为什么x IS NOT NULL不等于NOT x IS NULL? 这段代码: CREATE TABLE bug_test ( id int, name text ); INSERT INTO bug_test VALUES (1, NULL); DO $$ DECLARE v_bug_test bug_test; BEGIN RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL); RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL); RAISE NOTICE '%: %', …
16 postgresql  null 

2
CREATE TABLE AS与SELECT INTO
PostgreSQL支持CREATE TABLE AS,SELECT INTO何时同时使用两者? CREATE TABLE AS -根据查询结果定义新表 CREATE TABLE AS创建一个表,并用SELECT命令计算的数据填充该表。表列具有与的输出列关联的名称和数据类型SELECT(除非您可以通过提供新列名称的显式列表来覆盖列名称)。 CREATE TABLE AS与创建视图有些相似,但实际上是完全不同的:它创建一个新表并仅对查询进行一次评估以最初填充新表。新表将不会跟踪对查询源表的后续更改。相反,SELECT无论何时查询,视图都会重新评估其定义语句。 接着。 SELECT INTO -根据查询结果定义新表 SELECT INTO创建一个新表并将其填充查询所计算的数据。数据不会像常规一样返回给客户端SELECT。新表的列具有与的输出列关联的名称和数据类型SELECT。
16 postgresql  ctas 

2
非整数主键注意事项
语境 我正在设计一个数据库(在PostgreSQL 9.6上),该数据库将存储来自分布式应用程序的数据。由于应用程序的分布式性质,SERIAL由于潜在的竞争条件,我不能使用自动增量整数()作为主键。 自然的解决方案是使用UUID或全局唯一标识符。Postgres带有内置UUID类型,非常适合。 UUID存在的问题与调试有关:这是一个非人类友好的字符串。标识符ff53e96d-5fd7-4450-bc99-111b91875ec5什么都没告诉我,而ACC-f8kJd9xKCd虽然不能保证唯一,但告诉我我正在处理一个ACC对象。 从编程的角度来看,调试与几个不同对象相关的应用程序查询是很常见的。假设程序员错误地ACC在ORD(order)表中搜索(account)对象。使用人类可读的标识符,程序员可以立即识别问题,而在使用UUID时,他将花费一些时间来找出问题所在。 我不需要UUID的“保证”唯一性;我确实需要一些空间来生成没有冲突的密钥,但是UUID太过分了。同样,在最坏的情况下,如果发生冲突(数据库拒绝它并且应用程序可以恢复),也不会是世界末日。因此,考虑到折衷,较小但对人类友好的标识符将是我的用例的理想解决方案。 识别应用程序对象 我想出的标识符具有以下格式:{domain}-{string},其中{domain}用对象域(帐户,订单,产品)代替,并且{string}是随机生成的字符串。在某些情况下,甚至可能{sub-domain}在随机字符串之前插入一个。让我们忽略的长度{domain},并{string}为保证唯一性的目的。 如果该格式有助于索引/查询性能,则可以具有固定大小。 问题 知道: 我想使用类似格式的主键ACC-f8kJd9xKCd。 这些主键将成为几个表的一部分。 所有这些键都将在6NF数据库上的多个联接/关系中使用。 大多数表的大小将为中到大(平均约100万行;最大的约1亿行)。 关于性能,什么是存储此密钥的最佳方法? 以下是四种可能的解决方案,但是由于我对数据库的经验很少,因此我不确定哪种数据库(最好)是最好的。 考虑的解决方案 1.存储为字符串(VARCHAR) (Postgres CHAR(n)和和之间没有区别VARCHAR(n),因此我忽略了CHAR)。 经过一些研究,我发现,与的字符串比较VARCHAR(特别是在join操作上)比使用慢INTEGER。这是有道理的,但是我应该在这种规模上担心吗? 2.存储为二进制(bytea) 与Postgres不同,MySQL没有本机UUID类型。有几篇文章解释了如何使用16字节BINARY字段而不是36 字节字段来存储UUID VARCHAR。这些帖子使我想到了将密钥存储为二进制文件(bytea在Postgres上)。 这样可以节省大小,但我更关心性能。我很少能找到解释比较快速的解释:二进制或字符串比较。我相信二进制比较会更快。如果是的话,那么即使程序员现在每次必须对数据进行编码/解码,也bytea可能比更好VARCHAR。 我可能是错的,但我认为两者bytea并VARCHAR会(通过文字或文字),由字节比较(平等)字节。有没有一种方法可以“跳过”此逐步比较,而只是比较“整个过程”?(我不这么认为,但是不进行成本检查)。 我认为按原样存储bytea是最好的解决方案,但是我想知道是否还有其他选择我会忽略。此外,我在解决方案1上表达的同样担忧仍然成立:比较开销是否足以让我担心? “创意”解决方案 我想出了两个非常有效的“创意”解决方案,但我不确定在什么程度上使用(即,如果我无法将它们扩展到表中的几千行)。 3.储存为,UUID但附有“标签” 不使用UUID的主要原因是,程序员可以更好地调试应用程序。但是,如果我们可以同时使用两者:数据库将所有键UUID仅存储为s,但是在进行查询之前/之后包装对象。 例如,程序员要求ACC-{UUID},数据库将忽略ACC-零件,获取结果,然后将所有结果返回为{domain}-{UUID}。 对于某些带有存储过程或函数的黑客来说,这也许是可能的,但是我想到了一些问题: 这(在每个查询中删除/添加域)是否会产生大量开销? 这有可能吗? 我以前从未使用过存储过程或函数,因此不确定是否可能。有人可以照亮吗?如果我可以在程序员和存储的数据之间添加一个透明层,那似乎是一个完美的解决方案。 4.(我的最爱)存储为IPv6 cidr 是的,你没有看错。事实证明,IPv6地址格式完美解决了我的问题。 我可以在前几个八位位组中添加域和子域,并使用其余的作为随机字符串。 该碰撞几率都OK。(虽然我不会使用2 ^ 128,但仍然可以。) 平等比较(希望)得到了优化,所以我可能会比简单地使用获得更好的性能bytea。 实际上,我可以执行一些有趣的比较,例如contains,具体取决于域及其层次结构的表示方式。 例如,假设我使用代码0000来表示域“产品”。密钥0000:0db8:85a3:0000:0000:8a2e:0370:7334将代表产品0db8:85a3:0000:0000:8a2e:0370:7334。 这里的主要问题是:与相比bytea,使用cidr数据类型有什么主要的优点或缺点?

1
为什么时区在Postgres的0001年有如此疯狂的UTC偏移量?
在Postgres 9.5中,我很惊讶地看到下面的年份在尝试年份0001(没有年份0 0000)时看到。 偏移量-07:52:58? 一些示例代码。请注意,我混合使用TIMESTAMP WITH TIME ZONE和TIMESTAMP WITHOUT TIME ZONE,因此请仔细阅读。 SET TIME ZONE 'America/Los_Angeles' ; SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ; ("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00") 我对第二个值感到惊讶:0001-12-31 16:07:02-07:52:58 BC。我知道我们必须向后退8 America/Los_Angeles个小时,比UTC 落后8个小时,但要相差-08:00。但不是-08:00偏移量是-07:52:58。为什么? UTC下没问题 在UTC下输入数据时没有这种问题。 SET TIME …

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.