对于以下表来说,什么是好的自动真空设置(建议):
高写表插入负载
一天内插入 30-10,000 次。该表可以在没有负载的情况下闲置数周,但每周至少可以进行 3 次突发插入。
高更新表
它使用分区表数据,单次插入的大小是我的表大小的 3-8 倍。
高写表
单行仅更新一次,但一天内会突然更新唯一键,并且需要更新,可能是 30-10,000 个键更新。
高读表
大多数表都是高读取表,为我的数据仓库设置填充因子 80,容纳来自高更新表计算的表
我的删除每月进行一次并分批进行。与密钥相关的所有内容都会被删除或作为备份移动。
目前,对于高更新表,我的填充因子设置为 10-20 。
使用 TDS db.t3.large,但我在流量较低时切换到 db.t3.micro。
另外,设置填充因子真的很低会减慢选择速度吗?
阅读有关数字数据类型的Postgresql 文档
让我想到了这个问题:为什么在 Postgresql 中使用数据类型Float(SQL 标准)会得到这些意外的结果Numeric?
例如:
CREATE TEMP TABLE testnum (a numeric, b float);
INSERT INTO testnum VALUES (100,100);
INSERT INTO testnum VALUES (9*9*9,9*9*9);
INSERT INTO testnum VALUES (9^9^9,9^9^9);
SELECT (a/3)*3 AS numeric, (b/3) * 3 AS float FROM testnum;
SELECT (a/5)*5 AS numeric, (b/5) * 5 AS float FROM testnum;
Run Code Online (Sandbox Code Playgroud)
然后运行
SELECT (a/3)*3 AS numeric, (b/3) * 3 AS float FROM testnum;
numeric | float
99.9999999999999999 | 100
729.0000000000000000 | 729
Run Code Online (Sandbox Code Playgroud)
在这个测试中Float …
我花了很长时间寻找这个,但收到的信息很混乱。
\n在其他 DBMS(在 SQLite、Oracle、MariaDB、MSSQL 中测试)中,我可以使用以下子句覆盖默认排序顺序COLLATE:
SELECT *\nFROM orderby\nORDER BY string COLLATE \xe2\x80\xa6 ;\n\n-- SQLite: BINARY | NOCASE\n-- MariaDB: utf8mb4_bin | utf8mb4_general_ci\n-- Oracle: BINARY | BINARY_CI\n-- MSSQL: Latin1_General_BIN | Latin1_General_CI_AS\nRun Code Online (Sandbox Code Playgroud)\n我仔细阅读了文档并进行了全面的搜索,但我无法\xe2\x80\x99找到任何对于 PostgreSQL 如此简单的东西。
\n是否有一个COLLATE子句值可以对大小写不敏感进行排序?
我知道有很多关于区分大小写的问题,但是(a)大多数问题都是旧问题,并且(b)我没有看到与该COLLATE条款相关的问题。
FWIW,我正在 PostgreSQL 11.8 上进行测试。我在http://sqlfiddle.com/#!17/05cab/1上有一个测试小提琴,但它\xe2\x80\x99s 仅适用于 PostgreSQL 9.6。
\nMySQL/MariaDB 和 SQL Server 默认不区分大小写,这在对大多数文本进行排序时肯定有意义。Oracle 和 SQLite 默认区分大小写,但对于不区分大小写的排序有一个相对简单的解决方案。我的数据库的默认排序规则是en_US.UTF-8. 我\xe2\x80\x99m 试图填补这里的一些空白。
我知道并发创建索引时,只需要一个SHARE ShareUpdateExclusiveLock 锁。
但是,在进程一开始的一小段时间内是否需要更严格类型的锁定?或者整个操作只需要一个SHARE ShareUpdateExclusiveLock 锁?
我这么问是因为我想知道在同时创建索引时设置什么类型的超时是有利的。
我目前对表有以下约束:
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);
Run Code Online (Sandbox Code Playgroud)
我想向约束添加一个条件:我希望约束以相同的方式工作,但只有一行 is_archived 为 FALSE:
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我收到语法错误。
如果则允许is_archived = true具有相同的content_id和组合的多行。brand_id基本上可以归档多行相同的行,但只能取消归档一行。
使用 MSSQL 很容易,@ 标记所有变量名称的开头,让解析器知道它是一个变量而不是列。
这对于注入常量值之类的事情很有用,其中选择在从临时表复制时向插入表提供输入。
declare @foo varchar(50) = 'bar';
select @foo;
Run Code Online (Sandbox Code Playgroud)
你如何在 postgres 中表达这一点?
我有一个数据库,其中有一列名为timestamptype timestamp without timezone,该列上有一个 btree 索引。
我有一个查询如下
SELECT
*
FROM
employee
WHERE
timestamp >= timestamp '2020-01-27 13:24:09'
Run Code Online (Sandbox Code Playgroud)
timestamp但是,解释分析显示未使用该列上的索引:
Seq Scan on employee (cost=0.00..5498.73 rows=34377 width=381) (actual time=0.016..37.944 rows=34251 loops=1)
Filter: ("timestamp" >= '2020-01-27 13:24:09'::timestamp without time zone)
Rows Removed by Filter: 21167
Planning Time: 0.255 ms
Execution Time: 40.277 ms
Run Code Online (Sandbox Code Playgroud)
如果我使用包含时间戳的过滤条件更改查询,而不是1 month(1 year如上所述),则使用列上的索引。
Bitmap Heap Scan on employee (cost=59.51..4510.25 rows=2996 width=381) (actual time=2.164..5.204 rows=2958 loops=1)
Recheck Cond: ("timestamp" >= '2020-12-27 13:24:09'::timestamp without …Run Code Online (Sandbox Code Playgroud) 我知道 PostgreSQL 仅自动为足够小的表使用 RAM。但我不仅仅谈论表内的数据,而是谈论整个表本身。
基本上,我(很差地)在 PHP 数组中重新实现了各种数据库功能,例如,当我从 API 获取数据并希望在将其显示在控制面板中之前对其进行排序或“按摩”时。在这种情况下,拥有一个仅用于此目的且带有临时数据的实际数据库表是没有意义的(至少对我来说)。如果我可以即时创建一个表,将其填充到 RAM 中,进行排序,然后使用普通的 PG SQL 查询从中获取记录,那就更好了。
这是一件事吗?我有数组结构和各种试图模仿 SQL 的“SORT BY”的函数,这感觉很愚蠢。
当然,我不是在谈论执行CREATE TABLE,向其中添加数据,然后再次返回给 PHP,然后DROP TABLE. 这对于性能来说是非常糟糕的。
如果没有办法做到这一点,我就会接受它,但我常常认为这是非常有意义的。
我有一个 SQL Server 数据库,我正在将其迁移到 PostgreSQL 12.0。
我已成功迁移架构和表。连接数据库的应用程序很大程度上依赖于存储过程,这些存储过程也需要转换为PostgreSQL。
不幸的是,我使用的工具不能转换存储过程。关于我应该如何解决这个问题有什么想法或者有一个工具可以做到这一点吗?
我这里有一个非常奇怪的问题。我们的搜索查询接收多个参数并通过不同表中的多个联接进行搜索。查询在我们运行的前几次运行良好,然后有时会严重减慢,例如:从 200 毫秒到 15000/20000 毫秒。在同一个查询上。
最初我认为这是后端 ORM 问题,但在彻底检查并打开慢速查询日志、打开 auto_explain 功能后,我意识到查询计划在几次调用后发生了变化。我们在后端放置一个循环,在同一线程上多次执行查询(用于测试),我发现几乎总是在执行 8 次后数据库开始记录慢速查询。最后结果是查询计划发生了变化。最重要的变化是(我认为)TimeSlots 表上的变化,从 seq 扫描到位图索引扫描,它估计的行数比表中的行数少得多。估计:566 实际:100 000 左右。
我之前尝试过的事情:
这是选择语句:
SELECT DISTINCT u."UserId" AS UserId,
cast(cuj.company_id as bigint) AS CompanyId,
cast(ts.SlotsCount as bigint) as SlotsCount,
case when cuj.vip is null then false else cuj.vip end vip,
u.is_vip as userVip,
case
when ts2.EarliestDate isnull then '7777-12-01 21:00:00.000000'
else ts2.EarliestDate …Run Code Online (Sandbox Code Playgroud) postgresql ×10
index ×2
amazon-rds ×1
autovacuum ×1
collation ×1
index-tuning ×1
locking ×1
maintenance ×1
memory ×1
migration ×1
order-by ×1