Oracle 自動(dòng)分區(qū)表(Interval Partition)的使用
一、建表語(yǔ)句逐段解析
1. 表結(jié)構(gòu)定義
CREATE TABLE test_record (
id VARCHAR(255) primary key ,
message_id VARCHAR(555) NOT NULL,
receive_time TIMESTAMP NOT NULL,
message_type VARCHAR(555),
client_id VARCHAR(555),
smsc VARCHAR(555),
calling_number VARCHAR(555),
called_number VARCHAR(555),
message_content VARCHAR(4000),
response_time TIMESTAMP,
response_command_status INTEGER,
interval_ms BIGINT,
match_strategy_id VARCHAR(555),
match_strategy_name VARCHAR(555),
monitoring_strategy VARCHAR(555),
action_time TIMESTAMP,
action_type VARCHAR(555),
action_desc VARCHAR(555),
match_blacklist_handle_type varchar(255) NULL,
match_strategy_violation_reason varchar(255) NULL
)這是一張記錄表,核心字段說(shuō)明:
id:主鍵,唯一標(biāo)識(shí)每條記錄receive_time:分區(qū)鍵,消息接收時(shí)間,用于按時(shí)間分區(qū)calling_number/called_number:主叫 / 被叫號(hào)碼,用于高頻查詢(xún)索引- 其他字段為短信業(yè)務(wù)屬性(內(nèi)容、策略、狀態(tài)等)
2. 分區(qū)核心配置
TABLESPACE biz_data
PARTITION BY RANGE (receive_time)
INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
(
PARTITION p_init VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'))
);
| 配置項(xiàng) | 含義 | 關(guān)鍵說(shuō)明 |
|---|---|---|
| TABLESPACE biz_data | 表存儲(chǔ)在 biz_data 表空間 | 需提前創(chuàng)建該表空間,用于數(shù)據(jù)隔離與管理 |
| PARTITION BY RANGE (receive_time) | 按 receive_time 做范圍分區(qū) | 時(shí)間范圍分區(qū)是日志 / 流水表的標(biāo)準(zhǔn)方案,按時(shí)間維度快速歸檔 / 查詢(xún) |
| INTERVAL (NUMTODSINTERVAL(1, 'DAY')) | 自動(dòng)按天創(chuàng)建分區(qū) | Oracle 11g+ 特性,無(wú)需手動(dòng)建分區(qū),插入數(shù)據(jù)時(shí)自動(dòng)生成新分區(qū) |
| PARTITION p_init VALUES LESS THAN (TO_DATE('2026-01-01')) | 初始分區(qū) | 存儲(chǔ) 2026-01-01 00:00:00 之前的所有數(shù)據(jù),作為兜底分區(qū) |
自動(dòng)分區(qū)邏輯
- 當(dāng)插入一條
receive_time >= 2026-01-01的數(shù)據(jù)時(shí),Oracle 會(huì)自動(dòng)創(chuàng)建第一個(gè)日分區(qū),例如SYS_Pxxxx(系統(tǒng)生成名),對(duì)應(yīng)2026-01-01當(dāng)天的數(shù)據(jù) - 后續(xù)每天插入新數(shù)據(jù)時(shí),自動(dòng)生成對(duì)應(yīng)日期的分區(qū),完全無(wú)需人工維護(hù)
- 分區(qū)粒度:
1 DAY,即每個(gè)分區(qū)存儲(chǔ)完整一天的所有數(shù)據(jù)
3. 本地索引(LOCAL INDEX)
CREATE INDEX idx_receive_time_desc_composite ON test_record (receive_time DESC) LOCAL; CREATE INDEX idx_receive_calling_number_index ON test_record (calling_number) LOCAL; CREATE INDEX idx_receive_called_number_index ON test_record (called_number) LOCAL;
LOCAL關(guān)鍵字:本地分區(qū)索引,索引會(huì)跟隨表的分區(qū),每個(gè)分區(qū)對(duì)應(yīng)一個(gè)索引分區(qū)- 優(yōu)勢(shì):
- 分區(qū)維護(hù)(如刪除歷史分區(qū))時(shí),索引自動(dòng)同步,不會(huì)失效
- 分區(qū)查詢(xún)時(shí),僅掃描對(duì)應(yīng)分區(qū)的索引,性能遠(yuǎn)高于全局索引
- 自動(dòng)分區(qū)表不支持全局索引(除非禁用自動(dòng)分區(qū)),因此必須用本地索引
- 索引設(shè)計(jì):
receive_time DESC:按時(shí)間倒序,適配 “查最近 N 天數(shù)據(jù)” 的高頻場(chǎng)景calling_number/called_number:按號(hào)碼查詢(xún),適配反垃圾短信的號(hào)碼溯源需求
二、分區(qū)表生成的表名(分區(qū)名)規(guī)則
1. 初始分區(qū)名
- 手動(dòng)指定:
p_init,固定不變,存儲(chǔ)2026-01-01之前的所有數(shù)據(jù) - 對(duì)應(yīng)物理表名(數(shù)據(jù)字典中):
test_record(主表名)+ 分區(qū)名,即test_record本身是邏輯表,物理數(shù)據(jù)存儲(chǔ)在各個(gè)分區(qū)中
2. 自動(dòng)生成的分區(qū)名(核心問(wèn)題)
默認(rèn)規(guī)則(無(wú)自定義時(shí))
Oracle 會(huì)自動(dòng)生成系統(tǒng)命名的分區(qū)名,格式為:
SYS_P<唯一數(shù)字>
例如:SYS_P12345、SYS_P67890
- 缺點(diǎn):完全無(wú)業(yè)務(wù)含義,無(wú)法通過(guò)分區(qū)名識(shí)別對(duì)應(yīng)日期,運(yùn)維困難
- 數(shù)據(jù)字典查詢(xún):可通過(guò)
USER_TAB_PARTITIONS查看分區(qū)名與對(duì)應(yīng)時(shí)間范圍SELECT partition_name, high_value FROM user_tab_partitions WHERE table_name = 'test_record';
自定義分區(qū)名(推薦方案)
Oracle 12cR2+ 支持 INTERVAL 分區(qū)自定義命名模板,通過(guò) STORE IN + 模板實(shí)現(xiàn),示例如下:
-- 12cR2+ 支持的自定義分區(qū)名語(yǔ)法
CREATE TABLE test_record (
-- 表結(jié)構(gòu)不變,省略...
)
TABLESPACE biz_data
PARTITION BY RANGE (receive_time)
INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
STORE IN (biz_data) -- 指定分區(qū)存儲(chǔ)的表空間
(
PARTITION p_init VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'))
);
-- 自定義分區(qū)名模板(12cR2+ 特性)
ALTER TABLE test_record
SET INTERVAL PARTITION TEMPLATE 'P_YYYY_MM_DD';
- 模板說(shuō)明:
P_YYYY_MM_DD會(huì)自動(dòng)替換為分區(qū)對(duì)應(yīng)的日期,例如:2026-01-01分區(qū) →P_2026_01_012026-01-02分區(qū) →P_2026_01_02
- 優(yōu)勢(shì):分區(qū)名直接對(duì)應(yīng)日期,運(yùn)維、歸檔、排查一目了然
- 注意:11g 不支持自定義模板,只能用系統(tǒng)默認(rèn)名,若需自定義,需升級(jí)到 12cR2+
11g 兼容方案(無(wú)模板時(shí)的折中)
11g 無(wú)法自動(dòng)生成自定義名,只能通過(guò)事后重命名實(shí)現(xiàn):
-- 1. 先查詢(xún)自動(dòng)生成的分區(qū)名與對(duì)應(yīng)時(shí)間 SELECT partition_name, high_value FROM user_tab_partitions WHERE table_name = 'test_record'; -- 2. 手動(dòng)重命名(例如將 SYS_P12345 重命名為 P_2026_01_01) ALTER TABLE test_record RENAME PARTITION SYS_P12345 TO P_2026_01_01;
- 缺點(diǎn):需定期執(zhí)行腳本,無(wú)法自動(dòng)完成,適合數(shù)據(jù)量不大、分區(qū)數(shù)少的場(chǎng)景
三、關(guān)鍵注意事項(xiàng)
1. 分區(qū)鍵限制
- 自動(dòng)分區(qū)表的分區(qū)鍵必須是 DATE/TIMESTAMP 類(lèi)型(本場(chǎng)景
receive_time符合要求) - 分區(qū)鍵不能為 NULL(本場(chǎng)景
receive_time設(shè)為NOT NULL,符合要求)
2. 分區(qū)維護(hù)
- 刪除歷史數(shù)據(jù):直接刪除分區(qū),性能遠(yuǎn)高于
DELETE-- 刪除 2026-01-01 之前的歷史數(shù)據(jù)(刪除 p_init 分區(qū)) ALTER TABLE test_record DROP PARTITION p_init;
- 分區(qū)合并 / 拆分:自動(dòng)分區(qū)僅支持拆分初始分區(qū),自動(dòng)生成的分區(qū)無(wú)法拆分,需提前規(guī)劃分區(qū)粒度(本場(chǎng)景按天,適合日志表)
3. 索引注意事項(xiàng)
- 自動(dòng)分區(qū)表不支持全局索引,所有索引必須為
LOCAL - 本地索引的分區(qū)名與表分區(qū)名一一對(duì)應(yīng),例如表分區(qū)
P_2026_01_01對(duì)應(yīng)索引分區(qū)P_2026_01_01
四、優(yōu)化建議
- 分區(qū)粒度優(yōu)化:若數(shù)據(jù)量極大(日增千萬(wàn)級(jí)),可將分區(qū)粒度從
1 DAY調(diào)整為12 HOUR或6 HOUR,提升單分區(qū)查詢(xún)性能 - 自定義分區(qū)名:若使用 12cR2+,務(wù)必開(kāi)啟自定義模板,大幅提升運(yùn)維效率
- 表空間規(guī)劃:可按月份創(chuàng)建不同表空間,實(shí)現(xiàn)冷熱數(shù)據(jù)分離(歷史數(shù)據(jù)存低速存儲(chǔ),熱數(shù)據(jù)存高速存儲(chǔ))
- 分區(qū)統(tǒng)計(jì)信息:自動(dòng)分區(qū)會(huì)自動(dòng)收集統(tǒng)計(jì)信息,無(wú)需手動(dòng)執(zhí)行
ANALYZE,但需確保數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息自動(dòng)收集任務(wù)開(kāi)啟
五、查詢(xún)分區(qū)信息的常用 SQL
-- 1. 查看表的分區(qū)信息(分區(qū)名、時(shí)間范圍、行數(shù))
SELECT
partition_name,
high_value,
num_rows
FROM user_tab_partitions
WHERE table_name = 'test_record'
ORDER BY partition_position;
-- 2. 查看本地索引的分區(qū)信息
SELECT
index_name,
partition_name,
status
FROM user_ind_partitions
WHERE index_name IN ('IDX_RECEIVE_TIME_DESC_COMPOSITE', 'IDX_RECEIVE_CALLING_NUMBER_INDEX', 'IDX_RECEIVE_CALLED_NUMBER_INDEX');
-- 3. 查看分區(qū)表的分區(qū)鍵與間隔配置
SELECT
partitioning_type,
interval,
partition_key
FROM user_part_tables
WHERE table_name = 'test_record';
?? 總結(jié)
- 這是一張Oracle 按天自動(dòng)分區(qū)的范圍分區(qū)表,用于存儲(chǔ)反垃圾短信流水,自動(dòng)按天創(chuàng)建分區(qū),無(wú)需人工維護(hù)
- 分區(qū)名默認(rèn)由系統(tǒng)生成(
SYS_Pxxxx),12cR2+ 支持自定義日期格式的分區(qū)名,11g 需手動(dòng)重命名 - 本地索引適配自動(dòng)分區(qū),保證查詢(xún)性能與維護(hù)便捷性
到此這篇關(guān)于Oracle 自動(dòng)分區(qū)表(Interval Partition)的使用的文章就介紹到這了,更多相關(guān)Oracle 自動(dòng)分區(qū)表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)表空間滿(mǎn)了的問(wèn)題處理方法
在Oracle數(shù)據(jù)庫(kù)管理中,表空間是一個(gè)重要的概念,用于存儲(chǔ)數(shù)據(jù)庫(kù)對(duì)象和數(shù)據(jù),當(dāng)表空間滿(mǎn)了時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的運(yùn)行受到影響,本文將介紹如何診斷和處理 Oracle 數(shù)據(jù)庫(kù)中表空間滿(mǎn)的問(wèn)題,并給出相應(yīng)的 SQL 命令,需要的朋友可以參考下2024-03-03
從Oracle數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)自動(dòng)生成INSERT語(yǔ)句的方法
今天小編就為大家分享一篇關(guān)于從Oracle數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)自動(dòng)生成INSERT語(yǔ)句的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
ip修改后orcale服務(wù)無(wú)法啟動(dòng)問(wèn)題解決
今天配置虛擬機(jī)中設(shè)計(jì)了下ip,使虛擬機(jī)和主機(jī)處在同一網(wǎng)段,然后使用webservice就成功了就來(lái)了,oracle連接不上了,接下來(lái)講提供詳細(xì)的解決方法2012-11-11
Oracle11g RAC開(kāi)啟關(guān)閉、設(shè)置歸檔小結(jié)
這篇文章主要介紹了Oracle11g RAC開(kāi)啟關(guān)閉、設(shè)置歸檔,很簡(jiǎn)單,但很實(shí)用,需要的朋友可以參考下2014-09-09
oracle安裝出現(xiàn)亂碼等相關(guān)問(wèn)題
oracle安裝過(guò)程中出現(xiàn)亂碼等一系列相關(guān)問(wèn)題,本文將介紹如何解決,需要了解的朋友可以參考下2012-11-11
Oracle歸檔日志寫(xiě)滿(mǎn)(ora-00257)了怎么辦
今天在使用oracle數(shù)據(jù)庫(kù)做項(xiàng)目時(shí),突然報(bào)錯(cuò):ORA-00257: archiver error. Connect internal only, until freed,該問(wèn)題如何解決呢?經(jīng)過(guò)本人一番折騰此問(wèn)題還要?dú)w檔于日志滿(mǎn)了,下面小編把Oracle歸檔日志寫(xiě)滿(mǎn)(ora-00257)的解決辦法在此分享給大家供大家參考2015-10-10
Oracle to_char 日期轉(zhuǎn)換字符串語(yǔ)句分享
這篇文章主要介紹了Oracle to_char 日期轉(zhuǎn)換字符串語(yǔ)句,別處挖過(guò)來(lái)的,真是太長(zhǎng)了,學(xué)習(xí)oracle的朋友可以收藏下2014-08-08
使用MySQL語(yǔ)句來(lái)查詢(xún)Apache服務(wù)器日志的方法
這篇文章主要介紹了使用MySQL語(yǔ)句來(lái)查詢(xún)Apache服務(wù)器日志的方法,五個(gè)實(shí)例均基于Linux系統(tǒng)進(jìn)行演示,需要的朋友可以參考下2015-06-06

