如果我有一个关于返回附近咖啡馆的查询:
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) 我想将jsonbx下载到 RDS 实例。RDS PostgreSQL Features Supported仅显示内置功能。这是否意味着我们无法为 RDS 安装不在Feature Matrix 中的扩展?有解决办法吗?
运行时:
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:
使用TRUNCATE ... CASCADE是有意义的,并且有效,但不太明确,因为必须检查YYYYY以查看级联的去向。这让我想尝试另一种选择:
Truncate table "XXXXX" at the same time,但我的问题是:
截断表是什么意思at the same time?
我尝试添加 a TRUNCATE XXXXX...(并将它们都包装在BEGIN/ 中COMMIT),但这会产生相同的错误。
我有一个分区表结构,如:
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
我知道空间不会突然释放(除非有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) 初学者问题:
我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)
这会运行两次昂贵的函数吗?做到这一点的最佳方法是什么?
对于每个支持哈希索引的 Postgres 版本,都有一个警告或说明哈希索引与btree索引“相似或更慢”或“不更好” ,至少到版本 8.3。从文档:
注意:由于哈希索引的实用性有限,B 树索引通常比哈希索引更受欢迎。我们没有足够的证据表明即使对于 = 比较,哈希索引实际上也比 B 树更快。此外,哈希索引需要更粗的锁;见第 9.7 节。
注意:测试表明 PostgreSQL 的哈希索引与B 树索引相似或更慢,并且哈希索引的索引大小和构建时间要差得多。哈希索引在高并发下也表现不佳。由于这些原因,不鼓励使用哈希索引。
注意:测试表明 PostgreSQL 的哈希索引的性能并不比 B 树索引好,哈希索引的索引大小和构建时间要差得多。此外,哈希索引操作目前没有 WAL 日志记录,因此在数据库崩溃后可能需要使用 REINDEX 重建哈希索引。由于这些原因,目前不鼓励使用哈希索引。
在这个 8.0 版本的线程中,他们声称从未发现哈希索引实际上比 btree 更快的情况。
根据这篇博文(2016 年 3 月 14 日):André Barbosa撰写的
Postgres 上的哈希索引,即使在 9.2 版本中,除了编写实际索引之外,任何其他方面的性能提升几乎都没有。
我的问题是这怎么可能?
根据定义,哈希索引是一种O(1)操作,而 …
我需要定期将 RDS 上的 PostgreSQL 转储到 S3 上的文件中(以便在 AWS 之外的其他地方使用它)。
有没有比运行脚本更好的方法,该脚本pg_dump使用例如运行并将结果上传到 S3 boto3?
我的理解是更新锁定一个元组,将其标记为已删除,然后添加一个新元组。
换句话说,更新 = 删除 + 插入。
或者我曾经相信。但在 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 12.6
我有一张有 600,000 条记录的表。
该表具有以下列:
索引:
祖先列是一种构建树的方法,其中每一行都有一个祖先,其中包含所有以“/”分隔的父 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 ×10
amazon-rds ×2
performance ×2
aws ×1
btree ×1
cascade ×1
concurrency ×1
gist-index ×1
hashing ×1
index ×1
mvcc ×1
partitioning ×1
postgis ×1
truncate ×1