Oracle Select * 返回行,但 Select count(1) 返回 0

2023-12-15

所以,这很奇怪,是我以前从未见过的。我希望有人能给出神奇的答案来阐明这个问题......

SELECT * FROM TABLE -- returns rows... a lot of rows

however,

SELECT COUNT(1) FROM TABLE -- returns zero (0), as in the number zero (0) as the result

这是表结构:

CREATE TABLE TRACKING (
  A_ID NUMBER,
  D_CODE NUMBER,
  HOD NUMBER,
  ADR_CNT NUMBER,
  TTL_CNT NUMBER,
  CREATED DATE,
  MODIFIED DATE
);
CREATE INDEX HOD_D_CODE_IDX ON TRACKING (HOD, D_CODE);
CREATE UNIQUE INDEX TRACKING_PK ON TRACKING (A_ID, D_CODE, HOD);
CREATE INDEX MOD_DATE_IDX ON TRACKING (MODIFIED);
ALTER TABLE TRACKING ADD CONSTRAINT TRACKING_PK PRIMARY KEY (A_ID, D_CODE, HOD);

Oracle 表如何有行但 count(1) 返回零?我在网上做了一些搜索,但一无所获。我发现的唯一的其他帖子与 MS SQL Server 相关。 Oracle 中正在发生这种情况。

任何想法?任何人?

预先感谢您提供的任何帮助。

我可能会添加另一件事,希望它能帮助回答这个难题,Oracle 作业使用该表来聚合和填充另一个表。然而,现在已经完成几天了。另一个表已完全填充并显示预期的记录计数。我检查了 Oracle 作业日志,它显示所有成功,没有一个错误。


错误的结果可能是由损坏、错误和默默更改 SQL 语句的功能引起的。

  1. 索引损坏。很少有索引被损坏并且索引中的数据与表中的数据不匹配的情况。当查询计划更改并使用索引时,这会导致意外结果,但对于使用表访问的不同查询,一切看起来都很正常。有时,简单地重建对象就可以解决这个问题。如果没有,您将需要创建一个完全可重现的测试用例(包括数据);将其发布到此处或将其提交给 Oracle 支持。追踪这一点可能需要几个小时。
  2. Bug.在极少数情况下,错误会导致返回或更改数据时查询失败。同样,需要一个完全可重现的测试用例 诊断这一点,可能需要一段时间。
  3. 切换 SQL 的功能有几种方法可以透明地更改 SQL 语句。查看虚拟专用数据库 (VPD)、DBMS_ADVANCED_REWRITE 和 SQL 转换框架。

为了排除#3,下面的代码向您展示了一种邪恶的方法,以及如何检测它。首先,创建架构和一些数据:

CREATE TABLE TRACKING (
  A_ID NUMBER,
  D_CODE NUMBER,
  HOD NUMBER,
  ADR_CNT NUMBER,
  TTL_CNT NUMBER,
  CREATED DATE,
  MODIFIED DATE
);
CREATE INDEX HOD_D_CODE_IDX ON TRACKING (HOD, D_CODE);
CREATE UNIQUE INDEX TRACKING_PK ON TRACKING (A_ID, D_CODE, HOD);
CREATE INDEX MOD_DATE_IDX ON TRACKING (MODIFIED);
ALTER TABLE TRACKING ADD CONSTRAINT TRACKING_PK PRIMARY KEY (A_ID, D_CODE, HOD);

insert into tracking values (1,2,3,4,5,sysdate,sysdate);
commit;

一开始,一切都按预期进行:

SQL> SELECT * FROM TRACKING;

      A_ID     D_CODE        HOD    ADR_CNT    TTL_CNT CREATED   MODIFIED
---------- ---------- ---------- ---------- ---------- --------- ---------
         1          2          3          4          5 17-JUN-16 17-JUN-16

SQL> SELECT COUNT(1) FROM TRACKING;

  COUNT(1)
----------
         1

然后有人这样做:

begin
  sys.dbms_advanced_rewrite.declare_rewrite_equivalence(
    'april_fools',
    'SELECT COUNT(1) FROM TRACKING',
    'SELECT 0 FROM TRACKING WHERE ROWNUM = 1',
    false);
end;
/

现在结果是“错误的”:

SQL> ALTER SESSION SET query_rewrite_integrity = trusted;

Session altered.

SQL> SELECT COUNT(1) FROM TRACKING;

  COUNT(1)
----------
         0

这可以通过查看解释计划来发现。在下面的示例中,谓词2 - filter(ROWNUM=1)是出现问题的线索,因为该谓词不在原始查询中。有时解释计划的“注释”部分会准确地告诉您为什么要进行转换,但有时它只提供线索。

SQL> explain plan for SELECT COUNT(1) FROM TRACKING;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
Plan hash value: 1761840423

------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |     1 |     2 |     1   (0)| 00:00:01 |
|   1 |  VIEW             |                |     1 |     2 |     1   (0)| 00:00:01 |
|*  2 |   COUNT STOPKEY   |                |       |       |            |          |
|   3 |    INDEX FULL SCAN| HOD_D_CODE_IDX |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWNUM=1)

15 rows selected.

