我正在使用PostgreSQL 9.6,我有一个名为"ItemDbModel"的表,其中有两列如下:
No integer,
Content jsonb
Run Code Online (Sandbox Code Playgroud)
说我把很多记录像:
"No": 2, {"obj":"x","Item": {"Name": "BigDog", "Model": "NamedHusky", "Spec":"red dog"}}
"No": 4, {"obj":"x","Item": {"Name": "MidDog", "Model": "NamedPeppy", "Spec":"no hair"}}
"No": 5, {"obj":"x","Item": {"Name": "BigCat", "Model": "TomCat", "Spec":"blue color"}}
Run Code Online (Sandbox Code Playgroud)
如何查询表格:
并按"Content.Item.Name.length"排序?
谢谢!
我在 CentOS 8 机器上设置了一个 postgresql 服务器,并使用该pg库在同一台机器上运行一个 js 程序。
const { Pool } = require('pg')
const pool = new Pool({
user: process.env.PG_USER, //postgres user
host: process.env.PG_ENDPOINT, //localhost (I also tried 127.0.0.1)
database: process.env.PG_DB, //database name to connect to
password: process.env.PG_PASS, //postgres user password
port: process.env.PG_PORT //5432
});
Run Code Online (Sandbox Code Playgroud)
我正确设置了 pg 池,如果我想将其连接到我的 AWS postgres 服务器(当然,具有正确的端点等),它工作得很好,但是当我尝试让它连接到 postgres 服务器时,我在同一台机器上设置时,出现以下错误:
Error: connect ECONNREFUSED 127.0.0.1:5432
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 5432
}
Run Code Online (Sandbox Code Playgroud)
我按照说明设置 pg_hba.conf 文件以允许密码登录而不是 …
我对内存表的理解是将在内存中创建的表,并且尽可能少地使用磁盘(如果有的话)。我假设我有足够的 RAM 来容纳该表,或者至少是大部分。我不想使用显式函数将表(如 pg_prewarm)加载到内存中,我只想在发出 aCREATE TABLE或时默认情况下表就在那里CREATE TABLE AS select statement,除非内存已满或除非我另有说明。我并不特别关心记录到磁盘。
7年前,有人在这里问过类似的问题PostgreSQL相当于MySQL内存表吗?。它已收到 2 个答复,其中一个有点晚了(4 年后)。
一个答案是创建一个 RAM 磁盘并为其添加一个表空间。或者使用 UNLOGGED 表。或者等待全局临时表。然而,我没有特殊的硬件,我只有普通的 RAM - 所以我不知道如何去做。我可以使用 UNLOGGED 功能,但据我了解,仍然涉及相当多的磁盘交互(这是我试图减少的),并且我不确定表是否会默认加载到内存中。此外,我不明白全局临时空间是如何相关的。我对它们的理解是它们只是可以共享的空间中的桌子。
另一个答案建议使用内存列存储引擎。然后使用函数将所有内容加载到内存中。我对这种方法的问题是,所提到的引擎看起来很旧并且没有维护,我找不到任何其他引擎。另外,我希望我不必明确地诉诸使用“加载到内存”功能,而是默认情况下一切都会发生。
我只是想知道 7 年后如何在 Postgres 12 中获取内存表。
SQLAlchemy 文档解释了如何创建分区表。但它没有解释如何创建分区。
所以如果我有这个:
#Skipping create_engine and metadata
Base = declarative_base()
class Measure(Base):
__tablename__ = 'measures'
__table_args__ = {
postgresql_partition_by: 'RANGE (log_date)'
}
city_id = Column(Integer, not_null=True)
log_date = Columne(Date, not_null=True)
peaktemp = Column(Integer)
unitsales = Column(Integer)
class Measure2020(Base):
"""How am I suppposed to declare this ? """
Run Code Online (Sandbox Code Playgroud)
我知道我会做的大部分事情SELECT * FROM measures WHERE logdate between XX and YY。但这似乎很有趣。
我刚刚将 Postgres 从 12 升级到 15,但不断收到此错误:
template database "template1" has a collation version, but no actual collation version could be determined
这是 Postgres 15 中的 template1 排序规则信息:

