问题标签 [postgresql-10]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
472 浏览

postgresql - postgresql 不使用索引作为主键 = 外键

我有3张主桌,

  • ts_entity(id,short_name,name,type_id)
  • ts_entry_entity(id,entity_id,entry_id)
  • ts_entry(id, ... other columns ...)

所有的 id 列都是 UUID,并且有一个 Btree 索引。

ts_entry_entity.entity_id有外键ts_entity.id,也有 Btree 索引。

ts_entry_entity.entry_id同样是外键,也有Btree索引。

我有一个 SQL,比如

奇怪的事情来了,“ ts_entry_entity.entity_id=ts_entity.id”不使用任何索引,它的成本大约为 50 秒。

表上没有 where 条件ts_entity

我的问题:为什么不ts_entry_entity.entity_id=ts_entity.id使用索引?为什么要花这么多时间?如何优化 SQL?

下面是explain analyze结果。

解释分析结果

有关表格的更多详细信息:

  • ts_entity(id,short_name,name,type_id)
  • ts_entry_entity(id,entity_id,entry_id)
  • ts_entry(id,version_id)
  • ts_entry_version(id,entry_id,submitted_date,title,submitter)
  • ts_attribute(id,attribute_definition_id,entry_id,value)
  • ts_attribute_definition(id,name)

如您所见, ts_entry_version 将保存一个条目的所有版本。ts_attribute 用于条目的可扩展列。

有关 SQL 的更多详细信息

我们在 ts_entry_version 列和 ts_attribute.value 上有几个过滤器。ts_attribute.value 是 varchar,但内容可能是时间毫秒、普通字符串值、一个或多个 id 值。SQL的结构如下:

  • select ts_entity.short_name, ts_entry_version.title, ts_attribute.value from ts_entity, ts_entry_entity,ts_entry left join ts_attribute on ts_entry.id=ts_attribute.entry_id and ts_attribute.attribute_definition_id='xxx' where ts_entity.id=ts_entry_entity.entity_id and ts_entry_entity.entry_id=ts_entry.id and ts_entry.version_id=ts_entry_version.id and ts_entry_version.title like '%xxx%' order by ts_entity.short_name asc limit 100 offset 0
0 投票
1 回答
152 浏览

postgresql - 在一张大表中计算未读新闻

我有一个很常见的(至少我认为)数据库结构:有新闻(News(id, source_id)),每个新闻都有一个来源(Source(id, url))。源通过 聚合到主题 ( Topic(id, title)) TopicSource(source_id, topic_id)。此外,还有用户 ( User(id, name)) 可以将新闻标记为已读NewsRead(news_id, user_id)。这是一个清晰的图表: 数据库图

我想为特定用户计算主题中的未读新闻。问题是News表很大(10^6 - 10^7 行)。幸运的是,我不需要知道确切的计数,在一个阈值返回这个阈值作为计数值之后停止计数是可以的。

在针对一个主题的这个答案之后,我提出了以下查询:

查询计划 1)。此查询在测试数据库上大约需要 50 毫秒,这是可以接受的。

现在想为多个主题选择未读计数。我试图这样选择:

查询计划 2)。但是由于我不知道的原因,测试数据大约需要 1.5 秒,而单个查询的总和应该大约 0.2-0.3 秒。

我显然在这里遗漏了一些东西。第二个查询有错误吗?有没有更好(更快)的方法来选择未读新闻的计数?

附加信息:

桌子尺寸:

UPD:查询计划清楚地表明我搞砸了第二个查询。任何线索表示赞赏。

UPD2:我使用横向连接尝试了这个查询,它应该简单地为每个查询运行第一个(最快的)查询topic_id

查询计划 3)。但似乎 Pg planner 对此有不同的看法——它运行非常慢的 seq 扫描和哈希连接,而不是索引扫描和合并连接。

0 投票
2 回答
524 浏览

sql - 在多列的唯一约束中使用函数

我有这张桌子:

当我尝试制作表格时,它会出错syntax error at or near "("。使 2 列唯一时是否允许使用类似的功能LEASTGREATEST最小和最大函数的目的是当一个 ID 为红色时,它不能同时在蓝色列中的另一条记录中。

0 投票
1 回答
6486 浏览

plpython - 无法加载库 plpython3.dll

在 Postgresql 版本 10 中创建扩展时出现错误

无法加载库“C:/Program Files/PostgreSQL/10/lib/plpython3.dll”:找不到指定的模块

注意:在 Window 10 上使用 Postgresql 10

0 投票
1 回答
1046 浏览

postgresql - PostgreSQL 可以使用 HASH 排除约束来实现唯一性吗?

由于散列小于冗长的文本,因此在我看来,它们可能比 b 树更可取,以确保列的唯一性。

仅出于确保唯一性的目的,是否有任何理由在 PG 10 中无法执行以下操作?

我假设哈希冲突是在内部处理的。否则将毫无用处。

我将使用GiST索引来增强查询。

0 投票
1 回答
956 浏览

postgresql - Postgres 10:行会在分区之间自动移动吗?

假设我有一个带有子分区的父表,这些子分区是根据字段的值创建的。

如果该字段的值发生变化,有没有办法让 Postgres 自动将该行移动到适当的分区中?

例如:

在这种情况下,如果我将namein a row 的值从更改aaabbb,我怎样才能让它自动将该行移动到my_table_b.

当我尝试这样做时(即update my_table set name = 'bbb' where name = 'aaa';),我收到以下错误:

ERROR: new row for relation "my_table_a" violates partition constraint

0 投票
1 回答
2919 浏览

python - 使用 SQLalchemy for PostgreSQL 去除双引号

我正在尝试将 200 个 SAS XPT 文件导入我的 PostgreSQL 数据库:

但是,生成的 SQL 对所有标识符都有双引号,例如:CREATE TABLE "Y2009"."ACQ_F" ("SEQN" FLOAT(53), "ACD010A" FLOAT(53));. 问题是,如果列/表/模式是用引号创建的,那么每次我需要查询它们时,我也必须包括引号,同时使用精确的大写

我想去掉引号,而我自己不能编写自定义 SQL,因为这些文件每个都有非常不同的结构。

0 投票
1 回答
58 浏览

sql - sql命令在表中选择多个选项

我正在研究地理处理软件中的数据库并遇到了一些问题。有必要在这个数据库中创建一个额外的层,我也决定尝试创建它。

使用 pgAdmin 4 软件、PostgreSQL 10.1 和 postgis 10。我在我为在数据库中创建这一层而编写的行下方提交。

我设法创建了图层,一切正常,出现字段,出现每列的选项,但问题是:我需要administracaoandclasseativecon列接受多个元素,而不仅仅是一个。例如,在admin层,我想放代码2和3,但只接受一个。

我认为这是一件简单的事情,但由于我的知识几乎为零,我做不到。我希望你能帮助我。

0 投票
1 回答
88 浏览

c# - 使用 if 或 case 在 SQL 中进行条件更新

我的问题是,例如,是否有办法进行条件更新

对于我要寻找的更多内容,我找不到与我的代码类似的东西。

0 投票
1 回答
11422 浏览

postgresql - 错误:运算符不存在:没有时区的时间戳+整数

我在我的 postgresql 函数中添加 nthmonth (2),但在执行时它显示错误“错误:运算符不存在:没有时区 + 整数的时间戳”提示:没有运算符与给定名称和参数类型匹配. 您可能需要添加显式类型转换。查询:选择 pi_date + nthMonth || '月' :: INTERVAL