标签: postgresql

自动清理高写入、高更新和大多数读取的表类型

对于以下表来说,什么是好的自动真空设置(建议):

  • 高写表插入负载

    一天内插入 30-10,000 次。该表可以在没有负载的情况下闲置数周,但每周至少可以进行 3 次突发插入。

  • 高更新表

    它使用分区表数据,单次插入的大小是我的表大小的 3-8 倍。

  • 高写表

    单行仅更新一次,但一天内会突然更新唯一键,并且需要更新,可能是 30-10,000 个键更新。

  • 高读表

    大多数表都是高读取表,为我的数据仓库设置填充因子 80,容纳来自高更新表计算的表

我的删除每月进行一次并分批进行。与密钥相关的所有内容都会被删除或作为备份移动。

目前,对于高更新表,我的填充因子设置为 10-20 。

使用 TDS db.t3.large,但我在流量较低时切换到 db.t3.micro。

另外,设置填充因子真的很低会减慢选择速度吗?

postgresql maintenance autovacuum amazon-rds

5
推荐指数
1
解决办法
1985
查看次数

Postgresql 中浮点型和数字型有什么区别?

阅读有关数字数据类型的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 …

postgresql database-design floating-point

5
推荐指数
1
解决办法
8970
查看次数

使用 COLLATE 的不区分大小写的 ORDER BY 子句

我花了很长时间寻找这个,但收到的信息很混乱。

\n

在其他 DBMS(在 SQLite、Oracle、MariaDB、MSSQL 中测试)中,我可以使用以下子句覆盖默认排序顺序COLLATE

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

我仔细阅读了文档并进行了全面的搜索,但我无法\xe2\x80\x99找到任何对于 PostgreSQL 如此简单的东西。

\n

是否有一个COLLATE子句值可以对大小写不敏感进行排序?

\n

我知道有很多关于区分大小写的问题,但是(a)大多数问题都是旧问题,并且(b)我没有看到与该COLLATE条款相关的问题。

\n

FWIW,我正在 PostgreSQL 11.8 上进行测试。我在http://sqlfiddle.com/#!17/05cab/1上有一个测试小提琴,但它\xe2\x80\x99s 仅适用于 PostgreSQL 9.6。

\n

MySQL/MariaDB 和 SQL Server 默认不区分大小写,这在对大多数文本进行排序时肯定有意义。Oracle 和 SQLite 默认区分大小写,但对于不区分大小写的排序有一个相对简单的解决方案。我的数据库的默认排序规则是en_US.UTF-8. 我\xe2\x80\x99m 试图填补这里的一些空白。

\n

postgresql collation order-by

5
推荐指数
1
解决办法
1万
查看次数

并发创建Postgres索引时需要什么类型的锁?

我知道并发创建索引时,只需要一个SHARE ShareUpdateExclusiveLock 锁。

但是,在进程一开始的一小段时间内是否需要更严格类型的锁定?或者整个操作只需要一个SHARE ShareUpdateExclusiveLock 锁?

我这么问是因为我想知道在同时创建索引时设置什么类型的超时是有利的。

postgresql index locking

5
推荐指数
1
解决办法
3361
查看次数

向唯一约束添加条件

我目前对表有以下约束:

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基本上可以归档多行相同的行,但只能取消归档一行。

postgresql

5
推荐指数
1
解决办法
7842
查看次数

如何在 select 子句中使用 postgres 变量

使用 MSSQL 很容易,@ 标记所有变量名称的开头,让解析器知道它是一个变量而不是列。

这对于注入常量值之类的事情很有用,其中选择在从临时表复制时向插入表提供输入。

declare @foo varchar(50) = 'bar';
select @foo;
Run Code Online (Sandbox Code Playgroud)

你如何在 postgres 中表达这一点?

postgresql

5
推荐指数
2
解决办法
4万
查看次数

未使用时间戳列上的 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 month1 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 index index-tuning postgresql-performance

5
推荐指数
0
解决办法
2609
查看次数

是否有可能有一个临时的、动态的、只存在于 RAM 中的 PostgreSQL 表?

我知道 PostgreSQL 仅自动为足够小的表使用 RAM。但我不仅仅谈论表内的数据,而是谈论整个表本身。

基本上,我(很差地)在 PHP 数组中重新实现了各种数据库功能,例如,当我从 API 获取数据并希望在将其显示在控制面板中之前对其进行排序或“按摩”时。在这种情况下,拥有一个仅用于此目的且带有临时数据的实际数据库表是没有意义的(至少对我来说)。如果我可以即时创建一个表,将其填充到 RAM 中,进行排序,然后使用普通的 PG SQL 查询从中获取记录,那就更好了。

这是一件事吗?我有数组结构和各种试图模仿 SQL 的“SORT BY”的函数,这感觉很愚蠢。

当然,我不是在谈论执行CREATE TABLE,向其中添加数据,然后再次返回给 PHP,然后DROP TABLE. 这对于性能来说是非常糟糕的。

如果没有办法做到这一点,我就会接受它,但我常常认为这是非常有意义的。

postgresql memory in-memory-database

5
推荐指数
1
解决办法
7552
查看次数

将 SQL Server 存储过程转换为 postgreSQL

我有一个 SQL Server 数据库,我正在将其迁移到 PostgreSQL 12.0。

我已成功迁移架构和表。连接数据库的应用程序很大程度上依赖于存储过程,这些存储过程也需要转换为PostgreSQL。

不幸的是,我使用的工具不能转换存储过程。关于我应该如何解决这个问题有什么想法或者有一个工具可以做到这一点吗?

postgresql migration stored-procedures postgresql-12

5
推荐指数
1
解决办法
1万
查看次数

PostgreSql 在运行时更改相同的查询计划

我这里有一个非常奇怪的问题。我们的搜索查询接收多个参数并通过不同表中的多个联接进行搜索。查询在我们运行的前几次运行良好,然后有时会严重减慢,例如:从 200 毫秒到 15000/20000 毫秒。在同一个查询上。

最初我认为这是后端 ORM 问题,但在彻底检查并打开慢速查询日志、打开 auto_explain 功能后,我意识到查询计划在几次调用后发生了变化。我们在后端放置一个循环,在同一线程上多次执行查询(用于测试),我发现几乎总是在执行 8 次后数据库开始记录慢速查询。最后结果是查询计划发生了变化。最重要的变化是(我认为)TimeSlots 表上的变化,从 seq 扫描到位图索引扫描,它估计的行数比表中的行数少得多。估计:566 实际:100 000 左右。

我之前尝试过的事情:

  • 将硬件从 2 核 6GB 升级到 8 核 26GB 内存(100GB SSD)
  • 禁用任何其他应用程序(从而停止任何其他负载)访问它。
  • 在表上执行手动(也有自动运行的作业)VACUUM、ANALYZE、REINDEX。
  • 设置各个列的统计信息,例如SlotDateTime(至10000)
  • 创建不明确的统计数据。
  • 增加了 work_mem、maintenance_work_mem、shared_buffers 大小。
  • 将 seq_page_cost 减少到 1。

这是选择语句:

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 execution-plan postgresql-performance

5
推荐指数
1
解决办法
2858
查看次数