【发布时间】:2016-09-12 10:38:19
【问题描述】:
我在 oracle 数据库上有一个奇怪的行为。我们插入了大约 310 万条记录。到目前为止一切都很好。
插入完成后不久(大约 1 到 10 分钟)我执行两条语句。
- 从表中选择 COUNT(*)
- 从表中选择 *
第一个语句的结果很好,它给了我插入的确切行数。
第二个语句的结果现在是问题所在。根据时间的不同,返回的行数例如比第一个语句的结果低 500K 左右。两种结果的差异随着时间的推移而减小。
所以我必须等待 15 到 30 分钟,然后两个语句才能返回相同的行数。
我已经与 oracle dba 讨论过这个问题,但他不知道这是怎么发生的。
有什么想法、问题或建议吗?
更新
当我只选择一个索引列时,我得到了正确的行数。 当我改为选择非索引列时,我再次得到错误的行数。
【问题讨论】:
-
您是否在同一个会话中同时运行两个选择?你是如何插入行的?这是否可重现(也就是说,它每次您插入到表中都会发生?您怎么知道
select * from TABLE返回了多少行?您是在客户端还是 IDE 中滚动浏览它们?什么是select count(*) from (select * from TABLE)的行为吗? -
否,两个 select 语句使用不同的会话。我如何插入是什么意思?我们使用普通的 INSERT 语句,如 INSERT INTO TABLE (COLUM1, COLUMN2...COLUMNX) VALUES (1, 2, ...X) 。是的,它可以被复制并且在其他插入过程中也会发生。我们的软件中有一个计数选项,可以简单地计算返回的所有行。我会测试你的陈述。
-
SELECT COUNT(*) FROM (SELECT * FROM TABLE) 语句的结果给了我正确的行数。
-
是的,但在同一时间窗口
select * from TABLE给您错误的行数? -
@APC 是的,这是正确的。我执行了 SELECT COUNT(*) FROM (SELECT * FROM TABLE) 这给了我正确的行数。在此之后,我只直接执行语句 SELECT * FROM TABLE 并且我得到了错误的行数。