具有按性能问题排序的 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
索引
- 如果
date_created
没有被编入索引,它可能应该被编入索引。
- 查看您的自动跟踪结果。找出哪些过滤器的成本最高。这些可能未编入索引,也许应该是。
如果您 post 您的架构,我很乐意提出更好的建议。
我的查询真的很复杂:
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
索引
- 如果
date_created
没有被编入索引,它可能应该被编入索引。 - 查看您的自动跟踪结果。找出哪些过滤器的成本最高。这些可能未编入索引,也许应该是。
如果您 post 您的架构,我很乐意提出更好的建议。