View1与Union All视图View3统计数据不一致问题求助
排查步骤
修正视图定义的语法错误
你提供的View3创建语句存在别名不匹配问题:第一个SELECT表别名是v1,但WHERE子句用了u.USAGE_DATE、u.MASTER_TENANT;第二个SELECT表别名是v2,WHERE子句同样用了错误的u前缀别名。先确认实际运行的视图定义是否修正了这个问题,错误的别名会导致视图创建失败,或意外过滤/包含数据。对齐数据集过滤条件
对比直接求和View1的查询,是否和View3中View1分支的过滤条件完全一致:- View3对View1的过滤规则:
USAGE_DATE::DATE >= '2023-07-01' AND MASTER_TENANT = 'Tenant1' - 直接求和时,是否漏掉了日期过滤、或MASTER_TENANT取值范围不同?哪怕细微的条件差异都会导致结果偏差。
- View3对View1的过滤规则:
验证日期截断逻辑
View3中用date_trunc(month, USAGE_DATE)生成USAGE_MONTH,直接求和View1时,是否采用了完全相同的月份截断规则?不同的日期处理方式(比如时区差异、DATE_TRUNCvsTO_CHAR转换)可能导致部分记录被归到不同月份,最终求和结果不一致。检查NULL值与字段类型
确认MEGS_USED、MINUTES_USED等数值字段的NULL值情况:SUM()函数会自动忽略NULL值,如果View3创建过程中(比如过滤条件、字段转换)导致NULL值数量和原View1不同,会直接影响求和结果。同时检查字段类型是否在视图创建时发生了隐式转换,导致数值精度丢失。
对比执行计划找差异
执行以下两个查询并对比执行计划,查看数据源读取、过滤逻辑是否一致:-- 直接对View1求和 SELECT SUM(MEGS_USED), SUM(MINUTES_USED) FROM VIEW1 WHERE USAGE_DATE::DATE >= '2023-07-01' AND MASTER_TENANT = 'Tenant1'; -- 对View3中View1分支求和 SELECT SUM(MEGS_USED), SUM(MINUTES_USED) FROM VIEW3 WHERE MASTER_TENANT = 'View1_Master_Tenant';执行计划会暴露是否存在额外过滤、数据转换,或读取了不同的底层数据源。
确认权限与数据一致性
确保查询View1和View3时使用相同用户权限,避免因权限问题导致部分数据不可见。同时检查创建View3后,View1的底层数据源是否有数据更新,导致两次求和的时间点数据不一致。
内容的提问来源于stack exchange,提问作者Debbie Dippenaar
相关产品推荐
相关产品推荐

