sql - 索引列上的不同值

标签 sql oracle indexing oracle11g query-optimization

我有一个包含 115 M 行的表。其中一列已编入索引(在下面的解释计划中名为“my_index”的索引)并且不可为空。此外,到目前为止,该列只有一个不同的值。

当我做的时候

select distinct my_col from my_table;

,需要 230 秒,非常长。这是解释计划。

| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT   |          |     1 |     3 | 22064  (90)| 00:03:23 |
|   1 |  SORT UNIQUE NOSORT|          |     1 |     3 | 22064  (90)| 00:03:23 |
|   2 |   INDEX FULL SCAN  | my_index |   115M|   331M|  2363   (2)| 00:00:22 |

既然该列只有一个不同的值,为什么要花这么长时间?为什么 Oracle 不只是检查索引条目并快速发现该列只有一个可能的值?在上面的解释计划中,索引扫描似乎需要 22 秒,但是这个需要很长时间的“SORT UNIQUE NOSORT”是什么?

预先感谢您的帮助

最佳答案

重新分析表

EXEC dbms_stats.gather_table_stats('owner','table_name',cascade=>true,method_opt=>'FOR ALL INDEXED COLUMNS SIZE ');

更改索引类型

1.15 亿行中有一个不同的值??!!这就是所谓的低基数,对“正常”B 树索引不太好考虑一个位图索引。 (如果你有 B 树的话)

重建查询

如果您确定不会向此列添加新值,那么请删除 distinct 子句,而是像 Abhijith 所说的那样使用。

关于sql - 索引列上的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18961686/

相关文章:

oracle - 在 oracle 中搞砸了表

MongoDB:使用多个单一索引或复合索引

MySQL:显示复合索引中使用了多少列

mysql - 如何在INSERT MySQL查询中使用WITH AS?

sql - 更新和删除查询在 Azure 托管实例中运行需要更长的时间

Oracle plsql switch case 和 sqlplus spool

pandas - 是否有 pandas 功能可以获取 None 而不是索引错误?

sql - 在 where 子句和不同的列条件中使用聚合函数

mysql 两个唯一的列,如果插入到另一个列中,一个列中的值将被视为重复

oracle - 自动设置Oracle的序列起始值