问题标签 [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.
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
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 秒。
我显然在这里遗漏了一些东西。第二个查询有错误吗?有没有更好(更快)的方法来选择未读新闻的计数?
附加信息:
- 这是一个关于数据库结构和查询的小提琴。
- 我正在使用带有 SQLAlchemy 的 PostgresSQL 10(但现在可以使用原始 SQL)。
桌子尺寸:
UPD:查询计划清楚地表明我搞砸了第二个查询。任何线索表示赞赏。
UPD2:我使用横向连接尝试了这个查询,它应该简单地为每个查询运行第一个(最快的)查询topic_id
:
(查询计划 3)。但似乎 Pg planner 对此有不同的看法——它运行非常慢的 seq 扫描和哈希连接,而不是索引扫描和合并连接。
sql - 在多列的唯一约束中使用函数
我有这张桌子:
当我尝试制作表格时,它会出错syntax error at or near "("
。使 2 列唯一时是否允许使用类似的功能LEAST
?GREATEST
最小和最大函数的目的是当一个 ID 为红色时,它不能同时在蓝色列中的另一条记录中。
plpython - 无法加载库 plpython3.dll
在 Postgresql 版本 10 中创建扩展时出现错误
无法加载库“C:/Program Files/PostgreSQL/10/lib/plpython3.dll”:找不到指定的模块
注意:在 Window 10 上使用 Postgresql 10
postgresql - PostgreSQL 可以使用 HASH 排除约束来实现唯一性吗?
由于散列小于冗长的文本,因此在我看来,它们可能比 b 树更可取,以确保列的唯一性。
仅出于确保唯一性的目的,是否有任何理由在 PG 10 中无法执行以下操作?
我假设哈希冲突是在内部处理的。否则将毫无用处。
我将使用GiST
索引来增强查询。
postgresql - Postgres 10:行会在分区之间自动移动吗?
假设我有一个带有子分区的父表,这些子分区是根据字段的值创建的。
如果该字段的值发生变化,有没有办法让 Postgres 自动将该行移动到适当的分区中?
例如:
在这种情况下,如果我将name
in a row 的值从更改aaa
为bbb
,我怎样才能让它自动将该行移动到my_table_b
.
当我尝试这样做时(即update my_table set name = 'bbb' where name = 'aaa';
),我收到以下错误:
ERROR: new row for relation "my_table_a" violates partition constraint
python - 使用 SQLalchemy for PostgreSQL 去除双引号
我正在尝试将 200 个 SAS XPT 文件导入我的 PostgreSQL 数据库:
但是,生成的 SQL 对所有标识符都有双引号,例如:CREATE TABLE "Y2009"."ACQ_F" ("SEQN" FLOAT(53), "ACD010A" FLOAT(53));
. 问题是,如果列/表/模式是用引号创建的,那么每次我需要查询它们时,我也必须包括引号,同时使用精确的大写。
我想去掉引号,而我自己不能编写自定义 SQL,因为这些文件每个都有非常不同的结构。
sql - sql命令在表中选择多个选项
我正在研究地理处理软件中的数据库并遇到了一些问题。有必要在这个数据库中创建一个额外的层,我也决定尝试创建它。
使用 pgAdmin 4 软件、PostgreSQL 10.1 和 postgis 10。我在我为在数据库中创建这一层而编写的行下方提交。
我设法创建了图层,一切正常,出现字段,出现每列的选项,但问题是:我需要administracao
andclasseativecon
列接受多个元素,而不仅仅是一个。例如,在admin层,我想放代码2和3,但只接受一个。
我认为这是一件简单的事情,但由于我的知识几乎为零,我做不到。我希望你能帮助我。
c# - 使用 if 或 case 在 SQL 中进行条件更新
我的问题是,例如,是否有办法进行条件更新
对于我要寻找的更多内容,我找不到与我的代码类似的东西。
postgresql - 错误:运算符不存在:没有时区的时间戳+整数
我在我的 postgresql 函数中添加 nthmonth (2),但在执行时它显示错误“错误:运算符不存在:没有时区 + 整数的时间戳”提示:没有运算符与给定名称和参数类型匹配. 您可能需要添加显式类型转换。查询:选择 pi_date + nthMonth || '月' :: INTERVAL