(在不相关的说明上 - 始终使用COUNT(*)代替COUNT(1). COUNT(1)这是一个古老的神话,看起来像货物崇拜编程。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle Select * 返回行,但 Select count(1) 返回 0 的相关文章

随机推荐

  • 如何使用外部 JSON...?

    花了几个小时试图解决这个问题 但我无法弄清楚出了什么问题 我想做的就是加载这个 https recruit zoho com ats EmbedResult hr jodigest 2cV Sr2As6VxhLMxQGuTNij g Fb3
  • 通过 cron 执行的 Google Cloud SDK 代码

    我正在尝试实现一个自动代码来通过 Crontab 关闭和启动我的 Google Cloud 帐户中的 VM 实例 操作系统是 Ubuntu 12 lts 并安装了 Google 服务帐户 因此它可以处理我的 Google 云帐户上的读 写
  • 如何使用tensorflow进行文本分类?

    我是张量流和机器学习的新手 我在编写张量流代码时遇到问题 该代码的文本分类类似于我尝试使用 sklearn 库进行的文本分类 我在对数据集进行矢量化并向张量流层提供输入方面面临着重大问题 我确实记得对标签进行了一次热编码 但前面的张量流层不
  • Twitter 模块 python 'module' 对象没有属性 Oauth

    我正在尝试遵循这个基本示例here Code import twitter XXX Go to http dev twitter com apps new to create an app and get values for these
  • 随机化神经网络输入顺序的影响

    在我的高级算法和数据结构课程中 我的教授要求我们选择任何我们感兴趣的主题 他还告诉我们要研究它并尝试实施解决方案 我选择神经网络是因为它是我长期以来想学习的东西 我已经能够使用神经网络实现 AND OR 和 XOR 该神经网络的神经元使用阶
  • 共享变量的过时值

    在阅读实践中的并发性时 我读到 NoVisibility展示了一种不充分的方法 同步程序可能会导致令人惊讶的结果 陈旧的数据 当 的时候 读者线程检查ready 它可能会看到一个过时的值 除非 每次访问变量时都会使用同步 这是 可能会看到该
  • 分离数据框列中的值并融化

    我有一个数据框 我想在其中分隔 Client ID 列中的值并融化 因此每一行都包含一个 Client ID 以及相应的 Account Name 和所有者 gt head df Account Owner Account Name Cli
  • C++ 将带有分隔符的文本文件读取到结构数组中

    我正在尝试从格式类似于此的文本文件中读取数据 knife object 0 bag object 15 kitchen room 400 放入由结构体组成的数组中 这是我到目前为止所拥有的 但它只读取第一个元素然后返回垃圾 include
  • 提供 SOAP/XML + REST/JSON 的最佳方式是什么?

    我正在创建一个通用 Web 服务 该服务可能有许多不同的客户端 其中一些我目前无法预料 我已经有了一个很好的 Java 服务 API 并且希望在此基础上提供一个 Web 服务外观 SOAP 与 REST 争论的双方都有很大的争论 这让我想知
  • 数组中的随机数而不连续两次重复相同的数字?

    我正在使用 Swift 和 SpriteKit 制作一个游戏 其中我根据数组将对象移动到随机位置 由 CGPoints 组成的数组 let easyArray CGPointMake 0 0 CGPointMake 126 6 0 CGPo
  • 如何从基于年份的大数据集中获取多个矩阵

    在我开始之前 这里是我正在处理的数据的一小部分 我提前为它太大而道歉 注意这只是一个非常大的数据集的前 30 行 mydata lt structure list ParkName c SEP CSSP SEP ONF SEP ONF SE
  • 为什么Object类的方法可以在接口中使用?

    以下接口和类已成功编译 下面的输出中提到了问题 interface MyInterface class MyClass implements MyInterface class InterDoubt static MyInterface m
  • 有条件导入《盖茨比》中的图书馆

    我正在尝试这样做 if typeof window undefined import Keyboard from react simple keyboard import react simple keyboard build css in
  • 如何生成静态链接的可执行文件?

    我正在尝试使用 Rust 创建一个静态可执行文件 我是not尝试静态链接特定库 我试图创建一个可执行文件根本不使用动态链接 我有以下 否则有效 测试 cat hello rs fn main print Hello world n rust
  • mysql_num_rows():提供的参数不是有效的 MySQL 结果资源[重复]

    这个问题在这里已经有答案了 if mysql num rows result echo no match found 它抛出一个错误 Warning mysql num rows supplied argument is not a val
  • {|_,e| e.length>1} Ruby 中下划线 (_) 有什么用?

    country UK US RS EU UK US group by e e keep if e e length gt 1 UK gt UK UK US gt US US 有什么用 下划线 在第二个块中 有人可以详细解释一下吗 这个问题在
  • ASP.NET 4.0中涉及参数时如何指定url映射?

    问题 我有一个网站 里面有一些文章 使用数据库在单个页面上写入结果来访问文章 当要访问某一篇文章时 我需要文章编号我只需要访问该页面 http www mysite Articles aspx a article id 这很好 但不是很友好
  • Angular.module 缩小错误

    花费了最长时间试图弄清楚为什么缩小不起作用 我已经根据网络上的众多建议通过数组对象注入了我的提供者之前的功能 但仍然是 未知提供者 aProvider Regular var app angular module bpwApp ui boo
  • C# Linq Where 两个日期之间的日期

    我正在尝试让 linq 语句获取两个日期之间的所有记录 但我不太确定需要更改什么才能使其正常工作 a Start gt startDate endDate var appointmentNoShow from a in appointmen
  • Oracle Select * 返回行,但 Select count(1) 返回 0

    所以 这很奇怪 是我以前从未见过的 我希望有人能给出神奇的答案来阐明这个问题 SELECT FROM TABLE returns rows a lot of rows however SELECT COUNT 1 FROM TABLE re