我们可以根据两列对 oracle 数据库进行分区吗
Can we partition an oracle database based on two columns
我正在为一个新项目工作,该项目需要根据两列(城市和地区)对 table 进行分区。 oracle 数据库支持吗?
我之前从事的项目是在创建 table 时基于一列对数据库进行分区。但我不知道如何使用两列进行分区,我们使用相同的语义还是不同的语义
CREATE TABLE TEST (....)
PARTITION BY RANGE (date1) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION TEST_INITIAL VALUES less than (DATE '2000-01-01')
);
如果您有 Oracle 12.2 或更高版本,这很容易。使用自动分区。例如,
CREATE TABLE my_auto_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
other_data VARCHAR2(400) )
PARTITION BY LIST ( city_name, area_name) AUTOMATIC
( PARTITION p_dummy VALUES (null, null) )
;
12.2 之前,可以使用 LIST-LIST 分区,但这真的很痛苦,因为您必须预先创建所有分区和子分区。例如,
CREATE TABLE my_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
other_data VARCHAR2(400) )
PARTITION BY LIST ( city_name )
SUBPARTITION BY LIST ( area_name )
-- if your area names are generic (e.g., "north"/"south" or "downtown"/"suburbs"),
-- you can use a SUBPARTITION TEMPLATE clause right here...
( PARTITION p_philadelpha VALUES ( 'PHILADELPHIA')
( SUBPARTITION p_philly1 VALUES ('SOUTH PHILLY','WEST PHILLY'),
SUBPARTITION p_philly2 VALUES ('NORTH PHILLY','OLD CITY')
),
PARTITION p_new_york VALUES ( 'NEW YORK')
( SUBPARTITION p_nyc1 VALUES ('SOHO'),
SUBPARTITION p_nyc2 VALUES ('HELL''S KITCHEN')
)
);
我不会那样做。如果有人会问,这也是一样的:我喜欢按日期列的月份和日期对我的 table 进行分区。只需按天定义分区即可。
无论如何,如果您在其上定义虚拟列和分区,通常可以使用多个列:
CREATE TABLE my_auto_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
partition_key VARCHAR2(200) GENERATED ALWAYS AS (city_name||-||area_name) VIRTUAL)
PARTITION BY LIST ( partition_key ) ...
但我认为这对您的情况没有多大意义。
我正在为一个新项目工作,该项目需要根据两列(城市和地区)对 table 进行分区。 oracle 数据库支持吗?
我之前从事的项目是在创建 table 时基于一列对数据库进行分区。但我不知道如何使用两列进行分区,我们使用相同的语义还是不同的语义
CREATE TABLE TEST (....)
PARTITION BY RANGE (date1) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION TEST_INITIAL VALUES less than (DATE '2000-01-01')
);
如果您有 Oracle 12.2 或更高版本,这很容易。使用自动分区。例如,
CREATE TABLE my_auto_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
other_data VARCHAR2(400) )
PARTITION BY LIST ( city_name, area_name) AUTOMATIC
( PARTITION p_dummy VALUES (null, null) )
;
12.2 之前,可以使用 LIST-LIST 分区,但这真的很痛苦,因为您必须预先创建所有分区和子分区。例如,
CREATE TABLE my_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
other_data VARCHAR2(400) )
PARTITION BY LIST ( city_name )
SUBPARTITION BY LIST ( area_name )
-- if your area names are generic (e.g., "north"/"south" or "downtown"/"suburbs"),
-- you can use a SUBPARTITION TEMPLATE clause right here...
( PARTITION p_philadelpha VALUES ( 'PHILADELPHIA')
( SUBPARTITION p_philly1 VALUES ('SOUTH PHILLY','WEST PHILLY'),
SUBPARTITION p_philly2 VALUES ('NORTH PHILLY','OLD CITY')
),
PARTITION p_new_york VALUES ( 'NEW YORK')
( SUBPARTITION p_nyc1 VALUES ('SOHO'),
SUBPARTITION p_nyc2 VALUES ('HELL''S KITCHEN')
)
);
我不会那样做。如果有人会问,这也是一样的:我喜欢按日期列的月份和日期对我的 table 进行分区。只需按天定义分区即可。
无论如何,如果您在其上定义虚拟列和分区,通常可以使用多个列:
CREATE TABLE my_auto_partitioned_table
( id NUMBER,
city_name VARCHAR2(80),
area_name VARCHAR2(80),
partition_key VARCHAR2(200) GENERATED ALWAYS AS (city_name||-||area_name) VIRTUAL)
PARTITION BY LIST ( partition_key ) ...
但我认为这对您的情况没有多大意义。