Oracle 表记录的计数(*)不正确

Oracle 表记录的计数(*)不正确,oracle,merge,procedure,Oracle,Merge,Procedure,我正在尝试对oracle中的一个表进行计数。当我运行一个非常简单的计数时,例如: SELECT COUNT(*) FROM EDW.SCADA_VALUE_HIST; --Returns [114315627] 它返回一个看起来正确的结果(在查询外的括号中)。现在,当我将筛选条件应用于同一个表时,它返回的行数大于表的计数(*): SELECT COUNT(*) FROM EDW.SCADA_VALUE_HIST WHERE UPDT_VAL_EFF_DTTM <= (SYSDATE-5

我正在尝试对oracle中的一个表进行计数。当我运行一个非常简单的计数时,例如:

SELECT COUNT(*) FROM EDW.SCADA_VALUE_HIST; --Returns [114315627]
它返回一个看起来正确的结果(在查询外的括号中)。现在,当我将筛选条件应用于同一个表时,它返回的行数大于表的计数(*):

SELECT COUNT(*) FROM EDW.SCADA_VALUE_HIST 
WHERE UPDT_VAL_EFF_DTTM <= (SYSDATE-5); --Returns [131416178]
我试过谷歌搜索几次,但计数帖子中的大部分错误都与连接和过滤条件有关。这对我来说很奇怪

编辑:

解释第一次查询的计划:

选择语句->排序(聚合)->索引(对象主键的快速完全扫描)

基数:1->1->146436917 费用:85031

解释第二次查询的计划:

选择->排序(聚合)->索引(对与PK(筛选谓词索引)不同的对象进行快速完全扫描)->筛选谓词->UPDT_VAL_EFF_DTTM

基数:1->1->131379677
成本:105341

当我看到这种情况发生时(只有一两次),这是因为索引被破坏了。我们要么重建,要么删除并重新创建索引,问题就消失了


这只是一个轶事,不能解释发生了什么或为什么。但是,在您浪费大量时间处理Oracle支持之前,您应该先尝试这些“糟糕”的解决方案。现在花5分钟来重建它,这样你就可以避免几天后的调查。如果问题再也不会发生,根本原因其实并不重要。

在这方面存在各种错误;可能会在MOS上寻找一个接近的匹配,或者提出一个服务请求。可能有兴趣查看执行计划,然后跟踪这两个查询。不幸的是,访问MOS站点需要一些时间。监督委员会。我可以和他们核实一下,但是需要一点时间(2周),他们并不总是给出正确的答案。谢谢你的反馈!这就是事实。
create or replace PROCEDURE UPDATE_VALUE_HIST AS
    v_date VARCHAR2(16);
    g_counter NUMBER(10,0) := 0;
    g_insertspeed NUMBER (10,0) := 1000;
    g_inserttime NUMBER (10,0) := 20; 
BEGIN
  BEGIN

    MERGE INTO EDW.SCADA_VALUE_HIST SVH  
    USING 
   (SELECT
       SV.COL1,SV.COL2,SD.COL3,SD.COL4,
       SVD.COL5,SVD.COL6,SVD.COL7,SV.COL8,
       SVT.COL9 AS VALUE_TYPE_NAME,SV.COL10,SD.COL11,
       SYSDATE as UPDT_VAL_EFF_DTTM,'U',SV.COL13,SV.COL14
    FROM SCHEMA.T1 SV,
         SCHEMA.T2 SVD,
         SCHEMA.T3 SVT,
         SCHEMA.T4 SD
    WHERE SV.FIELD1= SVD.FIELD1
    AND SVD.FIELD2= SVT.FIELD2
    AND SD.FIELD3= SVD.FIELD3
    AND SV.FIELD4 IS NOT NULL) B
   ON (
    SVH.FIELD1= B.FIELD1
    AND SVH.FIELD2= B.FIELD2
    AND SVH.FIELD3= B.FIELD3
    AND SVH.FIELD4 = B.FIELD4 
    )
  WHEN NOT MATCHED
    THEN
       INSERT (COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, 
         COL9, COL10, COL11, SYSDATE, 'U', COL13, COL14);

  COMMIT;  

  END;                
END;