多选题 在以下的SQL语句中,哪一个将显示目前无效的(invalid)所有位图索引的名字?
A.SELECT index_name, tablespace_name, index_type, status
FROM dba_ind_columns
WHERE status='INVALID';
B.SELECT index_name, tablespace_name, index_type, status
FROM dba_indexes
WHERE status='INVALID'
AND index_type='BITMAP';
C.SELECT index_name, tabtespace_name, index_type, staus
FROM dba_indexes
WHERE status='INVALID';
D.SELECT tablespace_name, index_type, status
FROM dba_indexes
WHERE status='INVALID'
AND index_type='BITMAP';

【正确答案】 B
【答案解析】[解析] 这一题是测试对如何利用数据字典视图获取索引信息的熟悉程度。实际上,开始就介绍数据字典视图dba_indexes和dba_ind_columns。在这里首选另一种解题方法,即在完全不知道dba_indexes和dba_ind_columns这两个数据字典的结构的情况下如何获取正确的答案。
首先仔细阅读一下题目的要求,根据题目的要求,任何在SELECT列表(子句)中没有index_name(索引名)列的查询语句都不符合题目的要求,所以选项D可以被排除。
同样根据题目的要求,任何在WHERE子句中没有限定索引的类型(index_type)为位图(BITMAP)的查询语句也都不符合题目的要求,所以选项A和C都可以被排除。
综上所述,利用排除法,答案只能是选项B。实际上,在选项B的SELECT列表(子句)中确实包括了index_name(索引名)列,而且在WHERE子句中确实有限定索引的类型(index_type)为位图(BITMAP)的条件和状态必须为无效(INVALID)的条件。
如果使用SQL*Plus的DESC命令分别列出数据字典dba_ind_columns的结构,会发现这个数据字典dba_ind_columns中根本就没有status这一列,所以选项A的SQL语句是有语法错误的,因此选项A肯定是错误的。