简体   繁体   English

如何在oracle 12c中的单个选择中计算每个范围分区的记录?

[英]How to count records per ranged partition within a single select in oracle 12c?

The solution I'm looking for (if it exists) is to directly partition by the actual partition and not by a calculated value.我正在寻找的解决方案(如果存在)是直接按实际分区而不是按计算值进行分区。

Table Pseudo-Code:表伪代码:

create table table_1 as (part_col DATE, val_col VARCHAR2(1))
partition by range part_col (
   PARTITION t_20160515 VALUES LESS THAN (TO_DATE('2016-05-15','YYYY-MM-DD'))
   PARTITION t_20160516 VALUES LESS THAN (TO_DATE('2016-05-16','YYYY-MM-DD'))
   ...
);

Select Pseudo-Code:选择伪代码:

select partition as P, count(*) as C from table_1
group by partition;

Desired Result想要的结果

  P        |  C
-----------|-----
2016-05-15 | 8
2016-05-16 | 99

Works but not what I'm looking for:有效但不是我正在寻找的:

select trunc(part_col) P, count(*) C from table_1;

Run this to generate a set of selects for each partition运行它为每个分区生成一组选择

SELECT 'SELECT ' || chr(39) || partition_Name || chr(39) || ', count(*) 
        FROM ' ||table_name ||' partition (' || partition_name || 
        ') UNION ALL ' as test 
FROM all_tab_partitions 
WHERE table_Name = 'Table_1'

Results in something like:结果如下:

SELECT 'P1', count(*) FROM Table_1 partition (P1) UNION ALL 
SELECT 'P2', count(*) FROM Table_1 partition (P2) UNION ALL 
SELECT 'P3', count(*) FROM Table_1 partition (P3) UNION ALL 
SELECT 'P4', count(*) FROM Table_1 partition (P4) UNION ALL 
SELECT 'P5', count(*) FROM Table_1 partition (P5) UNION ALL

Copy and paste results removing last union all and then run.复制并粘贴结果,删除最后一个联合,然后运行。 Not so sure about performance... I hit a table with 5 partitions and it completed in about 2 sec total rows only around 5 mil.不太确定性能......我打了一个有 5 个分区的表,它在大约 2 秒内完成,总行数只有大约 500 万。

The query can count the rows in each partition for a given partitioned table as below.查询可以为给定的分区表计算每个分区中的行数,如下所示。

select table_name ,Partition_name,high_value ,
 to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select /*+ parallel(a,8) */
count(*) c from '||table_name||' partition ('||partition_name||') a ')),'/ROWSET/ROW/C')) as count 
from user_tab_partitions where table_name='LINEORDER';

LINEORDER   P1  TO_DATE(' 1900-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 0
LINEORDER   SYS_P4365   TO_DATE(' 1996-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 108
LINEORDER   SYS_P4366   TO_DATE(' 1994-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 142
LINEORDER   SYS_P4367   TO_DATE(' 1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 186
LINEORDER   SYS_P4368   TO_DATE(' 1997-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 175
LINEORDER   SYS_P4369   TO_DATE(' 1998-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 213
LINEORDER   SYS_P4370   TO_DATE(' 1993-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 128
LINEORDER   SYS_P4371   TO_DATE(' 1999-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 47

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM