Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Melakukan salinan yang dalam
Salinan mendalam membuat ulang dan mengisi ulang tabel dengan menggunakan sisipan massal, yang secara otomatis mengurutkan tabel. Jika sebuah tabel memiliki Wilayah besar yang tidak disortir, salinan dalam jauh lebih cepat daripada ruang hampa. Kami menyarankan Anda hanya membuat pembaruan bersamaan selama operasi penyalinan mendalam jika Anda dapat melacaknya. Setelah proses selesai, pindahkan pembaruan delta ke tabel baru. VACUUMOperasi mendukung pembaruan bersamaan secara otomatis.
Anda dapat memilih salah satu metode berikut untuk membuat salinan tabel asli:
-
Gunakan tabel asliDDL.
Jika tersedia, ini adalah metode tercepat dan disukai. CREATE TABLE DDL Jika Anda membuat tabel baru, Anda dapat menentukan semua atribut tabel dan kolom, termasuk kunci primer dan kunci asing. Anda dapat menemukan yang asli DDL dengan menggunakan SHOW TABLE fungsi.
-
Gunakan CREATE TABLELIKE.
Jika aslinya tidak DDL tersedia, Anda dapat menggunakan CREATE TABLE LIKE untuk membuat ulang tabel asli. Tabel baru mewarisi encoding, kunci distribusi, kunci sortir, dan atribut bukan-null dari tabel induk. Tabel baru tidak mewarisi kunci primer dan atribut kunci asing dari tabel induk, tetapi Anda dapat menambahkannya menggunakanALTER TABLE.
-
Buat tabel sementara dan potong tabel asli.
Jika Anda harus mempertahankan kunci primer dan atribut kunci asing dari tabel induk. Jika tabel induk memiliki dependensi, Anda dapat menggunakan... CREATE TABLE AS (CTAS) untuk membuat tabel sementara. Kemudian potong tabel asli dan isi dari tabel sementara.
Menggunakan tabel sementara meningkatkan kinerja secara signifikan dibandingkan dengan menggunakan tabel permanen, tetapi ada risiko kehilangan data. Tabel sementara secara otomatis dijatuhkan di akhir sesi di mana ia dibuat. TRUNCATEberkomitmen segera, bahkan jika itu berada di dalam blok transaksi. Jika TRUNCATE berhasil tetapi sesi ditutup sebelum yang berikut INSERT selesai, data hilang. Jika kehilangan data tidak dapat diterima, gunakan tabel permanen.
Setelah membuat salinan tabel, Anda mungkin harus memberikan akses ke tabel baru. Anda dapat menggunakan GRANT untuk menentukan hak akses. Untuk melihat dan memberikan semua hak akses tabel, Anda harus menjadi salah satu dari yang berikut:
-
Seorang pengguna super.
-
Pemilik tabel yang ingin Anda salin.
-
Pengguna dengan ACCESS SYSTEM TABLE hak istimewa untuk melihat hak istimewa tabel, dan dengan hak istimewa pemberian untuk semua izin yang relevan.
Selain itu, Anda mungkin harus memberikan izin penggunaan untuk skema salinan mendalam Anda. Pemberian izin penggunaan diperlukan jika skema deep copy Anda berbeda dari skema tabel asli, dan juga bukan skema. public
Untuk melihat dan memberikan hak penggunaan, Anda harus menjadi salah satu dari yang berikut:
-
Seorang pengguna super.
-
Pengguna yang dapat memberikan USAGE izin untuk skema deep copy.
Untuk melakukan deep copy menggunakan tabel asli DDL
-
(Opsional) Buat ulang tabel DDL dengan menjalankan skrip yang disebut
v_generate_tbl_ddl
. -
Buat salinan tabel menggunakan aslinya CREATE TABLEDDL.
-
Gunakan SELECT pernyataan INSERTINTO... untuk mengisi salinan dengan data dari tabel asli.
-
Periksa izin yang diberikan pada tabel lama. Anda dapat melihat izin ini di tampilan PRIVILEGES sistem SVV RELATION _ _.
-
Jika perlu, berikan izin tabel lama ke tabel baru.
-
Berikan izin penggunaan kepada setiap grup dan pengguna yang memiliki hak istimewa di tabel asli. Langkah ini tidak diperlukan jika tabel deep copy Anda ada dalam
public
skema, atau berada dalam skema yang sama dengan tabel asli. -
Jatuhkan meja aslinya.
-
Gunakan ALTER TABLE pernyataan untuk mengganti nama salinan ke nama tabel asli.
Contoh berikut melakukan salinan dalam pada SAMPLE tabel menggunakan duplikat SAMPLE bernama sample_copy.
--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;
Untuk melakukan deep copy menggunakan CREATE TABLE LIKE
-
Buat tabel baru menggunakan CREATE TABLELIKE.
-
Gunakan SELECT pernyataan INSERTINTO... untuk menyalin baris dari tabel saat ini ke tabel baru.
-
Periksa izin yang diberikan pada tabel lama. Anda dapat melihat izin ini di tampilan PRIVILEGES sistem SVV RELATION _ _.
-
Jika perlu, berikan izin tabel lama ke tabel baru.
-
Berikan izin penggunaan kepada setiap grup dan pengguna yang memiliki hak istimewa di tabel asli. Langkah ini tidak diperlukan jika tabel deep copy Anda ada dalam
public
skema, atau berada dalam skema yang sama dengan tabel asli. -
Jatuhkan tabel saat ini.
-
Gunakan ALTER TABLE pernyataan untuk mengganti nama tabel baru menjadi nama tabel asli.
Contoh berikut melakukan salinan mendalam di atas SAMPLE meja menggunakan CREATE TABLELIKE.
--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;
Untuk melakukan penyalinan mendalam dengan membuat tabel sementara dan memotong tabel asli
-
Gunakan CREATE TABLE AS untuk membuat tabel sementara dengan baris dari tabel asli.
-
Potong tabel saat ini.
-
Gunakan SELECT pernyataan INSERTINTO... untuk menyalin baris dari tabel sementara ke tabel asli.
-
Jatuhkan meja sementara.
Contoh berikut melakukan salinan mendalam di atas SALES meja dengan membuat tabel sementara dan memotong tabel asli. Karena tabel asli tetap ada, Anda tidak perlu memberikan izin ke tabel salin.
--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;