我读了索引,但我不确定我是否理解这一点。请详细说明这一点。
bitmap或btree索引不适用于null
我在hr.employees.first_Name和hr.employees.Last_name上创建了b-tree索引。
last_name没有null属性,其中first_name可以为null。
当我从员工中选择last_name 时,它正在进行索引全扫描,当我从员工中选择first_name 时,它正在完成表访问。
答案 0 :(得分:3)
在Oracle中,b-tree索引不包含有关null键的信息。这意味着:
create table X (i integer, j integer);
create index X_j on X(j);
insert into X values (1, 1); -- record would be indexed
insert into X values (2, 2); -- record would be indexed
insert into X values (3, null); -- record would not be indexed
select rowid from X; -- index cannot be used
select rowid from X where j = 1; -- index can be used
select rowid from X where j is not null; -- index can be used
select rowid from X where j is null; -- index cannot be used
如果索引多个列,如果至少有一列没有空值,则索引将包含记录。
如果索引是基于函数的,则表达式结果存在相同的规则。
位图索引包含空键。它们的null值和非null值没有任何区别。
如果您希望捕获空值,这并不意味着您应该使用位图索引。位图索引在更新时需要独占访问,因此它们不能用于OLTP环境。如果您希望通过索引捕获空值,请使用基于函数的索引将空值转换为某些非空值,例如
create index employee_firstname_fbi on employees('x' || first_name);
select * from employees where 'x' || first_name = 'x';