Questions tagged «postgresql»

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

2
在PostgreSQL中针对多种记录类型的generate_series
我有两个表,我想查询:pest_counts和pests看起来像: CREATE TABLE pests(id,name) AS VALUES (1,'Thrip'), (2,'Fungus Gnosts'); CREATE TABLE pest_counts(id,pest_id,date,count) AS VALUES (1,1,'2015-01-01'::date,14), (2,2,'2015-01-02'::date,5); 我想使用postgres generate_series来显示在日期系列中发现的每种害虫的数量: 预期成绩 name | date | count -------------+------------+------- Thrip | 2015-01-01 | 14 Thrip | 2015-01-02 | 0 .... Fungus Gnats | 2015-01-01 | 0 Fungus Gnats | 2015-01-02 | 5 ... 我知道我将需要以下内容,但我不确定如何进行其余操作: …

2
全文搜索速度慢,出现频率高
我有一个表,其中包含从文本文档中提取的数据。数据存储在名为"CONTENT"GIN 的列中,为此我创建了该索引: CREATE INDEX "File_contentIndex" ON "File" USING gin (setweight(to_tsvector('english'::regconfig , COALESCE("CONTENT", ''::character varying)::text), 'C'::"char")); 我使用以下查询在表上执行全文搜索: SELECT "ITEMID", ts_rank(setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') , plainto_tsquery('english', 'searchTerm')) AS "RANK" FROM "File" WHERE setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') @@ plainto_tsquery('english', 'searchTerm') ORDER BY "RANK" DESC LIMIT 5; “文件”表包含25万行,每个"CONTENT"条目均包含一个随机词和一个文本字符串,所有行均相同。 现在,当我搜索一个随机单词(整个表中有1个匹配项)时,查询运行非常快(<100毫秒)。但是,当我搜索所有行中都存在的单词时,查询运行非常慢(10分钟或更长时间)。 EXPLAIN ANALYZE显示对于1命中搜索,先执行位图索引扫描,再执行位图堆扫描。对于慢速搜索,将执行Seq扫描,这花费了很长时间。 当然,在所有行中都有相同的数据是不现实的。但是,由于我无法控制用户上载的文本文档,也无法控制用户执行的搜索,因此可能会出现类似的情况(搜索数据库中出现率很高的术语)。在这种情况下,如何提高搜索查询的性能? 运行PostgreSQL 9.3.4 查询计划EXPLAIN ANALYZE: …

1
如何在CLI pompt中显示Postgres版本?
我希望在命令行(控制台)界面提示中显示连接到的服务器的版本。根据我在文档中阅读的内容,可以执行shell命令,还可以显示psql变量值。 这个想法是获取有关连接的服务器的版本信息,并在客户端的提示中使用它。如何(在.psqlrc文件中?)在psql变量中分配服务器版本? 编辑:杰克·道格拉斯(Jack Douglas)通过指出该\gset功能可以得到正确的答案。最后以 show server_version \gset \set PROMPT1 '%:server_version: >' 谢谢。

1
移动大型PostgreSQL / PostGIS数据库
我需要将非常大的PostGIS数据库(约320 GB)从server1(PostgreSQL 9.1,PostGIS 1.5)升级到server2(PostgreSQL 9.3,PostGIS 2.1)。 升级过程有据可查。问题是我在server1上没有足够的空间将文件转储到那里,对其进行校验和,然后将其复制到server2并验证总和。我试过了: 从管道中转储服务器1到Server2上使用nc。 将转储文件直接写入到使用挂载在server1上的server2文件系统中。sshfs 两次转储文件似乎已损坏。pg_restore在不同的地方出现错误,如下所示: pg_restore: [compress_io] could not uncompress data: incorrect data check 谁能建议一种更好的方法来完成此迁移和升级? 更新:尝试了NFS(并再次尝试SSHFS)。显然,这些远程文件系统无法可靠地传输大量数据。生成的SQL文件中明显缺少块,从而在导入期间导致如下语法错误: ERROR: invalid input syntax for integer: "8266UPDATE spatial_ref_sys o set auth_name = n.auth_name, auth_srid = n.auth_srid, srtext = n.srtext, proj4text = n.proj4text FROM _pgis_restore_spatial_ref_sys n WHERE o.srid = n.srid;"

1
SELECT DISTINCT ON子查询使用效率低下的计划
我有一张桌子progresses(当前包含数十万条记录): Column | Type | Modifiers ---------------+-----------------------------+--------------------------------------------------------- id | integer | not null default nextval('progresses_id_seq'::regclass) lesson_id | integer | user_id | integer | created_at | timestamp without time zone | deleted_at | timestamp without time zone | Indexes: "progresses_pkey" PRIMARY KEY, btree (id) "index_progresses_on_deleted_at" btree (deleted_at) "index_progresses_on_lesson_id" btree (lesson_id) "index_progresses_on_user_id" …

