Oracle SELECT * FROM LARGE_TABLE - 需要几分钟才能响应

时间:2015-05-29 19:49:47

标签: oracle oracle11g

所以我有一个包含5个左右列的简单表,其中一个是包含一些JSON数据的clob。

我正在运行

  1. SELECT * FROM BIG_TABLE
  2. SELECT * FROM BIG_TABLE WHERE ROWNUM < 2
  3. SELECT * FROM BIG_TABLE WHERE ROWNUM = 1
  4. SELECT * FROM BIG_TABLE WHERE ID=x
  5. 我希望任何分数智能的关系数据库都能立即返回数据。我们不是通过子句强制执行命令,所以为什么不在找到数据时返回数据呢?

    在上述所有形式的SELECT语句中,只有4.以亚秒方式返回。这是1-3意外的,它在查询显示SQL Developer中的任何响应之前返回1到10分钟。 SQL Developer的标准SQL数据提取大小为50(JDBC提取大小为50行),因此至少需要1-10分钟才能从超级高性能RAC集群上没有连接的简单表中返回50行由花哨的4层EMC磁盘子系统支持。

    解释计划显示表扫描。很好,但为什么我要在WHERE子句中使用rownum等待1-10分钟?

    这里发生了什么?

1 个答案:

答案 0 :(得分:1)

好的 - 我发现了这个问题。 ROWNUM不像我想象的那样运行,并且在上面的代码中它永远不会停止全表扫描。

这是因为:

在谓词操作(where子句评估)期间分配RowNum,然后递增,即:您的行将其放入结果集,然后分配rownum。

为了通过rownum过滤,你需要已经存在它,比如......

SELECT * FROM (SELECT * FROM BIG_TABLE) WHERE ROWNUM < 1

实际上,这意味着如果没有其他过滤条件,如果没有首先选择整个表,就无法从表中过滤掉前5行。

我解决了这个问题......

    SELECT * FROM (SELECT * FROM BIG_TABLE WHERE 
  DATE_COL BETWEEN :Date1 AND :Date2) WHERE ROWNUM < :x;