本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
執行深層複製
深層複製會使用會自動排序資料表的大量插入來重新建立和重新填入資料表。如果資料表有大型未排序的區域,深層複製較清空的速度快得多。建議您僅在可以追蹤更新時,再於深層複製操作期間進行並行更新。該程序完成後,將差異更新移到新資料表中。VACUUM 操作支援自動並行更新。
您可以選擇以下其中一個方法來建立原始資料表的複本:
-
使用原始資料表 DDL。
如果 CREATE TABLE DDL 可用,這是最快且偏好的方法。如果建立新的資料表,您可以指定所有資料表和資料欄屬性,包括主索引鍵和外部索引鍵。您可以使用 SHOWTABLE函數尋找原始 DDL 。
-
使用 CREATE TABLE LIKE。
如果原始 DDL無法使用,您可以使用 CREATETABLELIKE重新建立原始資料表。新的資料表會繼承父資料表的編碼、分佈索引鍵、排序索引鍵和非 null 屬性。新資料表不會繼承父資料表的主索引鍵和外部索引鍵屬性,但您可以使用 ALTER TABLE 新增它們。
-
建立暫時資料表並截斷原始資料表。
如果您必須保留父資料表的主索引鍵和外部索引鍵屬性。如果父資料表具有相依性,您可以使用 CREATE TABLE ... AS (CTAS) 來建立暫存資料表。然後截斷原始資料表並從暫時資料表填入它。
相較於使用永久資料表,使用暫時資料表可大幅改善效能,但有遺失資料的風險。暫時資料表在結束建立它所在的工作階段中時自動捨棄。TRUNCATE 即使位於交易區塊內, 也會立即遞交。如果 TRUNCATE成功,但工作階段在下列操作INSERT完成之前關閉,則會遺失資料。如果無法接受資料遺失,請使用永久資料表。
建立資料表副本之後,您可能必須授與新資料表的存取權。您可以使用 GRANT 來定義存取權限。若要檢視並授與資料表的所有存取權限,您必須是下列其中一個角色:
-
超級使用者。
-
您想要複製之資料表的擁有者。
-
具有查看資料表權限ACCESSSYSTEMTABLE之權限,以及所有相關許可之授予權限的使用者。
此外,您可能必須針對深層複製所在的結構描述授與使用許可。如果深層複製的結構描述與原始資料表的結構描述不同,且也不是 public
結構描述,則必須授與使用許可。若要檢視並授與使用權限,您必須是下列其中一個角色:
-
超級使用者。
-
可授予深層複本結構描述USAGE許可的使用者。
使用原始資料表執行深層複製 DDL
-
(選用) DDL 透過執行名為 的指令碼來重新建立資料表
v_generate_tbl_ddl
。 -
使用原始 CREATE TABLE 建立資料表的副本DDL。
-
使用 INSERT INTO ... SELECT陳述式將原始資料表中的資料填入複本。
-
檢查舊資料表上授與的權限。您可以在 SVV_RELATION_PRIVILEGES 系統檢視中查看這些許可。
-
如有必要,請對新資料表授與舊資料表的許可。
-
針對在原始資料表中具有權限的每個群組和使用者授與使用許可。如果您的深層複製資料表位於
public
結構描述中,或與原始資料表位於相同的結構描述中,則不需要執行此步驟。 -
捨棄原始資料表。
-
使用 ALTERTABLE陳述式將複本重新命名為原始資料表名稱。
下列範例會使用具SAMPLE名 sample_copy 的複本在SAMPLE資料表上執行深層複製。
--Create a copy of the original table in the sample_namespace namespace using the original CREATE TABLE DDL. create table
sample_namespace
.sample_copy ( … ); --Populate the copy with data from the original table in the public namespace. insert into sample_namespace.sample_copy (select * frompublic
.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to groupgroup1
; grant INSERT, UPDATE on table sample_namespace.sample_copy to groupgroup2
; grant SELECT on table sample_namespace.sample_copy touser1
; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy touser2
; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
若要使用 執行深層複製 CREATE TABLE LIKE
-
使用 建立新資料表CREATETABLELIKE。
-
使用 INSERT INTO ... SELECT陳述式,將目前資料表中的資料列複製到新資料表。
-
檢查舊資料表上授與的權限。您可以在 SVV_RELATION_PRIVILEGES 系統檢視中查看這些許可。
-
如有必要,請對新資料表授與舊資料表的許可。
-
針對在原始資料表中具有權限的每個群組和使用者授與使用許可。如果您的深層複製資料表位於
public
結構描述中,或與原始資料表位於相同的結構描述中,則不需要執行此步驟。 -
捨棄目前的資料表。
-
使用 ALTERTABLE陳述式將新資料表重新命名為原始資料表名稱。
下列範例會使用 CREATE TABLE 對SAMPLE資料表執行深層複製LIKE。
--Create a copy of the original table in the sample_namespace namespace using CREATE TABLE LIKE. create table
sameple_namespace
.sample_copy (likepublic
.sample); --Populate the copy with data from the original table. insert into sample_namespace.sample_copy (select * from public.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to groupgroup1
; grant INSERT, UPDATE on table sample_namespace.sample_copy to groupgroup2
; grant SELECT on table sample_namespace.sample_copy touser1
; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy touser2
; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
建立暫時資料表並截斷原始資料表來執行深層複製
-
使用 CREATE TABLE AS 建立具有原始資料表資料列的暫存資料表。
-
截斷目前的資料表。
-
使用 INSERT INTO ... SELECT陳述式,將暫存資料表中的資料列複製到原始資料表。
-
捨棄暫時資料表。
下列範例會透過建立暫存SALES資料表和截斷原始資料表,在資料表上執行深層複製。由於原始資料表仍會保留,因此您不需要對複製資料表授與許可。
--Create a temp table copy using CREATE TABLE AS. create temp table salestemp as select * from sales; --Truncate the original table. truncate sales; --Copy the rows from the temporary table to the original table. insert into sales (select * from salestemp); --Drop the temporary table. drop table salestemp;