Melakukan salinan yang dalam - Amazon Redshift

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. Operasi VACUUM mendukung pembaruan bersamaan secara otomatis.

Anda dapat memilih salah satu metode berikut untuk membuat salinan tabel asli:

  • Gunakan tabel asli DDL.

    Jika CREATE TABLE DDL tersedia, ini adalah metode tercepat dan disukai. Jika Anda membuat tabel baru, Anda dapat menentukan semua atribut tabel dan kolom, termasuk kunci primer dan kunci asing. Anda dapat menemukan DDL asli dengan menggunakan fungsi SHOW TABLE.

  • Gunakan CREATE TABLE LIKE.

    Jika DDL asli tidak 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. TRUNCATE berkomitmen segera, bahkan jika itu berada di dalam blok transaksi. Jika TRUNCATE berhasil tetapi sesi dimatikan sebelum INSERT berikut selesai, data akan 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 HIBAH 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 hak istimewa ACCESS SYSTEM TABLE 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 izin USE untuk skema deep copy.

Untuk melakukan deep copy menggunakan tabel asli DDL
  1. (Opsional) Buat ulang tabel DDL dengan menjalankan skrip yang disebut. v_generate_tbl_ddl

  2. Buat salinan tabel menggunakan CREATE TABLE DDL asli.

  3. Gunakan pernyataan INSERT INTO... SELECT untuk mengisi salinan dengan data dari tabel asli.

  4. Periksa izin yang diberikan pada tabel lama. Anda dapat melihat izin ini di tampilan sistem SVV_RELATION_PRIVILEGES.

  5. Jika perlu, berikan izin tabel lama ke tabel baru.

  6. 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.

  7. Jatuhkan meja aslinya.

  8. Gunakan pernyataan ALTER TABLE untuk mengganti nama salinan ke nama tabel asli.

Contoh berikut melakukan deep copy pada tabel SAMPLE 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 * 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 group group1; grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2; grant SELECT on table sample_namespace.sample_copy to user1; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2; --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
  1. Buat tabel baru menggunakan CREATE TABLE LIKE.

  2. Gunakan pernyataan INSERT INTO... SELECT untuk menyalin baris dari tabel saat ini ke tabel baru.

  3. Periksa izin yang diberikan pada tabel lama. Anda dapat melihat izin ini di tampilan sistem SVV_RELATION_PRIVILEGES.

  4. Jika perlu, berikan izin tabel lama ke tabel baru.

  5. 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.

  6. Jatuhkan tabel saat ini.

  7. Gunakan pernyataan ALTER TABLE untuk mengganti nama tabel baru menjadi nama tabel asli.

Contoh berikut melakukan deep copy pada tabel SAMPLE menggunakan CREATE TABLE LIKE.

--Create a copy of the original table in the sample_namespace namespace using CREATE TABLE LIKE. create table sameple_namespace.sample_copy (like public.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 group group1; grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2; grant SELECT on table sample_namespace.sample_copy to user1; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2; --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
  1. Gunakan CREATE TABLE AS untuk membuat tabel sementara dengan baris dari tabel asli.

  2. Memotong tabel saat ini.

  3. Gunakan pernyataan INSERT INTO... SELECT untuk menyalin baris dari tabel sementara ke tabel asli.

  4. Jatuhkan meja sementara.

Contoh berikut melakukan salinan mendalam pada tabel PENJUALAN 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;