【PostgreSQL PGCE-091题目解析14】PostgreSQL中使用CONCURRENTLY选项创建索引时,允许增删改数据表。

本文为++云贝教育刘峰(V:yunbee_DBA)原创,请尊重知识产权,转发请注明出处,不接受++

++任何抄袭、演绎和未经注明出处的转载。++

PostgreSQL中使用CONCURRENTLY选项创建索引时,允许增删改数据表。

A. 正确

B. 错误

参考答案:A


解析:

我们知道,PG是有行级琐的,在创建索引的时候,会在行上加琐

实验如下:

1、准备目标数据

复制代码
drop table if exists t1;
create table t1 ( a int, b varchar(50));
insert into t1
select a.*, md5(a::varchar) from generate_series(1,5000000) a;

2、在表上创建索引,不加CONCURRENTLY

复制代码
testdb=# create index idx_t1_a3 on t1(a);
CREATE INDEX

3、修改表数据

复制代码
testdb=# begin;
BEGIN
testdb=*# select pg_backend_pid();
 pg_backend_pid
----------------
          32600
(1 row)

testdb=*# select txid_current();
 txid_current
--------------
          759
(1 row)

testdb=*# update t1 set a=55 where a=6;
。。。等待中

发现修改不了

4、查看此时的琐

复制代码
testdb=# select locktype,database,relation::regclass,transactionid,pid,mode from pg_locks order by pid;
      locktype | database | relation | transactionid |  pid  |   mode
---------------+----------+----------+---------------+-------+---------------------
relation       | 16389    | pg_locks |               | 30854 | AccessShareLock
virtualxid     |          |          |               | 30854 | ExclusiveLock
virtualxid     |          |          |               | 32410 | ExclusiveLock
relation       | 16389    | 16411    |               | 32410 | AccessExclusiveLock
transactionid  |          |          |           760 | 32410 | ExclusiveLock
relation       | 16389    | t1       |               | 32410 | ShareLock
virtualxid     |          |          |               | 32600 | ExclusiveLock
relation       | 16389    | t1       |               | 32600 | RowExclusiveLock
transactionid  |          |          |           759 | 32600 | ExclusiveLock
(9 rows)

5、以CONCURRENTLY模式创建索引

复制代码
testdb=# create index concurrently idx_t1_a41 on t1(a);
CREATE INDEX

6、修改表数据

复制代码
testdb=# update t1 set a=55 where a=6;
UPDATE 2

发现很顺利修改成功

7、查看此时的琐情况

复制代码
testdb=# select locktype,database,relation::regclass,transactionid,pid,mode from pg_locks order by pid;
      locktype | database |  relation  | transactionid |  pid  |  mode
---------------+----------+------------+---------------+-------+--------------------------
virtualxid     |          |            |               | 30854 | ExclusiveLock
relation       |    16389 | pg_locks   |               | 30854 | AccessShareLock
relation       |    16389 | idx_t1_a5  |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a4  |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a3  |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a2  |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a1  |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a   |               | 35304 | RowExclusiveLock
relation       |    16389 | t1         |               | 35304 | RowExclusiveLock
relation       |    16389 | idx_t1_a41 |               | 35304 | RowExclusiveLock
transactionid  |          |            |           773 | 35304 | ExclusiveLock
virtualxid     |          |            |               | 35304 | ExclusiveLock
virtualxid     |          |            |               | 35470 | ShareLock
relation       |    16389 | t1         |               | 35470 | ShareUpdateExclusiveLock
virtualxid     |          |            |               | 35470 | ExclusiveLock

结论:PG在创建索引使用concurrently参数时,不影响DML操作,反而是DML操作会影响 concurrently索引创建。

PostgreSQL PGCE考试为理论考试,需通过两门考试才能拿到"PostgreSQL PGCE证书"。

相关推荐
石一峰6991 小时前
驱动:私有数据为什么要在三个地方各挂一遍?
数据库·python·算法
ClouGence1 小时前
跨云、跨地域数据同步,这样更省心
数据库·sql·saas
TDengine (老段)2 小时前
TDengine 函数完整参考 — 聚合、时序、字符串、时间、数学
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
TDengine (老段)3 小时前
昆仑数智选择 TDengine TSDB,提升页岩气生产运行可视化与精细化管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
陆水A3 小时前
【问数系统】SQL跑对了图表却空了?打通问数系统最后1公里的3个API坑
大数据·数据库·自然语言处理·big data·etl工程师
海外数字观察家3 小时前
品未云:泰国华商批发零售一体化 ERP,破解本土软件适配难题|CSDN 技术分享
网络·数据库·人工智能
躺不平的理查德4 小时前
SQLite C API 备忘录
c语言·数据库·sqlite
陳陈陳4 小时前
LLM的"消化系统":一文讲透RAG文档加载与智能切割
数据库·langchain·llm
IvorySQL4 小时前
云环境下PostgreSQL的Cgroup内存管理实践
java·数据库·postgresql
霸道流氓气质4 小时前
CodeBuddy中配置Redis MCP 连接与排错实战
数据库·redis·缓存