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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- Oracle Partition 分割槽詳細總結Oracle
- 分割槽Partition
- oracle分割槽表和分割槽表exchangeOracle
- ORACLE刪除-表分割槽和資料Oracle
- PostgreSQL 原始碼解讀(98)- 分割槽表#4(資料查詢路由#1-“擴充套件”分割槽表)SQL原始碼路由套件
- oracle分割槽表和非分割槽表exchangeOracle
- oracle 更改分割槽表資料 ora-14402Oracle
- interval 分割槽表clob預設表空間指定問題
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- 分割槽partition知識點
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- ORACLE分割槽表梳理系列Oracle
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- Spark學習——分割槽Partition數Spark
- PostgreSQL:內建分割槽表SQL
- mysql 5.7.11查詢分割槽表的一個問題MySql
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- PostgreSQL 原始碼解讀(99)- 分割槽表#5(資料查詢路由#2-RelOptInfo數...SQL原始碼路由
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- 分割槽函式Partition By的基本用法函式
- Kafka分割槽分配策略(Partition Assignment Strategy)Kafka
- MySQL資料表分割槽手記MySql
- PostgreSQL 原始碼解讀(100)- 分割槽表#6(資料查詢路由#3-prune part...SQL原始碼路由
- PostgreSQL 原始碼解讀(101)- 分割槽表#7(資料查詢路由#4-prune part...SQL原始碼路由
- 對oracle分割槽表的理解整理Oracle
- Oracle SQL調優之分割槽表OracleSQL
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle