标签: postgresql

按距离排序

如果我有一个关于返回附近咖啡馆的查询:

SELECT * FROM cafes c WHERE (
   ST_DWithin(
   ST_GeographyFromText(
     'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
   ),
   ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
     2000
   )
)
Run Code Online (Sandbox Code Playgroud)

如何选择距离以及按距离排序?
有没有比这更有效的方法:

 SELECT id, 
 ST_Distance(ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
             ST_GeographyFromText(
             'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')')      
             ) as distance 
 FROM cafes c
   WHERE (
   ST_DWithin(
     ST_GeographyFromText(
     'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
   ),
    ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
   2000
 )
 ) order by distance
Run Code Online (Sandbox Code Playgroud)

postgresql postgis postgresql-9.2 gist-index

11
推荐指数
1
解决办法
5921
查看次数

Amazon RDS Postgresql 添加新扩展

我想将jsonbx下载到 RDS 实例。RDS PostgreSQL Features Supported仅显示内置功能。这是否意味着我们无法为 RDS 安装不在Feature Matrix 中的扩展?有解决办法吗?

postgresql postgresql-9.4 amazon-rds

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

Postgres 建议“同时截断表......”

运行时:

TRUNCATE TABLE YYYYY RESTART IDENTITY
Run Code Online (Sandbox Code Playgroud)

我看到此错误消息:

ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "XXXXX" references "YYYYY".
HINT:  Truncate table "XXXXX" at the same time, or use TRUNCATE ... CASCADE.
Run Code Online (Sandbox Code Playgroud)

中的两个建议HINT

  1. 使用TRUNCATE ... CASCADE是有意义的,并且有效,但不太明确,因为必须检查YYYYY以查看级联的去向。这让我想尝试另一种选择:

  2. Truncate table "XXXXX" at the same time,但我的问题是:

    截断表是什么意思at the same time


我尝试添加 a TRUNCATE XXXXX...(并将它们都包装在BEGIN/ 中COMMIT),但这会产生相同的错误。

postgresql truncate cascade

11
推荐指数
2
解决办法
9827
查看次数

分区约束不用于涉及按时间戳分区的表的连接

我有一个分区表结构,如:

CREATE TABLE measurements (
    sensor_id bigint,
    tx timestamp,
    measurement int
);

CREATE TABLE measurements_201201(
    CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone 
       AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval))    
)INHERITS (measurements);
CREATE INDEX ON measurements_201201(sensor_id);
CREATE INDEX ON measurements_201201(tx);
CREATE INDEX ON measurements_201201(sensor_id, tx);
....
Run Code Online (Sandbox Code Playgroud)

等等。每个表有大约 20M 行。

如果我在WHERE子句中查询传感器样本和时间戳样本,查询计划会显示选择的正确表和使用的索引,例如:

SELECT *
FROM measurements
INNER JOIN sensors TABLESAMPLE BERNOULLI (0.01) USING (sensor_id)
WHERE tx BETWEEN '2015-01-04 05:00' AND '2015-01-04 06:00' 
    OR tx BETWEEN '2015-02-04 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance partitioning postgresql-9.6 query-performance

11
推荐指数
1
解决办法
1334
查看次数

清理 PG 表中的行后未释放磁盘空间

我知道空间不会突然释放(除非有TRUNCATE)。但是这个在我看来很不正常。

postgresql (9.3.10) 表在删除了 70% 的记录后没有释放空间的原因是什么?

我有一张桌子叫user_sessions_session. 顾名思义,它为 Web 应用程序的每个用户存储会话数据。

它的原始尺寸是:

              Table               |  Size   | External Size 
----------------------------------+---------+---------------
 user_sessions_session            | 15 GB   | 13 GB
Run Code Online (Sandbox Code Playgroud)

此后,我删除了 3 个月前的所有用户会话。这是表中的大部分行。这是 3 天前。我刚刚再次检查了表的大小,这是我看到的:

              Table               |  Size   | External Size 
----------------------------------+---------+---------------
 user_sessions_session            | 15 GB   | 13 GB
Run Code Online (Sandbox Code Playgroud)

此外,select * from pg_stat_activity where query like 'autovacuum:%';显示此时没有进行吸尘。

顺便说一句,我以前在同一个会话表上遇到过同样的问题 - 这不是一次性的。


以防万一,这是我用来获取表大小的 SQL(user_sessions_session 在列表中显示为第 1):

SELECT                                                         
   relname as "Table",
   pg_size_pretty(pg_total_relation_size(relid)) As "Size",
   pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
   FROM pg_catalog.pg_statio_user_tables …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

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

SELECT 和 WHERE 子句中的相同功能

初学者问题:

f(x, y)在数据库表中的两列 x 和 y 上有一个昂贵的函数。

我想执行一个查询,该查询将函数的结果作为列提供给我并对其施加约束,例如

SELECT *, f(x, y) AS func FROM table_name WHERE func < 10;
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,所以我将不得不写一些类似的东西

SELECT *, f(x, y) AS func FROM table_name WHERE f(x, y) < 10;
Run Code Online (Sandbox Code Playgroud)

这会运行两次昂贵的函数吗?做到这一点的最佳方法是什么?

postgresql postgresql-9.4

11
推荐指数
2
解决办法
3152
查看次数

对于等式查找,Hash Index 怎么可能不比 Btree 快?

对于每个支持哈希索引的 Postgres 版本,都有一个警告或说明哈希索引与btree索引“相似或更慢”或“不更好” ,至少到版本 8.3。从文档:

7.2 版

注意:由于哈希索引的实用性有限,B 树索引通常比哈希索引更受欢迎。我们没有足够的证据表明即使对于 = 比较,哈希索引实际上也比 B 树更快。此外,哈希索引需要更粗的锁;见第 9.7 节。

7.3 版(最高 8.2 版)

注意:测试表明 PostgreSQL 的哈希索引B 树索引相似或更慢,并且哈希索引的索引大小和构建时间要差得多。哈希索引在高并发下也表现不佳。由于这些原因,不鼓励使用哈希索引。

8.3 版

注意:测试表明 PostgreSQL 的哈希索引的性能并不比 B 树索引好,哈希索引的索引大小和构建时间要差得多。此外,哈希索引操作目前没有 WAL 日志记录,因此在数据库崩溃后可能需要使用 REINDEX 重建哈希索引。由于这些原因,目前不鼓励使用哈希索引。

在这个 8.0 版本的线程中,他们声称从未发现哈希索引实际上比 btree 更快的情况。

根据这篇博文(2016 年 3 月 14 日):André Barbosa撰写的
Postgres 上哈希索引,即使在 9.2 版本中,除了编写实际索引之外,任何其他方面的性能提升几乎都没有。

我的问题是这怎么可能?

根据定义,哈希索引是一种O(1)操作,而 …

postgresql index btree hashing

11
推荐指数
3
解决办法
6187
查看次数

将 RDS 上的 PostgreSQL 转储到 S3 的最佳方法

我需要定期将 RDS 上的 PostgreSQL 转储到 S3 上的文件中(以便在 AWS 之外的其他地方使用它)。

有没有比运行脚本更好的方法,该脚本pg_dump使用例如运行并将结果上传到 S3 boto3

postgresql aws amazon-rds

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

PostgreSQL 更新与删除 + 插入的“特别之处”是什么

我的理解是更新锁定一个元组,将其标记为已删除,然后添加一个新元组。

换句话说,更新 = 删除 + 插入。

或者我曾经相信。但在 MVCC 中,更新与删除 + 插入之间似乎存在一些根本不同。


设置:

CREATE TABLE example (a int PRIMARY KEY, b int);
INSERT INTO example VALUES (1, 1);
Run Code Online (Sandbox Code Playgroud)

方法一:更新

CREATE TABLE example (a int PRIMARY KEY, b int);
INSERT INTO example VALUES (1, 1);
Run Code Online (Sandbox Code Playgroud)

方法二:删除插入

-- session A                          session B
BEGIN;
UPDATE example SET b = 2 WHERE a = 1;
                                      DELETE FROM example WHERE a = 1;
COMMIT;
-- now there are 0 rows in table example (1 row was …
Run Code Online (Sandbox Code Playgroud)

postgresql concurrency mvcc

11
推荐指数
1
解决办法
1148
查看次数

为什么 OR 语句比 UNION 语句慢?

数据库版本:PostgreSQL 12.6

我有一张有 600,000 条记录的表。

该表具有以下列:

  • 名称 (varchar)
  • location_type (int) 枚举值:(1,2,3)
  • 血统(varchar)

索引:

  • 血统(btree)

祖先列是一种构建树的方法,其中每一行都有一个祖先,其中包含所有以“/”分隔的父 ID。

考虑以下示例:

ID 姓名 祖先
1 空值
5 节点 '1'
12 节点 '1/5'
22 叶子 '1/5/12'

以下查询需要 686 毫秒来执行:

SELECT * FROM geolocations
WHERE EXISTS (
   SELECT 1 FROM geolocations g2
   WHERE g2.ancestry =
      CONCAT(geolocations.ancestry, '/', geolocations.id)
)
Run Code Online (Sandbox Code Playgroud)

此查询在 808 毫秒内运行:

SELECT * FROM geolocations
WHERE location_type = 2
Run Code Online (Sandbox Code Playgroud)

将两个查询与 OR 结合使用时,如果它完成,则需要大约 4475 毫秒才能完成。

SELECT * FROM geolocations
WHERE EXISTS (
   SELECT 1 FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-12

11
推荐指数
3
解决办法
3097
查看次数