我在oracle数据库上有一个奇怪的行为。我们制作了大约310万条记录的大量插入内容。到目前为止一切都很好。
插入完成后不久(大约1分钟10分钟)我执行两个语句。
第一个语句的结果很好,它给了我插入的确切行数。
第二个陈述的结果现在是问题所在。根据时间的不同,返回的行数例如比第一个语句的结果低约500K。两种结果的差异随着时间的推移而减小。
所以我必须等待15到30分钟,然后两个语句返回相同的行数。
我已经和oracle dba谈过这个问题,但他不知道这是怎么发生的。
任何想法,问题或建议?
更新
当我只选择索引列时,我得到正确的行数。 当我改为选择非索引列时,我再次得到错误的行数。
答案 0 :(得分:1)
这对我来说听起来不像是一个错误,如果我理解正确的话,Oracle只需要时间来获取整个表格。毕竟,3 Mil不是少量的。
与count相反,count带来总行数的1条记录。
如果等待一段时间后,输出的记录数等于计数查询返回的数量,那么一切都很好。
答案 1 :(得分:0)
您是否已经使用这些内容进行了验证:
1-计算单列而不是* ALL以验证两个结果
2-您可以通过添加where子句验证两个查询结果,并通过删除条件逐渐选择更多行,以便您可以从两者中返回不同值的问题。
答案 2 :(得分:-1)
我认为您应该检查执行计划以识别缺失的索引以提高性能。 添加缺失的索引并检查结果。
为什么缺少索引无效:
要计数行,Oracle引擎无需去抛出分页操作。但是从表中获取所有细节时,需要进行分页。
并且分页过程依赖于在表上创建的索引来有效且快速地获取数据。
因此,为了减少第二个语句的时间,您应该找到缺少的索引并创建这些索引。
如何查找缺失的索引:
您可以从DBA_HIST_ACTIVE_SESS_HISTORY开始,查看包含该类型提示的所有语句。
从那里,您可以提取来自该提示的索引名称,然后在dba_indexes上查找以查看索引是否存在,是否有效等。