1
具有两种可能的所有者/父类型的实体的数据库架构?
我正在将PostgreSQL与Sequelize用作我的ORM。 我有一种类型User。第二种类型是Group,可以通过GroupMemberships表与任何数量的用户相关联。Users也可以拥有任意数量的Groups。 我的第三种类型Playlist可以属于UserOR或a group。为这种类型设计模式的最佳方法是什么,使其既可以具有所有者的一种,又可以具有所有者的任何一种? 我的第一遍创建了两个关联,但是一次只能填充一个。这可能可行,但似乎很麻烦,并且使查询变得困难。 附加信息 这是我对MDCCL通过评论发布的澄清请求的回复: (1)如果一个播放列表是由给定资集团,可以说,这个播放列表是关系到一个一对多的用户,只要他们是会员这样的小组,对不对? 我相信这在技术上是正确的,但是这种一对多的关联并不明确存在。 (2)因此,一个特定的播放列表是否可以同时由一对多的组拥有? 不,Playlist一对多不可能拥有一个Groups。 (3)一个特定的播放列表是否可能由一对多组拥有,同时又由不是该组成员的一对多用户拥有? 没有,因为在(2)一到,许多从Playlist到Group应该不存在。此外,如果a Playlist由a Group拥有,则不由a拥有User,反之亦然。一次仅一个所有者。 (4)用来唯一标识组,用户和播放列表的属性是什么? 它们每个都有代理主键(id)和自然键(尽管不是主键)。这些是slug用于Group和Playlist,username用于User。 (5)能在特定播放列表遭受所有者的变化? 尽管我不打算将其作为一项功能(至少最初是这样),但我认为这可能会发生。 (6)Group.Slug和Playlist.Slug属性的含义是什么?它们的值是否稳定到足以定义为主键,或者它们经常更改?这两个属性的值以及User.Username必须唯一,对吗? 这些slug是各自实体的唯一,小写,带连字符的版本title。例如,group带有title“测试组”的a将具有slug“测试组”。重复项将附加增量整数。每当他们title改变时,这都会改变。我相信这意味着他们不会做出出色的主键吗?是的,slugs并且usernames在各自的表中是唯一的。

1
相似度函数的最佳索引
因此,我的这张表有620万条记录,而且我必须对该列执行相似的搜索查询。查询可以是: SELECT "lca_test".* FROM "lca_test" WHERE (similarity(job_title, 'sales executive') > 0.6) AND worksite_city = 'los angeles' ORDER BY salary ASC LIMIT 50 OFFSET 0 可以在where中添加更多条件(年份= X,worksite_state = N,status =“已认证”,visa_class = Z)。 运行其中一些查询可能会花费很长时间,超过30秒。有时超过一分钟。 EXPLAIN ANALYZE 前面提到的查询给了我这个: Limit (cost=0.43..42523.04 rows=50 width=254) (actual time=9070.268..33487.734 rows=2 loops=1) -> Index Scan using index_lca_test_on_salary on lca_test …

