不幸的是,巨大表的一列只有一半的数据为空,因此在查询时
select count(*) from huge_table where half_null_col is null;
即使已经被索引,也将是性能的灾难:
create index half_null_col_idx on huge_table(half_null_col asc);
有两个问题:
drop
和create
以避免性能问题。 最佳答案
目前,您至少要想到四个选择:
create index half_null_col_idx
on huge_table (half_null_col, 1);
create bitmap index half_null_col_idx
on huge_table (half_null_col);
create index half_null_col_idx
on huge_table (nvl(half_null_col, '<a value that does not appear in the values of the column>'));
select *
from huge_table
where nvl(half_null_col, '<a value that does not appear in the values of the column>')
= '<a value that does not appear in the values of the column>'
;
create table huge_table_2
partition by list (half_null_col)
(
partition pt_nulls values (null),
partition pt_others values (default)
)
as
select *
from huge_table;
如果仅从表中选择
count(*)
,则位图索引可能是最佳选择。如果要使用其他地方的表中的完整数据行(在联接到另一个表中或将其导出为CSV或其他格式),那么重新分区可能是最佳选择。
如果您不能/不想对表进行重新分区并且不能创建位图索引(例如,由于表上大量并发DML事件),则使用“常量表达式”索引或“重新映射NULL” -to-something”索引可能是您的最佳选择。
要回答您的原始问题: