具有按性能问题排序的 Oracle 查询

Oracle query with order by perfomance issue

我的查询真的很复杂:

select * from (
select * from tbl_user ...
where ...
and date_created between :date_from and :today
...
order by date_created desc
) where rownum <=50;

由于 where 子句(今天前 3 个月,date_from = 今天 - 90 天),目前查询速度足够快。

我必须删除这个子句,但它会导致性能下降。 如果先通过 `

计算 date_from 会怎样
SELECT MIN(date_created) where...

然后将这个值插入主查询?数据集将是相同的。它会提高性能吗?是否有意义? 谁能对优化有任何假设?

使用order by操作当然会导致查询到return需要更长的时间。也就是说,在数据库中排序几乎总是比在应用程序逻辑中排序更快。

如果没有完整的查询和模式信息,很难真正优化,但我会尝试一下对我来说最明显的部分。

转换为排名()

如果您使用窗口 rank() 函数,您的查询可能会更有效率。我还将其转换为使用 common table expression(又名 CTE)。这不会提高性能,但会使其更易于阅读。

with cte as (
  select 
    * 
    , rank() over (
      partition by
        -- insert what fields differentiate your rows here
        -- unlike a group by clause, this doesn't need to be
        -- every field
      order by
        date_created desc
    )
  from 
    tbl_user 
    ...
  where 
    ...
    and date_created between :date_from and :today
)
select 
  * 
from 
  cte
where
  rk <= 50

索引

  1. 如果 date_created 没有被编入索引,它可能应该被编入索引。
  2. 查看您的自动跟踪结果。找出哪些过滤器的成本最高。这些可能未编入索引,也许应该是。

如果您 post 您的架构,我很乐意提出更好的建议。