【问题标题】:Counting rows in multiple partitions using Oracle SQL使用 Oracle SQL 计算多个分区中的行数
【发布时间】:2018-05-23 02:39:15
【问题描述】:

对于分区表,我可以使用如下查询快速计算分区中的行数:

select count(*)
from db.table Partition (P)
where column value is Null

有没有办法为多个分区执行此操作?

我想要的结果如下-

Partition name         Count of Null Rows
P1                         20000
P2                         12000
P3                          30000

【问题讨论】:

    标签: sql oracle partition


    【解决方案1】:

    它不会像使用 FROM TABLE PARTITION (p) 那样高效,但你可以这样做:

    select o.object_name, o.subobject_name partition, count(*) 
    from sh.sales s 
    inner join all_objects o on o.object_id = dbms_rowid.rowid_object(s.rowid)
    where o.subobject_name in ('SALES_Q1_2000','SALES_Q2_2000')
    -- for performance, you can add conditions to restrict to the partitions of interest, if you know them
    -- e.g., and s.sale_date between to_date('01-JAN-2000','DD-MON-YYYY') and to_date('30-JUN-2000','DD-MON-YYYY')
    group by o.object_name, o.subobject_name;
    

    基本上,它使用rowid 来确定每一行的分区并计算它们。

    【讨论】:

      【解决方案2】:

      这个问题之前已经回答过了。如果您的表没有按日期分区,只需更改谓词并让 Oracle 为您完成工作。非常感谢 Cave 先生 :)

      Select from several partitions at once

      您几乎从不想在查询一个 分区表。您几乎总是希望指定一个谓词 允许 Oracle 自己进行分区修剪。

      选择 t.column1、t.column2
      FROM first_table t
      WHERE t.partitioned_date_column >= AND t.column3 = 'someVal'

      当您在日期上指定谓词时 表分区所在的列,Oracle 可以自动 确定需要访问哪些分区。

      【讨论】:

      • OP 希望结果集按分区显示行的细分。您能否说明您是如何通过您的方法实现这一目标的?
      • 已经发布了更好的答案,但是通过在 select 语句中使用 count(*),OP 可以通过操作 where 子句匹配相同的条件来获取每个分区中的行数(s ) 已用于表分区
      • 我的分区基于公司 ID。哪个是范围分区是可行的?
      • 嗨,Jae,是的!你可以做一个 where 子句,看起来像 where company id 在 0 和 x 之间,等等。
      【解决方案3】:

      收集统计数据后(使用默认的自动样本大小),几乎可以立即使用此查询检索数字:

      select partition_name, num_nulls
      from all_part_col_statistics
      where owner = user
          and table_name = 'TABLE_NAME'
          and column_name = 'COLUMN_NAME'
      order by partition_name;
      

      【讨论】:

      • 这些数字仍将是估计值
      • @a_horse_with_no_name 对于 11g+,除非您明确更改样本量,否则数字将是准确的。默认情况下,Oracle 会读取整个表,并且对于行数和空值数将 100% 准确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2021-09-22
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多