SQL调优,长时间运行查询+ rownum
我在数据库表中有百万条记录,其中包含帐号,地址和更多列。 我想用desc命令排序100行,我用rownum来做这件事,但查询需要很长时间才能执行,因为它首先扫描整个表,然后按照排序顺序排序,然后应用rownum。
什么是最小化查询执行时间的解决方案?
例如:
select *
from
(select
acc_no, address
from
customer
order by
acc_no desc)
where
ROWNUM <= 100;
根据以往的经验,我发现TOP最适合这种情况。
你也应该总是选择你需要的列,并避免使用全部卡(*)
SELECT TOP 100 [acc_no], [address] FROM [customer] ORDER BY [acc_no] DESC
有关TOP,LIMIT甚至ROWNUM的有用资源。
确保你在acc_no列上使用索引。
要创建新索引(如果不存在),请使用以下查询:
Create index idx1 on customer(acc_no); -- If acc_no is not unique
Create unique index idx1 on customer(acc_no); -- If acc_no is unique. Note: Unique index is faster.
先尝试一下提示:
select /*+ index(idx1) */ * from
(select
acc_no, address
from
customer
order by
acc_no desc)
where
ROWNUM <= 100;
希望这可以帮助。
考虑在内部查询/内嵌视图中获取顶级帐户号码,以便仅对这100个客户记录执行联合。 否则,你可能会在百万行上执行所有连接,然后对百万个+结果进行排序以获得前100个。这样的事情可能会起作用。
select .....
from customer
where customer.acc_no in (select acc_no from
(select inner_cust.acc_no
from customer inner_cust
order by inner_cust.acc_no desc
)
where rownum <= 100)
and ...
或者,如果您使用12C,则只能使用FETCH FIRST 100 ROWS ONLY
select .....
from customer
where customer.acc_no in (select inner_cust.acc_no
from customer inner_cust
order by inner_cust.acc_no desc
fetch first 100 rows only
)
and ...
链接地址: http://www.djcxy.com/p/60723.html