为什么desc类型的索引不能被用与计算 min/max?

不管是desc还是asc, 索引中已经排好了顺序;计算min/max直接可以访问相关索引结构,无需全表扫描; 如下所式: desc索引无法支持min/max的查询;而asc类型的索引确实可以.为何这样?是跟索引的物理设计和实现有关吗?

SQL> create table t as select *from dba_objects;

表已创建。

SQL> create index t_idx on t(object_id desc)
  2  ;

索引已创建。

SQL> analyze table t compute statistics;

表已分析。

SQL> select max(object_id)  from t;

MAX(OBJECT_ID)
--------------
         31801


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=43 Card=1 Bytes=4)
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'T' (Cost=43 Card=30188 Bytes=120
          752)

SQL> select min(object_id)  from t;

MIN(OBJECT_ID)
--------------
             2


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=43 Card=1 Bytes=4)
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'T' (Cost=43 Card=30188 Bytes=120
          752)


SQL> select min(object_id)  from t;

MIN(OBJECT_ID)
--------------
             2


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=43 Card=1 Bytes=4)
   1    0   SORT (AGGREGATE)
   2    1     INDEX (FULL SCAN (MIN/MAX)) OF 'T_IDX2' (NON-UNIQUE) (Co
          st=43 Card=30188 Bytes=120752)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是代码实现: ```python import pandas as pd # 读取数据集 iris = pd.read_csv('iris.csv') # 将花萼长度、花萼宽度、花瓣长度、花瓣宽度、类别设置为DataFrame对象的列索引,并读取数据集的前10行 iris.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'] print(iris.head(10)) # 显示数据集描述性统计分析的结果 iris_desc_transposed = iris.describe().T print(iris_desc_transposed) # 按品种划分,每个品种的花萼的长度和宽度的最大值分别是多少? sepal_max = iris.groupby('species')[['sepal_length', 'sepal_width']].max() print(sepal_max) # 按品种划分,每个品种的花瓣的长度和宽度的最小值分别是多少? petal_min = iris.groupby('species')[['petal_length', 'petal_width']].min() print(petal_min) # 把花瓣宽度小于0.5厘米且花萼宽度小于3.1厘米的鸢尾花其花萼长度的值都增加0.1,并读取数据集的前10行 iris.loc[(iris['petal_width'] < 0.5) & (iris['sepal_width'] < 3.1), 'sepal_length'] += 0.1 print(iris.head(10)) ``` 解释一下上面的代码。 首先,我们使用 `pd.read_csv` 读取数据集。然后,我们将花萼长度、花萼宽度、花瓣长度、花瓣宽度、类别设置为DataFrame对象的列索引,并读取数据集的前10行,使用 `print(iris.head(10))` 输出结果。 接下来,我们使用 `describe()` 方法对数据集进行描述性统计分析,并使用 `.T` 转置结果,使用 `print(iris_desc_transposed)` 输出结果。 然后,我们按品种划分数据集,使用 `groupby()` 方法对品种进行分组,然后使用 `max()` 和 `min()` 方法计算每个品种的花萼和花瓣的长度和宽度的最大值和最小值,分别存储在 `sepal_max` 和 `petal_min` 变量中,并使用 `print(sepal_max)` 和 `print(petal_min)` 输出结果。 最后,我们使用 `loc` 方法选择符合条件的数据行,并将其中的花萼长度加上0.1。使用 `print(iris.head(10))` 输出修改后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值