Oracle查詢Interval partition分割槽表內資料
本文對於Interval partition分割槽表內查詢資料的方法提供了可行方案,並在測試環境進行驗證。特別的,本文提供了2種MOS上的方法(福利),並將相關文章附在文末,供沒有MOS賬號的朋友參考學習。
本文基於一個已經建立的分割槽表進行測試,測試所用的表為BP_VOUCHER_HISTORY表,以月作為分割槽,系統自動命名分割槽。
1.檢視分割槽資訊
select table_name,partition_name,high_value,partition_position,num_rows from dba_tab_partitions where table_owner='CAMS_CORE' and table_name='BP_VOUCHER_HISTORY';
注:dba_tab_partitions | all_tab_partitions | user_tab_partitions表都可以
2.檢視分割槽內資料(以SYS_P82分割槽為例)
(1)如果 知道分割槽的名字 ,可以直接查詢對應的分割槽名
SYS@cams> select count(*) from cams_core.bp_voucher_history partition(SYS_P82);
COUNT(*)
----------
2844459
(2)如果 不知道分割槽的名字,但是知道分割槽主鍵的欄位值範圍 ,可以基於分割槽範圍進行查詢
SYS@cams> select count(*) from cams_core.bp_voucher_history partition where ac_dte>=to_date('2017-01-01','yyyy-mm-dd') and ac_dte<to_date('2017-02-01','yyyy-mm-dd');
COUNT(*)
----------
2844459
(3)如果 不知道分割槽的名字,也不知道分割槽主鍵的欄位值範圍 ,可以使用PARTITION FOR子句進行查詢,比如現在只知道2017-01-15是這個分割槽的資料
SYS@cams> select count(*) from cams_core.bp_voucher_history partition for(to_date('2017-01-15','yyyy-mm-dd'));
COUNT(*)
----------
2844459
-
注:PARTITION FOR子句可以用於指定分割槽,而不使用分割槽的名字。
3.根據分割槽內的分割槽欄位值,查詢Interval Partition分割槽的名字
因為Oracle並沒有提供直接的方法用於指定某個日期屬於哪個分割槽,所以這裡要藉助於dba_tab_partitions的high_value。但是這裡又有一個問題,high_value是Long型別的,不能使用to_date或者to_char函式直接進行轉化。
所以,要解決根據分割槽欄位值查詢分割槽的問題,本文的解決方案是把Oracle資料庫的Long型別轉化為varchar2型別或者date型別,然後進行比對,查詢出分割槽的名字。
set serveroutput on; --/ declare my_var date; begin for x in (select * from dba_tab_partitions where table_owner='CAMS_CORE' and table_name='BP_VOUCHER_HISTORY') loop execute immediate 'select '|| x.high_value || 'from dual' into my_var; if (my_var = to_date('2017-02-01','yyyy-mm-dd')) then dbms_output.put_line(x.partition_name); end if; end loop; end; /
同理,對於使用數字進行自動分割槽的情況,也可以透過類似的方法進行處理。
從MOS上找到的用於將high_value轉化為varvhar2型別的方法,這裡進行分享(已經對部分引數進行修改):
select subname, TO_CHAR(y1*100+y2, '9999') || '/' || TO_CHAR(m, 'FM09') || '/' || TO_CHAR(d, 'FM09') || ' ' || TO_CHAR(hh, 'FM09') || ':' || TO_CHAR(mi, 'FM09') || ':' || TO_CHAR(ss, 'FM09') from ( SELECT o.subname, tp.part#, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 3, 2), 'XX')-100 y1, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 5, 2), 'XX')-100 y2, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 7, 2), 'XX') m, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 9, 2), 'XX') d, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 11, 2), 'XX')-1 hh, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 13, 2), 'XX')-1 mi, TO_NUMBER(SUBSTR(RAWTOHEX(CAST(bhiboundval as raw(8))), 15, 2), 'XX')-1 ss from sys.tabpart$ tp, sys.obj$ o, sys.user$ u where tp.obj# = o.obj# and o.owner# = u.user# and o.name = 'BP_VOUCHER_HISTORY' and u.name = 'CAMS_CORE') order by part#;
with xml as ( select dbms_xmlgen.getxmltype('select table_name, partition_name, high_value from dba_tab_partitions where table_name = ''BP_VOUCHER_HISTORY'' and table_owner=''CAMS_CORE''') as x from dual ) select extractValue(rws.object_value, '/ROW/TABLE_NAME') table_name, extractValue(rws.object_value, '/ROW/PARTITION_NAME') partition, extractValue(rws.object_value, '/ROW/HIGH_VALUE') high_value from xml x, table(xmlsequence(extract(x.x, '/ROWSET/ROW'))) rws ORDER BY extractValue(rws.object_value, '/ROW/TABLE_NAME');
4.附錄(MOS原文)
Partition HIGH_VALUE Wrong When NLS_CALENDAR Not GREGORIAN (文件 ID 1964566.1) | 轉到底部 |
How To Select Specific Interval Partition With Sysdate? (文件 ID 2325059.1) | 轉到底部 |
各位讀者朋友如果有問題、有想法、有意見,可以在文末留言,也可關注作者微信公眾號“IT技術佳餚”,與作者交流。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31394774/viewspace-2220462/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Interval Partition 自動分割槽表-實驗Oracle
- Oracle分割槽表(Partition Table)Oracle
- INTERVAL分割槽表鎖分割槽操作
- Oracle Interval Partition 預設分割槽重新命名-指令碼Oracle指令碼
- 定期truncate 歷史間隔分割槽INTERVAL PARTITION
- 11g分割槽新特性之interval partition
- oracle分割槽partition及分割槽索引partition index(一)Oracle索引Index
- 【實驗】【PARTITION】RANGE分割槽表截斷表分割槽(Truncate Partition)
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- 分割槽表PARTITION table
- Oracle查詢分割槽表的最後一個分割槽值Oracle
- 分割槽表分割槽索引查詢效率探究索引
- 如何查詢分割槽表的分割槽及子分割槽
- ORACLE 11g 範圍分割槽錶轉換INTERVAL分割槽表Oracle
- Oracle查詢資料庫中所有表和分割槽表的記錄數Oracle資料庫
- Oracle Interval Partition 生產環境-建立表FACT_STORAGE_SHEET為分割槽的過程Oracle
- 【實驗】【PARTITION】exp匯出分割槽表資料
- Oracle11g INTERVAL分割槽新增分割槽策略Oracle
- oracle實用sql(14)--查詢分割槽表的分割槽列和子分割槽列OracleSQL
- 使用Oracle Database 11g建立Interval分割槽表OracleDatabase
- 分割槽表PARTITION table(轉)
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- ORACLE 範圍分割槽 partition-range分割槽Oracle
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- oracle 並行cpu查詢分割槽表測試Oracle並行
- 【實驗】【PARTITION】RANGE分割槽表重新命名錶分割槽(Rename Partition)
- MySQL 分割槽表 partition線上修改分割槽欄位MySql
- 【實驗】【PARTITION】RANGE分割槽表合併分割槽
- 【實驗】【PARTITION】RANGE分割槽表增加分割槽
- 【實驗】【PARTITION】RANGE分割槽表刪除分割槽
- Oracle 分割槽(partition)技術Oracle
- oracle分割槽及分割槽索引partition_partition index_維護(一)Oracle索引Index
- oracle分割槽及分割槽索引partition_partition index_維護(二)Oracle索引Index
- oracle分割槽及分割槽索引partition_partition index_維護(三)Oracle索引Index
- oracle分割槽及分割槽索引partition_partition index_維護(四)Oracle索引Index
- partition 分割槽表重新命名
- oracle reference partition引用分割槽(一)Oracle
- oracle list partition列表分割槽(一)Oracle