【问题标题】:Query Taking long time查询耗时长
【发布时间】:2014-03-04 15:55:03
【问题描述】:

我有以下问题

 SELECT * FROM A JOIN B ON A.a=B.b JOIN C ON A.a=C.c.

上述查询返回数百万行,返回结果需要花费大量时间。我怎样才能只看到前“N”条记录,以便查询运行得更快。

【问题讨论】:

  • SELECT TOP 100 * ...
  • 您可以使用 SELECT Top n * from A....
  • 你用的是什么数据库?
  • @GordonLinoff 我正在使用 Oracle

标签: sql performance oracle rownum


【解决方案1】:

在 Oracle 中,您只需将 rownum 添加到 where 子句:

SELECT *
FROM A JOIN
     B
     ON A.a = B.b JOIN
     C
     ON A.a = C.c
WHERE rownum < 100;

【讨论】:

    【解决方案2】:

    你可以使用提示first_rows:

    SELECT /*+ FIRST_ROWS(100) */ * FROM A JOIN B ON A.a=B.b JOIN C ON A.a=C.c
    

    同时检查您是否有关于 A.a、B.b 和 C.c.的索引

    作为补充,您应该了解任何排序(order by),或分析函数,或group by 操作,或distinct(可能还有其他需要整个数据的东西设置,例如 UNIONINTERSECT) 将破坏此提示,并且无论如何都会收集整个数据集。没有它他们根本无法工作:例如如果没有提供完整的列表,如何对数据集进行排序?

    【讨论】:

    • FIRST_ROWS hint 不会限制行数,尽管它可以更快地返回第一行。
    • 是的,但我认为rownum很清楚,问题是让它更快......无论如何,答案的最大部分是关于另一件事
    • 你说得对,OP 的真正问题是查询的性能——但他们最直接的问题是如何限制行数,而且他们似乎并不熟悉 ROWNUM 解决方案。但你的回答很有用,我不会反对它。
    【解决方案3】:

    您可以使用 TOP 子句获得所需数量的记录。这是一个例子:-

    SELECT TOP n *
    FROM A
    JOIN B ON A.a=B.b 
    JOIN C ON A.a=C.C
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 2011-11-03
      • 2015-10-23
      • 2012-11-04
      • 2013-07-24
      • 2015-09-08
      • 2015-07-11
      • 2016-11-04
      相关资源
      最近更新 更多