Oracle上的SELECT *和SELECT COUNT(*)之间的结果大小不同

时间:2016-09-12 10:38:20

标签: sql oracle

我在oracle数据库上有一个奇怪的行为。我们制作了大约310万条记录的大量插入内容。到目前为止一切都很好。

插入完成后不久(大约1分钟10分钟)我执行两个语句。

  1. SELECT COUNT(*)FROM TABLE
  2. SELECT * FROM TABLE
  3. 第一个语句的结果很好,它给了我插入的确切行数。

    第二个陈述的结果现在是问题所在。根据时间的不同,返回的行数例如比第一个语句的结果低约500K。两种结果的差异随着时间的推移而减小。

    所以我必须等待15到30分钟,然后两个语句返回相同的行数。

    我已经和oracle dba谈过这个问题,但他不知道这是怎么发生的。

    任何想法,问题或建议?

    更新

    当我只选择索引列时,我得到正确的行数。 当我改为选择非索引列时,我再次得到错误的行数。

3 个答案:

答案 0 :(得分:1)

这对我来说听起来不像是一个错误,如果我理解正确的话,Oracle只需要时间来获取整个表格。毕竟,3 Mil不是少量的。

与count相反,count带来总行数的1条记录。

如果等待一段时间后,输出的记录数等于计数查询返回的数量,那么一切都很好。

答案 1 :(得分:0)

您是否已经使用这些内容进行了验证:

1-计算单列而不是* ALL以验证两个结果

2-您可以通过添加where子句验证两个查询结果,并通过删除条件逐渐选择更多行,以便您可以从两者中返回不同值的问题。

答案 2 :(得分:-1)

我认为您应该检查执行计划以识别缺失的索引以提高性能。 添加缺失的索引并检查结果。

为什么缺少索引无效:

要计数行,Oracle引擎无需去抛出分页操作。但是从表中获取所有细节时,需要进行分页。

并且分页过程依赖于在表上创建的索引来有效且快速地获取数据。

因此,为了减少第二个语句的时间,您应该找到缺少的索引并创建这些索引。

如何查找缺失的索引:

您可以从DBA_HIST_ACTIVE_SESS_HISTORY开始,查看包含该类型提示的所有语句。

从那里,您可以提取来自该提示的索引名称,然后在dba_indexes上查找以查看索引是否存在,是否有效等。