【问题标题】:oracle create index on column length with conditionoracle根据条件在列长度上创建索引
【发布时间】:2021-07-18 20:03:17
【问题描述】:

我有一个列名imsi,列的长度应该是15个字符,我们可以根据条件的列长度创建索引

我已经在length(imsi) 上创建了一个索引,但我想要length(imsi)<>15 的所有记录,但查询需要很长时间,而length(imsi)<15 以毫秒为单位提供输出。 但我想要length(imsi) <> 15的输出

select * from msisdn_data where length(imsi)<> 15

select * from customer_data where length(imsi)>15 or length(imsi)<15 

这两个查询都需要很长时间

【问题讨论】:

  • 你能告诉我两个查询的当前执行计划吗?
  • | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 361K| 613M| 625K (1)| 00:00:25 | |* 1 | TABLE ACCESS FULL| CUSTOMER_DATA | 361K| 613M| 625K (1)|
  • 对于这两个查询都发生了全表扫描
  • 正如你提到的,length(imsi)&lt;15 以毫秒为单位提供输出。 length(imsi) &gt; 15 呢?
  • 两者都是单独的,它以毫秒为单位提供输出,其中使用 or 子句进行全表扫描

标签: sql oracle query-optimization


【解决方案1】:

试试

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED; 
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;
  • 索引表达式中涉及的调用函数必须是确定性的。这意味着对于相同的输入,函数总是 返回相同的结果。

  • 查询优化器可以使用基于函数的索引进行基于成本的优化,而不是基于规则的优化。因此,在您通过调用 DBMS_STATS.GATHER_TABLE_STATS 或 DBMS_STATS.GATHER_SCHEMA_STATS 分析索引本身之前,它不会使用基于函数的索引。

或者你可以使用提示。

SELECT /*+ index(msisdn_data imsi_idx) */ * 
FROM msisdn_data WHERE LENGTH(imsi) <> 15;

有关为什么在您的查询中不使用基于函数的索引的更多信息,请参阅链接

http://www.dba-oracle.com/t_statistics_function_based_index.htm

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 2021-05-21
    • 2022-12-06
    • 2020-04-27
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2020-10-03
    • 2020-10-02
    相关资源
    最近更新 更多