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的有用资源。

  • https://www.w3schools.com/sql/sql_top.asp

  • 确保你在acc_no列上使用索引。

  • 如果在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

    上一篇: SQL tuning, long running query + rownum

    下一篇: oracle execution plan, trying to understand