Creating Sharded Database Schema Objects
The following topics show you how to create the schema objects in your sharded database. Refer back to the Sharded Database Schema Objects section in chapter 2 for conceptual information about these objects.
- Create an All-Shards User
Local users that only exist in the shard catalog database do not have the privileges to create schema objects in the sharded database. The first step of creating the sharded database schema is to create an all-shards user. - Creating a Sharded Table Family
Create a sharded table family with theSQL CREATE TABLE
statement. You can specify parent-child relationships between tables using reference partitioning or equi-partitioning. - Creating Sharded Tables
A sharded table is a table that is partitioned into smaller and more manageable pieces among multiple databases, called shards. - Creating Duplicated Tables
The number of database requests handled by a single shard can be maximized by duplicating read-only or read-mostly tables across all shards. This strategy is a good choice for relatively small tables that are not updated frequently, and that are often accessed together with sharded tables. - Updating Duplicated Tables and Synchronizing Their Contents
Oracle Sharding synchronizes the contents of duplicated tables using Materialized View Replication.
Parent topic: Sharded Database Schema Design
Create an All-Shards User
Local users that only exist in the shard catalog database do not have the privileges to create schema objects in the sharded database. The first step of creating the sharded database schema is to create an all-shards user.
Create an all-shards user by connecting to the shard catalog database as a
privileged user, enabling SHARD DDL
, and executing the CREATE
USER
command. When the all-shards user connects to the shard catalog
database, the SHARD DDL
mode is enabled by default.
Note:
Local users can create non-schema sharded database objects, such as
tablespaces, directories, and contexts, if they enable SHARD DDL
mode; however, they cannot create schema objects, such as tables, views, indexes,
functions, procedures, and so on.
Sharded objects cannot have any dependency on local objects. For example, you cannot create an all-shard view on a local table.
You cannot grant SYS
privileges to sharded users using sharded DDL.
You must log in to each shard and grant the privilege to the account manually on
that shard.
Parent topic: Creating Sharded Database Schema Objects
Creating a Sharded Table Family
Create a sharded table family with the SQL CREATE TABLE
statement. You can specify parent-child relationships between tables using reference
partitioning or equi-partitioning.
Use Reference Partitioning to Specify Parent-Child Relationships Between Tables
The recommended way to create a sharded table family is to specify parent-child relationships between tables using reference partitioning.
Partitioning by reference simplifies the syntax since the partitioning scheme is only specified for the root table. Also, partition management operations that are performed on the root table are automatically propagated to its descendents. For example, when adding a partition to the root table, a new partition is created on all its descendents.
The appropriate CREATE TABLE
statements for
Customers–Orders–LineItems schema using a system-managed sharding methodology are shown
below. The first statement creates the root table of the table family, Customers.
CREATE SHARDED TABLE Customers
( CustNo NUMBER NOT NULL
, Name VARCHAR2(50)
, Address VARCHAR2(250)
, CONSTRAINT RootPK PRIMARY KEY(CustNo)
)
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
The following two statements create the Orders and LineItems tables, which are a child and grandchild of the Customers table.
CREATE SHARDED TABLE Orders
( OrderNo NUMBER NOT NULL
, CustNo NUMBER NOT NULL
, OrderDate DATE
, CONSTRAINT OrderPK PRIMARY KEY (CustNo, OrderNo)
, CONSTRAINT CustFK FOREIGN KEY (CustNo) REFERENCES Customers(CustNo)
)
PARTITION BY REFERENCE (CustFK)
;
CREATE SHARDED TABLE LineItems
( CustNo NUMBER NOT NULL
, LineNo NUMBER(2) NOT NULL
, OrderNo NUMBER(5) NOT NULL
, StockNo NUMBER(4)
, Quantity NUMBER(2)
, CONSTRAINT LinePK PRIMARY KEY (CustNo, OrderNo, LineNo)
, CONSTRAINT LineFK FOREIGN KEY (CustNo, OrderNo) REFERENCES Orders(CustNo, OrderNo)
)
PARTITION BY REFERENCE (LineFK)
;
In the example statements above, corresponding partitions of all tables in the family are stored in the same tablespace set, TS1. However, it is possible to specify separate tablespace sets for each table.
Note that in the example statements above, the partitioning column
CustNo
used as the sharding key is present in all three tables.
This is despite the fact that reference partitioning, in general, allows a child table
to be equi-partitioned with the parent table without having to duplicate the key columns
in the child table. The reason for this is that reference partitioning requires a
primary key in a parent table because the primary key must be specified in the foreign
key constraint of a child table used to link the child to its parent. However, a primary
key on a sharded table must be the same as, or contain, the sharding key. This makes it
possible to enforce global uniqueness of a primary key without coordination with other
shards, a critical requirement for linear scalability.
To summarize, the use of reference-partitioned tables in a sharded database requires adhering to the following rules:
-
A primary key on a sharded table must either be the same as the sharding key, or contain the sharding key. This is required to enforce global uniqueness of a primary key without coordination with other shards.
-
Reference partitioning requires a primary key in a parent table, because the primary key must be specified in the foreign key constraint of a child table to link the child to its parent. It is also possible to have a foreign key constraint when the parent table has just
UNIQUE
constraint, but noPRIMARY KEY
. The sharding key must also beNOT NULL
.For example, to link the LineItems (child) table to the Orders (parent) table, you need a primary key in the Orders table. The second rule implies that the primary key in the Orders table contains the
CustNo
value. (This is an existing partitioning rule not specific to Oracle Sharding.)
Use Equi-Partitioning to Specify Parent-Child Relationships Between Tables
In some cases it is impossible or undesirable to create primary and foreign
key constraints that are required for reference partitioning. For such cases, specifying
parent-child relationships in a table family requires that all tables are explicitly
equi-partitioned. Each child table is created with the PARENT
clause in
CREATE SHARDED TABLE
that contains the name of its parent. An
example of the syntax is shown below.
CREATE SHARDED TABLE Customers
( CustNo NUMBER NOT NULL
, Name VARCHAR2(50)
, Address VARCHAR2(250)
, region VARCHAR2(20)
, class VARCHAR2(3)
, signup DATE
)
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
CREATE SHARDED TABLE Orders
( OrderNo NUMBER
, CustNo NUMBER NOT NULL
, OrderDate DATE
)
PARENT Customers
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
CREATE SHARDED TABLE LineItems
( LineNo NUMBER
, OrderNo NUMBER
, CustNo NUMBER NOT NULL
, StockNo NUMBER
, Quantity NUMBER
)
PARENT Customers
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
Because the partitioning scheme is fully specified in all of the
CREATE SHARDED TABLE
statements, any table can be independently
subpartitioned. This is not permitted with reference partitioning where subpartitions
can only be specified for the root table and the subpartitioning scheme is the same for
all tables in a table family.
Note that this method only supports two-level table families, that is, all children must have the same parent and grandchildren cannot exist. This is not a limitation as long as the partitioning column from the parent table exists in all of the child tables.
See Also:
Oracle Database VLDB and Partitioning Guide for information about reference partitioning
Parent topic: Creating Sharded Database Schema Objects
Creating Sharded Tables
A sharded table is a table that is partitioned into smaller and more manageable pieces among multiple databases, called shards.
Tablespace Set Sizing
In the system-managed and composite sharding methods, when you create a tablespace set on the shard catalog, you must make sure you have enough space for all of the tablespaces created on the shard catalog and on each of the shards. This is especially important in a metered usage environment.
For example, with a shard catalog and three shards in the configuration, you issue the following statements.
ALTER SESSION ENABLE SHARD DDL;
CREATE TABLESPACE SET TSP_SET_1 IN SHARDSPACE SHSPC_1 USING TEMPLATE
(DATAFILE SIZE 100M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED);
Assuming a default of 120 chunks per shard, the command creates 360 tablespaces of an initial tables space 100M each on the shard catalog and on each shard. While that doesn't sound like a lot of storage, when the database administrator allots 100G initially, they are not expecting 3.6TB per shard. If that amount of storage is not planned for, this may lead to a failed DDL, and will require significant effort to recover from.
Creating Sharded Tables in a System-Managed Sharded Database
In a system-managed sharded database, data is automatically distributed across the shards using partitioning by consistent hash.
Before creating a sharded table, create a tablespace set with CREATE TABLESPACE
SET
to store the table partitions.
CREATE TABLESPACE SET ts1;
If you need to customize the tablespace attributes, add the USING
TEMPLATE
clause to CREATE TABLESPACE SET
as shown in this
example.
CREATE TABLESPACE SET ts1
USING TEMPLATE
( DATAFILE SIZE 10M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K
SEGMENT SPACE MANAGEMENT AUTO
ONLINE
)
;
You create a sharded table with CREATE SHARDED TABLE
,
horizontally partitioning the table across the shards based on the sharding key
cust_id
.
CREATE SHARDED TABLE customers
( cust_id NUMBER NOT NULL
, name VARCHAR2(50)
, address VARCHAR2(250)
, region VARCHAR2(20)
, class VARCHAR2(3)
, signup DATE
CONSTRAINT cust_pk PRIMARY KEY(cust_id)
)
PARTITION BY CONSISTENT HASH (cust_id)
PARTITIONS AUTO
TABLESPACE SET ts1
;
A system-managed sharded table is partitioned by consistent hash, by specifying
PARTITION BY CONSISTENT HASH
(primary_key_column)
.
The PARTITIONS AUTO
clause specifies that the number of partitions is
automatically set to the number of tablespaces in the tablespace set
ts1
, and each partition is stored in a separate tablespace.
Creating Sharded Tables in a User-Defined Sharded Database
In a user-defined sharded database, you explicitly map data to individual shards. A sharded table in a user-defined sharded database can be partitioned by range or list.
You do not create tablespace sets for user-defined sharded tables; however, you must create each tablespace individually and explicitly associate it with a shardspace deployed in the sharded database configuration, as shown here.
CREATE TABLESPACE tbs1 IN SHARDSPACE west;
CREATE TABLESPACE tbs2 IN SHARDSPACE west;
CREATE TABLESPACE tbs3 IN SHARDSPACE central;
CREATE TABLESPACE tbs4 IN SHARDSPACE central;
CREATE TABLESPACE tbs5 IN SHARDSPACE east;
CREATE TABLESPACE tbs6 IN SHARDSPACE east;
When you create the sharded table, you define the partitions with the ranges or lists of data to be stored in each tablespace, as shown in the following example.
CREATE SHARDED TABLE accounts
( id NUMBER
, account_number NUMBER
, customer_id NUMBER
, branch_id NUMBER
, state VARCHAR(2) NOT NULL
, status VARCHAR2(1)
)
PARTITION BY LIST (state)
( PARTITION p_northwest VALUES ('OR', 'WA') TABLESPACE ts1
, PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') TABLESPACE ts2
, PARTITION p_northcentral VALUES ('SD', 'WI') TABLESPACE ts3
, PARTITION p_southcentral VALUES ('OK', 'TX') TABLESPACE ts4
, PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') TABLESPACE ts5
, PARTITION p_southeast VALUES ('FL', 'GA') TABLESPACE ts6
)
;
Creating Sharded Tables in a Composite Sharded Database
The sharded database using the composite sharding method allows you to partition subsets of data that correspond to a range or list of key values in a table partitioned by consistent hash.
With composite sharding, as with the other sharding methods, tablespaces are used to specify the mapping of partitions to shards. To partition subsets of data in a sharded table, a separate tablespace set must be created for each shardspace deployed in the sharded database configuration as shown in the following example.
CREATE TABLESPACE SET tbs1 IN SHARDSPACE shspace1;
CREATE TABLESPACE SET tbs2 IN SHARDSPACE shspace2;
The statement in the following example partitions a sharded table into two partition sets: gold and silver, based on class of service. Each partition set is stored in a separate tablespace. Then data in each partition set is further partitioned by consistent hash on customer ID.
CREATE SHARDED TABLE customers
( cust_id NUMBER NOT NULL
, name VARCHAR2(50)
, address VARCHAR2(250)
, location_id VARCHAR2(20)
, class VARCHAR2(3)
, signup_date DATE
, CONSTRAINT cust_pk PRIMARY KEY(cust_id, class)
)
PARTITIONSET BY LIST (class)
PARTITION BY CONSISTENT HASH (cust_id)
PARTITIONS AUTO
(PARTITIONSET gold VALUES (‘gld’) TABLESPACE SET tbs1,
PARTITIONSET silver VALUES (‘slv’) TABLESPACE SET tbs2)
;
Parent topic: Creating Sharded Database Schema Objects
Creating Duplicated Tables
The number of database requests handled by a single shard can be maximized by duplicating read-only or read-mostly tables across all shards. This strategy is a good choice for relatively small tables that are not updated frequently, and that are often accessed together with sharded tables.
There are some limitations on duplicated tables. The following are not supported for duplicated tables.
-
NOLOGGING
-
ALTER TABLE ADD/DROP CONSTRAINT
for primary key only ALTER TABLE ADD/DROP PRIMARY KEY
-
ALTER TABLE RENAME COLUMN
-
PARTITION BY REFERENCE
-
PARTITION BY SYSTEM
-
CLUSTERED TABLE
- Non-final
UDT
orNESTED TABLE
-
LONG DATATYPE
-
COLUMN VECTOR ENCODE
-
INVISIBLE COLUMN
- Column encryption
- Information Lifecycle Management (ILM) policy
- CTAS Parallel
- Foreign key constraints between duplicated tables and sharded tables are
generally not allowed with the exception that in user-defined sharding, you can
create
DISABLE NOVALIDATE
foreign key constraints between sharded and duplicated tables.
The Products duplicated table can be created using the following statement.
CREATE DUPLICATED TABLE Products
( StockNo NUMBER PRIMARY KEY
, Description VARCHAR2(20)
, Price NUMBER(6,2))
;
Parent topic: Creating Sharded Database Schema Objects
Updating Duplicated Tables and Synchronizing Their Contents
Oracle Sharding synchronizes the contents of duplicated tables using Materialized View Replication.
A duplicated table on each shard is represented by a materialized view.
The master table for the materialized views is located in the shard catalog. The
CREATE DUPLICATED TABLE
statement automatically creates the
master table, materialized views, and other objects required for materialized view
replication.
You can connect to any shard and update a duplicated table directly on the shard. The update is first propagated over a database link from the shard to the master table on the shard catalog. Then the update is asynchronously propagated to all other shards as a result of a materialized view refresh.
The materialized views on all of the shards can be refreshed with one of the two options:
- Automatic refresh at a configurable frequency per table
- On-demand refresh by running a stored procedure
For automatic refresh, to get better refresh performance, you can also use a stored procedure interface to create materialized view refresh groups.
Note:
A race condition is possible when a transaction run on a shard tries to update a row which was deleted on the shard catalog. In this case, an error is returned and the transaction on the shard is rolled back.
The following use cases are not supported when updating duplicated tables on a shard.
- Updating a LOB or a data type not supported by database links
- Updating or deleting of a row inserted by the same transaction
Parent topic: Creating Sharded Database Schema Objects