【问题标题】:How to reduce the cost?如何降低成本?
【发布时间】:2022-01-14 23:25:11
【问题描述】:
select * from XXCNN_AR_FIN016_MONTH_END
where period_name like '%-15'

我尝试在列期间名称上创建索引,但成本不会降低。

此查询的成本为 12702。

创建索引后,解释计划将选项显示为存储已满。为此我想问你一个问题:创建索引后,为什么它没有显示索引扫描或其他扫描?

如何减少成本和时间?

【问题讨论】:

    标签: sql oracle performance query-optimization


    【解决方案1】:

    恐怕数据太少,无法回答。

    不过,您没有说明您创建了什么样的索引。您是否尝试过基于函数的索引?

    CREATE INDEX i1_xx
       ON xxcnn_ar_fin016_month_end (SUBSTR (period_name, -2));
    

    并将查询重写为

    SELECT *
      FROM xxcnn_ar_fin016_month_end
     WHERE SUBSTR (period_name, -2) = '15';
    

    【讨论】:

    • 在创建索引时,它向我显示了这样的错误 ORA-01702: a view is not appropriate here.
    • 看起来 xxcnn_ar_fin016_month_end 是一个视图,而不是一个表。所以是的,您不能在视图上创建索引 - 但您应该能够在基础表的列上创建索引。我建议你试试看。
    【解决方案2】:

    如果 LIKE 模式中指定了前导字符,则可以使用索引(对于像这样的模式 '51-%')。

    解决方法是使用 REVERSE 函数创建函数索引

    CREATE INDEX IDX_XXCNN_AR_FIN016_MONTH_END_reverse ON XXCNN_AR_FIN016_MONTH_END(REVERSE(period_name ));
    

    然后像这样查询:

    select * from XXCNN_AR_FIN016_MONTH_END
    where REVERSE(period_namex) like REVERSE('%-15');
    

    Oracle 将识别查询谓词中的 REVERSE() 函数并将使用索引。

    【讨论】:

    • "... 使用 REVERSE 函数" >> 这几乎是一个坏主意。您不应该使用,当然也不建议其他人使用未记录的功能。至少,当我上次检查时它是无证的......
    • 它的工作和现在的成本将降低到 9526。
    猜你喜欢
    • 2022-01-16
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2019-08-15
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多