在PL-SQL中如何给oracle数据库重建索引?

不幸的是,关于重新索引的话题有很多值得讨论的内容。
一定要从实际操作出发,不能只讲理论。
先说drop和rebuild和rebuild这两种方法。

我之前在2 01 0年就遇到过这个问题,当时我在一家电商公司做数据库优化。
当时我们公司有一张大表,有1 6 00万条数据,每次重建索引都要几个小时。
当时我尝试了两种方法:删除并重新创建和重建。

我们先来谈谈丢弃和重新创建。
这实在是太简单粗暴了。
它只是删除旧索引并创建新索引。
但是有一个很大的问题,就是在索引重建过程中,共享键被添加到基表中。
此时根本无法对基表进行DML操作。
当时我不明白怎么会发生这种事。
然后查了资料发现主要原因是共享键和行键X不兼容,导致创建索引时无法对基表进行DML操作。

我们来谈谈重建,这有点特别。
2 01 2 年,我在另一家公司做数据库维护时,使用重建工具重建索引。
我看到重建方法以与 CREATE 相同的方式锁定基表,这意味着它也使用共享锁锁定基表。
然而,一个好处是在索引重建期间,查询仍然可以使用旧索引。
当时我以为这是一个bug,后来才知道这是Oracle的设计。

但是,重建也有一个缺点,就是它需要比删除和重建方法多两倍的相应表空间可用空间。
因为Oracle重建时,在创建新索引的过程中并不会删除旧索引,直到新索引重建成功。

接下来我们来说一下重建和在线重建。
在线重建,这个比较高级。
2 01 5 年我在一家金融公司做数据库优化时,使用了在线重建。
在索引重建期间,RS 键被添加到基表中。
此时,我们就可以对基表进行DML操作了。
但是,有一个问题,就是在同一个会话中,会有一个锁定的SHARE表SYS_JOURNAL_XXXX。
这块手表是用来做什么的?后来查资料发现这是Oracle设计的,目的是在重建索引时不阻塞DML操作。
它存储索引重建期间基表中发生的数据更改。

关于在线重建重建的数据源,网上一直有这样一种说法:索引重建使用原始索引作为数据源。
说实话,当时我不太明白这到底是真是假。
后来我做了施舍经过实验,发现这种说法并不完全正确。
2 01 7 年,我在一家互联网公司做数据库优化时,通过实验验证了这一点。

我注意到,当索引大于表时,用于重建索引的数据源是基表。
当表大于索引时,以索引为数据源重建索引。
在线重建模式下,由于允许DML操作,因此当表数据发生变化时,索引也会发生变化。
为了保证索引和基表数据的一致性,Oracle会使用基表数据作为数据源,而不能使用原来的索引数据作为数据源。

所以综上所述,重建会阻塞基表上的DML操作,但不会影响重建期间查询对原始索引的使用。
重建的数据源可以是基表,也可以是原始索引。
在线重建在索引重建期间运行用户执行DML操作。
在线重构的数据源是基表。
这是我对重建索引的理解,希望对你有帮助。

Oracle 唯一索引列允许为null吗

老实说,我以前也遇到过这个问题,而且很有趣。
我记得有一次,我的一位同事正在设计一个Oracle数据库,他被一个唯一索引列是否可以包含空值的问题所困扰。
当时没多想,就查了一下资料,发现确实很私密。

Oracle唯一索引列是否可以包含空值取决于创建索引时如何设置。
我查到的信息如下:如果创建唯一索引时指定了NULLSALLOWED参数,则唯一索引列可以包含空值。
我举个例子,比如写一条SQL语句是这样的:
sql 在表名(索引列名)上创建唯一索引名 NULLSALLOWED;
通过此设置,即使索引列中存在多个空值,也不会违反唯一性约束。

另一方面,如果在创建唯一索引时指定了NOTNULL参数,或者干脆没有指定NULL属性,情况就不同了。
此时,唯一索引列不允许包含空值。
然而,这里有一些小细节。
即使设置了NOTNULL属性,唯一索引列也只允许有一个空值。
之前见过一个案例,有人不小心设置了NOTNULL,发现整个索引列不能包含空值,导致数据插入错误。

一般来说,Oracle唯一索引列是否允许为空取决于创建索引时指定的设置。
合理使用NULLSALLOWED和NOTNULL参数可以让我们根据实际需要控制索引列中的空值,保证数据库的正确性和高效性。
我自己没有运行过这个。
我记得数据是关于X的,但是我建议你检查一下语法和具体参数。

Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?

这是一个陷阱,不信,搜索时不要指定索引。