Misalkan saya memiliki tabel lebar (PELANGGAN) yang berisi banyak kolom (CUSTOMER_ID, FIRST_NAME, LAST_NAME, DOB, ADDRESS, PHONE_NUMBER, dll).

Tabel ini digunakan dalam beberapa pemindaian tabel penuh, yang masing-masing hanya memilih sejumlah kecil kolom tabel. Karena tabel ini sangat besar, pemindaian tabel lengkap ini sangat mahal.

Untuk membuat kueri ini lebih baik, saya ingin membuat sebuah cluster (pada CUSTOMER_ID), dan membuat beberapa tabel tipis dalam cluster ini (misalnya CUSTOMER_NAMES untuk FIRST_NAME dan LAST_NAME). Setelah ini diatur, meja yang lebih tipis dapat dipindai penuh alih-alih meja yang lebih lebar, yang akan jauh lebih murah.

Kesulitan datang dari menemukan cara terbaik untuk mengisi tabel tipis di cluster:

  • Pernyataan INSERT ALL dapat dimasukkan ke dalam beberapa tabel dalam satu pernyataan, tetapi menurut saya itu tidak dapat digunakan untuk menyisipkan data yang dipilih dari tabel lain.
  • Saya dapat menggunakan pernyataan sisipan terpisah untuk setiap tabel tipis yang dipilih dari tabel lebar, tetapi itu berarti tabel lebar harus dipindai penuh untuk setiap tabel tipis.
  • Saya dapat menggunakan beberapa pernyataan unpivot besar untuk menghasilkan versi tabel lebar yang tidak dipivot dan memasukkannya ke dalam tabel yang dipartisi pada nama kolom asli, kemudian menggunakannya untuk menyisipkan ke tabel tipis. Ini akan membutuhkan pemindaian penuh tabel lebar untuk setiap tipe data yang berbeda, dan menghapus data untuk memutarnya lagi segera setelah itu terasa cukup cerdik.
  • Saya dapat membuat tampilan yang dapat diperbarui yang bergabung dari masing-masing tabel tipis dan memasukkan ke dalam tampilan itu, tetapi karena saya memahaminya hanya satu tabel yang dapat diperbarui sedemikian rupa

Apakah ada cara yang lebih baik untuk memasukkan ke dalam tabel tipis? Saya merasa harus ada cara yang hanya memindai tabel lebar sekali.

0
EdG 1 Juli 2020, 16:36

1 menjawab

Jawaban Terbaik

Pernyataan INSERT ALL dapat dimasukkan ke dalam beberapa tabel dalam satu pernyataan, tetapi menurut saya itu tidak dapat digunakan untuk menyisipkan data yang dipilih dari tabel lain.

Ya bisa. Ada contoh dalam dokumentasi. Di sini Anda dapat melakukan sesuatu seperti:

insert all
into customer_name (customer_id, first_name, last_name)
            values (customer_id, first_name, last_name)
into customer_dob (customer_id, dob)
           values (customer_id, dob)
select customer_id, first_name, last_name, dob
from customer;

Demo menggunakan versi potongan tabel Anda dan satu baris dummy:

create table customer (
  customer_id number(38),
  first_name varchar2(20),
  last_name varchar2(20),
  dob date
);

insert into customer (customer_id, first_name, last_name, dob)
values (42, 'Alex', 'Poole', date '1972-01-01');

Dan cluster dengan dua tabel (meskipun cluster tidak terlalu relevan):

create cluster customer_cluster (customer_id number(38));

create index customer_cluster_idx on cluster customer_cluster;

create table customer_name (
  customer_id number(38),
  first_name varchar2(20),
  last_name varchar2(20)
)
cluster customer_cluster (customer_id);

create table customer_dob (
  customer_id number(38),
  dob date
)
cluster customer_cluster (customer_id);

Maka Anda dapat melakukan:

insert all
into customer_name (customer_id, first_name, last_name)
            values (customer_id, first_name, last_name)
into customer_dob (customer_id, dob)
           values (customer_id, dob)
select customer_id, first_name, last_name, dob
from customer;

2 rows inserted.

select * from customer_name;

CUSTOMER_ID FIRST_NAME           LAST_NAME           
----------- -------------------- --------------------
         42 Alex                 Poole               

select * from customer_dob;

CUSTOMER_ID DOB       
----------- ----------
         42 1972-01-01
1
Alex Poole 1 Juli 2020, 14:35