有想法该怎么解决这个吗?如果需要更多信息,请告诉我。
谢谢!
更新:
以下是操作系统信息:
发行商 ID:Debian。
描述:Debian GNU/Linux 10(破坏者)。
发布:10。
代号:buster。
我有一个 Postgres docker 容器,所以我用它来升级:https ://github.com/tianon/docker-postgres-upgrade/tree/master/12-to-15
我没有更换机器或升级操作系统。以下是 PG 12 上的 template1 整理信息:
更新2:
所以我做了一些挖掘,结果发现 en_US.utf8 排序规则在 Postgres 12 上的 pg_collation 表中不存在。但是在 Postgres 15 上,它确实存在于该表中,并且版本为 2.31:
有没有什么办法解决这一问题?
我目前正在做一个简单的虚拟项目,以更新我对 SQL 的知识并学习一些新东西:)
我有一个Article包含列的表:
aID, price
Run Code Online (Sandbox Code Playgroud)
我还有一张桌子Storage:
sID, aID, count
Run Code Online (Sandbox Code Playgroud)
该Storage表将 引用aID为外键,计数列表示存储了多少文章。
现在我想value在我的Storage表中添加一列。此列应按 计算Article.price * Storage.count。
我在网上搜索后发现你可以计算出这样的列
CREATE TABLE tbl
(
int1 INT,
int2 INT,
product BIGINT GENERATED ALWAYS AS (int1 * int2) STORED
);
Run Code Online (Sandbox Code Playgroud)
但是我还没有找到如何使用另一个表中的列的示例。
为了在计算中使用引用的 aID 中的价格,我必须做什么?
我们有一个包含 180m 行、大小为 20 GB 的表。\n表 DDL 为:
\ncreate table app.table\n(\n a_id integer not null,\n b_id integer not null,\n c_id integer not null,\n d_id integer not null,\n e_id integer not null,\n f_id integer not null,\n a_date timestamp not null,\n date_added timestamp,\n last_date_modified timestamp default now()\n);\nRun Code Online (Sandbox Code Playgroud)\n价值分布:
\n主键是复合键:
\ncreate table app.table\n(\n a_id integer not null,\n b_id integer not …Run Code Online (Sandbox Code Playgroud) sql postgresql postgresql-performance amazon-aurora postgresql-12
我Linux Mint 19.2使用以下方法安装了最新的 PostgreSQL 12:
sudo apt-get install postgresql
同样,我使用以下命令安装了最新的 Postgis 3.0.1:
sudo apt-get install postgis
我设置了 postgres 帐户和所有内容,并想创建 PostGIS 的扩展。因此,我还必须安装postgresql-12-postgis-3-scripts,它将 postgis.control 添加到 PostgreSQL 安装中。
然后我连接到我的postgres帐户,创建并初始化了一个test数据库并尝试create extension postgis. 答案是:
ERROR: could not access file "$libdir/postgis-3": No such file or directory
PostgreSQL 和 PostGIS 都是全新安装的。我的计算机上没有损坏的依赖项或旧的 PostgreSQL 片段...我错过了什么?提前致谢。
TL;DR:我们有长时间运行的导入,它们似乎在父分区表上持有锁,即使没有任何东西直接引用父表。
在我们的系统中,我们有inventories和inventory_items。库存往往有 200k 左右的物品,对于我们的访问模式来说,使用本机分区对inventory_items表进行分区是有意义的inventory_id(我们使用的是 Postgres 12)。换句话说,每个库存都有自己的 inventory_items 分区表。这是通过以下 DDL 完成的:
CREATE TABLE public.inventory_items (
inventory_id integer NOT NULL,
/* ... */
)
PARTITION BY LIST (inventory_id);
Run Code Online (Sandbox Code Playgroud)
在我们的应用程序代码中,当通过 Web 仪表板创建库存时,我们会通过以下方式自动创建分区子 inventory_items 表:
CREATE TABLE IF NOT EXISTS inventory_items_#{inventory_id}
PARTITION OF inventory_items
FOR VALUES IN (#{inventory_id});
Run Code Online (Sandbox Code Playgroud)
这些库存通常每天通过 CSV 或其他方式完全重新加载/重新导入一次,并且这些导入任务有时可能需要一段时间。
我们注意到,当这些长时间导入正在运行时,不可能创建新的清单,因为如上所述,创建清单意味着创建分区子表inventory_items,并且长时间运行的导入和创建分区子表之间存在一些锁争用。网络仪表板中的库存,这很糟糕:我们不能仅仅因为发生了完全不相关的导入就阻止用户创建库存。
我在 psql 中使用以下查询来确定谁持有哪些锁:
select pid, relname, mode
from pg_locks l
join pg_class t on l.relation = t.oid
where t.relkind …Run Code Online (Sandbox Code Playgroud) database postgresql database-partitioning database-locking postgresql-12
我可以查看表中所有索引的总大小
SELECT pg_size_pretty (pg_indexes_size('table_name'));
以及特定索引的大小:
select pg_size_pretty(pg_relation_size('index_name'));,
但我想分别检索一个包含表的每个索引的大小信息的列表(索引大小的列表及其所属的相应索引名称)。
postgresql-12 ×10
postgresql ×9
database ×2
sql ×2
centos8 ×1
collation ×1
in-memory ×1
indexing ×1
javascript ×1
json ×1
jsonb ×1
postgis ×1
python ×1
sqlalchemy ×1