1
Postgresql:将对象聚合到一个(json)数组中(子查询问题)
标题含糊不清,我很抱歉,但是我根本不知道用正确的词来形容。 我有此查询将一堆列转换为可以正常工作的对象: SELECT row_to_json(t) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t 但是,我想将属于特定类别的对象归为一个数组。此类别由我的表中名为“ cargoProductId”的第四列定义。该数组应具有“ cargoProductId”的值作为键。所以: "961":[ {"type":"Feature",.... {"type":"Feature",.... {"type":"Feature",.... ], "962":[ ..... ] 所以在过去的大约1 1/2个小时里,我一直在为此苦苦挣扎。我真的不知道该怎么做。这就是我现在所拥有的: SELECT array_agg(row_to_json(t)) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"

3
加快Postgres部分索引的创建
我正在尝试在Postgres 9.4中为大型(1.2TB)静态表创建部分索引。 我的数据是完全静态的,因此我可以插入所有数据,然后创建所有索引。 在这个1.2TB的表中,我有一列名为run_id,它清楚地划分了数据。通过创建覆盖run_ids 范围的索引,我们获得了出色的性能。这是一个例子: CREATE INDEX perception_run_frame_idx_run_266_thru_270 ON run.perception (run_id, frame) WHERE run_id >= 266 AND run_id <= 270; 这些部分索引为我们提供了所需的查询速度。不幸的是,每个部分索引的创建大约需要70分钟。 看来我们受CPU限制(top正在显示该进程的100%)。 我有什么办法可以加快创建部分索引的速度? 系统规格: 18核至强 192GB内存 RAID中的12个SSD 自动真空关闭 maintenance_work_mem:64GB(太高了吗?) 表规格: 大小:1.26 TB 行数:105.37亿 典型索引大小:3.2GB(存在〜.5GB的差异) 表定义: CREATE TABLE run.perception( id bigint NOT NULL, run_id bigint NOT NULL, frame bigint NOT NULL, …

2
在一系列时间戳(一列)上优化查询
我正在通过Heroku使用Postgres 9.3。 我有一个表“ traffic”,其中有1M +条记录,每天都有许多插入和更新。我需要在此表上的不同时间范围内执行SUM操作,这些调用最多可能需要40秒钟,并且希望听到有关如何改进该建议的建议。 我在此表上有以下索引: CREATE INDEX idx_traffic_partner_only ON traffic (dt_created) WHERE campaign_id IS NULL AND uuid_self <> uuid_partner; 这是一个示例SELECT语句: SELECT SUM("clicks") AS clicks, SUM("impressions") AS impressions FROM "traffic" WHERE "uuid_self" != "uuid_partner" AND "campaign_id" is NULL AND "dt_created" >= 'Sun, 29 Mar 2015 00:00:00 +0000' AND "dt_created" <= …

2
使用psql和--disable-triggers恢复纯文本pg_dump
我必须使用一个简短的脚本执行一些测试,以更新我的一张表中的某些“旧版”数据。 我非常谨慎,我使用未经测试的脚本决定先备份相关表。最简单的方法是: pg_dump -a --file table.sql -t table database 现在我做了我必须做的,检查了结果,发现它们不尽人意。我对自己说:我很幸运能得到那张桌子的备份。 备份表时已经警告过我: pg_dump: NOTICE: there are circular foreign-key constraints among these table(s): pg_dump: table pg_dump: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints. pg_dump: Consider using a full dump instead of a …

1
在Postgresql中获取CLOB OID的TEXT值
我有一个数据库表,看起来像: 创建表格答案( id int不为null, question_id int不为null, 答案文字为空 ) 该表最初由Hibernate使用@Lob属性作为“答案”列构建。当时我没有意识到,但是以这种方式设置时,Hibernate在列中存储了OID而不是实际的文本。当我使用Hibernate检索值时,一切工作正常,因为它会自动将OID转换为CLOB字符串,但是,这已成为性能问题,我想摆脱OID。 从答案中选择* 编号QUESTION_ID答案 ============================== 1123 55123 2234 51614 3 345 56127 应该 编号QUESTION_ID答案 ============================== 1123男 2234 203-555-1212 纽约州纽约市3345555 我的愿望是在表“ ANSWER_VALUE TEXT”中添加额外的列,并执行以下操作,将实际值添加到表中,然后将Hibernate更改为不使用@Lob指示符 更新答案集ANSWER_VALUE = getValueFromOID(ANSWER) 该“ getValueFromOID”功能是否存在?如果没有,我能否获得一些有关如何创建一个OID或至少如何获取OID实际值的指示? 谢谢

1
无法在ID处插入行,但行不存在
这是我面临的怪异问题。我正在尝试使用以下查询输入数据 insert into product_product (id, product_tmpl_id, make_equip, model_equip, name_template, serial_num_equip, location_equip, issue_date_equip, issue_to_equip, remarks_equip, pr, ch, categ_id,valuation) values (700,700,'Nikon','Action 10x50 Lookout','Nikon Action 10x50 Lookout','671386','40 Wall St.','5/13/2004 12:00:00 AM','','OM''s OFFICE',62,72,502,'manual periodic'); 我得到错误: ERROR: duplicate key value violates unique constraint "product_product_pkey" DETAIL: Key (id)=(700) already exists. ********** Error ********** ERROR: duplicate key …

1
为什么CTE对丢失的更新开放?
当克雷格·林格(Craig Ringer)评论时,我不明白他的意思: 如果插入事务回滚,则此解决方案可能会丢失更新。没有检查来强制UPDATE影响任何行。 在https://stackoverflow.com/a/8702291/14731上。请提供事件的样本序列(例如,线程1执行X,线程2执行Y),以演示丢失更新的发生方式。

2
VACUUM ANALYZE为什么不清除所有死元组?
VACUUM ANALYZE VERBOSE在对一些较大的表进行重大DELETE/INSERT更改之后,我们对它们进行了“手动” 处理。这似乎没有问题,尽管有时表的VACUUM工作将运行几个小时(有关类似问题和推理,请参阅此帖子)。 在进行更多研究时,我发现即使在运行后,我们也有包含大量死元组的大表VACUUM。例如,以下是此响应中查询产生的一些统计信息。 -[ RECORD 50 ]--+--------------------------- relname | example_a last_vacuum | 2014-09-23 01:43 last_autovacuum | 2014-08-01 01:19 n_tup | 199,169,568 dead_tup | 111,048,906 av_threshold | 39,833,964 expect_av | * -[ RECORD 51 ]--+--------------------------- relname | example_b last_vacuum | 2014-09-23 01:48 last_autovacuum | 2014-08-30 12:40 n_tup | 216,596,624 …

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.