在 Oracle 中创建索引是否会锁定 table 以供读取?
Does creating index in Oracle locks the table for reads?
如果我们在 CREATE INDEX
语句中指定 ONLINE
,则 table 在创建索引期间不会被锁定。如果没有 ONLINE
关键字,则无法对 table 执行 DML 操作。但同时 table 上的 SELECT 语句是否可行?看完了 description of CREATE INDEX statement 我还是不太清楚。
我问这个,因为我想知道它是否类似于 PostgreSQL 或 SQL 服务器:
- 在 PostgreSQL 中写入 table 是不可能的,但仍然可以读取 table - 参见 the CREATE INDEX doc > CONCURRENTLY 参数。
- 在 SQL 服务器上写入 table 是不可能的,此外,如果我们创建聚集索引,读取也是不可能的 - 请参阅 the CREATE INDEX doc > 在线参数。
创建索引不会阻止其他用户阅读 table。通常,几乎没有 Oracle DDL 命令会阻止用户读取 tables.
有些 DDL 语句可能会给读者带来问题。例如,如果您 TRUNCATE
一个 table,其他正在阅读 table 的用户可能会得到错误 ORA-08103: Object No Longer Exists
。但这是一个非常具有破坏性的变化,我们预计会引起问题。我最近发现一种特定类型的外键约束会阻止读取 table,但这可能是一个罕见的错误。我在添加对象时造成了很多生产问题,但到目前为止我从未见过添加索引会阻止用户阅读 table.
如果我们在 CREATE INDEX
语句中指定 ONLINE
,则 table 在创建索引期间不会被锁定。如果没有 ONLINE
关键字,则无法对 table 执行 DML 操作。但同时 table 上的 SELECT 语句是否可行?看完了 description of CREATE INDEX statement 我还是不太清楚。
我问这个,因为我想知道它是否类似于 PostgreSQL 或 SQL 服务器:
- 在 PostgreSQL 中写入 table 是不可能的,但仍然可以读取 table - 参见 the CREATE INDEX doc > CONCURRENTLY 参数。
- 在 SQL 服务器上写入 table 是不可能的,此外,如果我们创建聚集索引,读取也是不可能的 - 请参阅 the CREATE INDEX doc > 在线参数。
创建索引不会阻止其他用户阅读 table。通常,几乎没有 Oracle DDL 命令会阻止用户读取 tables.
有些 DDL 语句可能会给读者带来问题。例如,如果您 TRUNCATE
一个 table,其他正在阅读 table 的用户可能会得到错误 ORA-08103: Object No Longer Exists
。但这是一个非常具有破坏性的变化,我们预计会引起问题。我最近发现一种特定类型的外键约束会阻止读取 table,但这可能是一个罕见的错误。我在添加对象时造成了很多生产问题,但到目前为止我从未见过添加索引会阻止用户阅读 table.