小编Vad*_*hin的帖子

VACUUM 将磁盘空间返还给操作系统

VACUUM通常不会将磁盘空间返回给操作系统,除非在某些特殊情况下。
从文档:

VACUUM删除表和索引中的死行版本并标记可用空间以供将来重用的标准形式。但是,它不会将空间返回给操作系统,除非在表末尾的一个或多个页面完全空闲并且可以轻松获得排他表锁的特殊情况下。相比之下,VACUUM FULL通过编写一个没有死空间的完整新版本的表文件来主动压缩表。这最大限度地减少了表的大小,但可能需要很长时间。它还需要额外的磁盘空间用于表的新副本,直到操作完成。

问题是:如何实现这个数据库状态one or more pages at the end of a table become entirely free?这可以通过 完成VACUUM FULL,但我没有足够的空间来实现它。那么还有没有其他可能呢?

postgresql maintenance disk-space vacuum postgresql-9.2

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

读提交隔离级别

来自文档的引用:

Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只会看到在查询开始之前提交的数据;它永远不会看到未提交的数据或并发事务在查询执行期间提交的更改。实际上,SELECT 查询会在查询开始运行的那一刻看到数据库的快照。但是,SELECT 确实会看到在其自己的事务中执行的先前更新的影响,即使它们尚未提交。另请注意,如果其他事务在第一个 SELECT 执行期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据,即使它们位于单个事务中

那么 PostgreSQL 是否看到另一个事务提交的更改?

postgresql transaction isolation-level

4
推荐指数
1
解决办法
3709
查看次数

创建一个数据库并使其成为“当前”

我有一个重新创建我的单元测试数据库的 sql 脚本。目前它与\i <path_to_my_script>. 它就像

// create user, give him some priveleges

CREATE DATABASE my_database;

CREATE TABLE my_table (
  id UUID primary key,
  data json
);
Run Code Online (Sandbox Code Playgroud)

但是my_table是在postgres数据库中创建的,而不是在my_database.

如何指定my_table应该在 中创建my_database


我使用 postgresql 10.5。

postgresql

4
推荐指数
1
解决办法
39
查看次数

Postgresql 10:使用精确堆块进行位图堆扫描

我有以下查询:

select ro.*
from courier c1
    join courier c2 on c2.real_physical_courier_1c_id = c1.real_physical_courier_1c_id
    join restaurant_order ro on ro.courier_id = c2.id
    left join jsonb_array_elements(items) jae on true
    left join jsonb_array_elements(jae->'options') ji on true
    inner join catalogue c on c.id in ((jae->'id')::int, (ji->'id')::int)
    join restaurant r on r.id = ro.restaurant_id
where c1.id = '7b35cdab-b423-472a-bde1-d6699f6cefd3' and ro.status in (70, 73)
group by ro.order_id, r.id ;
Run Code Online (Sandbox Code Playgroud)

以下是占用约 95% 时间的查询计划的一部分:

->  Parallel Bitmap Heap Scan on restaurant_order ro  (cost=23.87..2357.58 rows=1244 width=1257) (actual time=11.931..38.163 rows=98 loops=2)" …
Run Code Online (Sandbox Code Playgroud)

postgresql execution-plan postgresql-performance

2
推荐指数
1
解决办法
973
查看次数

数据库原子操作实现

问题是关于未包含在“开始提交”块中的查询,而是关于 PostgreSQL、MySQL(至少是 innodb 引擎)中原子的普通插入和更新。那么这在内部是如何实现的呢?

transaction database-internals

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

没有显式锁定的 postgres 死锁

我使用 PostgreSQL 9.2,我没有在任何地方使用显式锁定,LOCK语句和SELECT ... FOR UPDATE. 然而,最近我得到了ERROR: 40P01: deadlock detected. 但是,检测到死锁的查询包含在事务块中。无论如何,它是怎么来的?

postgresql deadlock transaction

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