Ultra Cepat MV menggunakan Opsi Tabel Prebuilt - Funkysst.com

Friday, March 2, 2018

Ultra Cepat MV menggunakan Opsi Tabel Prebuilt

Avertisement
Avertisement
Ultra Cepat MV menggunakan Opsi Tabel Prebuilt

Inilah pertanyaan menarik yang diajukan kepada saya suatu saat dan saya telah menemukan solusinya. Setelah 9 tahun, saya mengalami pertanyaan yang sama dan terkejut saat mengetahui bahwa banyak orang masih belum tahu sedikit pun trik yang bisa menghindari masalah potensial nantinya.

Seseorang bertanya kepada saya bagaimana memodifikasi kolom dari Materialized View , misalnya dari varchar2 (20) ke varchar2 (25), atau yang serupa. Jatuhkan dan buat ulang? Bukan pilihan. Kita berbicara tentang beberapa ratus GB MV dengan permintaan yang sangat kompleks yang akan memakan waktu berhari-hari untuk menyelesaikannya.

Masalah
Bila Anda mengubah tampilan terwujud untuk menambahkan kolom atau memodifikasi definisi kolom, sayangnya tidak ada perintah yang secara fungsional setara dengan ALTER MATERIALIZED VIEW ... ADD COLUMN. Satu-satunya cara untuk mengubah MV adalah benar-benar menjatuhkan dan menciptakannya kembali dengan perubahannya. Pendekatan itu bisa diterima oleh MV kecil; Tapi untuk MV yang lebih besar biaya pembangunan kembali bisa membuat prosesnya tidak layak. Selain waktu yang dibutuhkan untuk membangun kembali keseluruhan MV (yang bisa berhari-hari, tergantung ukurannya), redo / undo generation dan lonjakan logika I / O karena kueri MV dapat mempengaruhi kinerja mesin secara serius. sumber database Dalam beberapa kasus, MV besar bahkan mungkin gagal dibangun kembali karena terkadang segmen undo mungkin tidak memiliki informasi undo untuk kueri lama yang berjalan - menyebabkan kesalahan ORA-1555.

Jadi adakah pendekatan yang lebih baik? Ya ada. Dalam dokumen ini, saya akan menjelaskan pendekatan yang lebih baik untuk membuat MV yang memungkinkan perubahan tanpa membangun kembali MV - sebuah tugas yang dilakukan hanya dalam hitungan detik dan bertentangan dengan hari-hari potensial.

Konsep Segmen

Segmen disimpan unit di Oracle. Jadi, sebuah tabel memiliki segmen; bukan pandangan - karena isi tampilan tidak disimpan; hanya definisi tampilan saja. Sebuah Tampilan Terwujud, bagaimanapun, menyimpan isinya; jadi itu adalah segmen.

Sebenarnya, konsep segmen berjalan sedikit lebih jauh. Jika tabel dipartisi, maka setiap partisi adalah segmen yang berbeda. Jadi, hubungan antara tabel dan segmen adalah satu-ke-banyak.

Bila Anda membuat objek yang membutuhkan penyimpanan, seperti tabel, MV atau indeks, Oracle terlebih dahulu membuat segmen yang sesuai. Setelah itu selesai, segmen ini diselimuti oleh sampul objek. Segmen ini masih terus ada; tapi sekarang terhubung ke objek. Sampai segmen benar-benar diciptakan dan dihuni, objek secara teknis tidak ada. Segmen ini mungkin, dalam beberapa kasus, memiliki nama yang berbeda dari objek. Jika pembuatan segmen (atau populasi) gagal, Oracle secara otomatis membersihkan sisa-sisa segmen yang gagal; tapi kadang kala tidak mungkin, meninggalkan panti yang akhirnya dibersihkan oleh proses SMON.

MV dan Segmen

Lagi pula, bagaimana diskusi tentang segmen yang relevan dengan tujuan kita di sini - perubahan cepat MViews?

Banyak Ingat, MV tidak lain hanyalah meja di balik selimut? Properti-bijaksana, MV dan meja seperti saudara perempuan, bahkan bukan sepupu pun. Anda bisa memikirkan MV adalah tabel biasa dengan beberapa built in intelligence tentang bagaimana mereka diciptakan (query yang menentukan), seberapa sering mereka harus disegarkan secara otomatis oleh sebuah pekerjaan dan bagaimana query harus diubah untuk memanfaatkan kehadiran MV. Tapi selain itu, tidak banyak bedanya. Anda bisa langsung memasukkan ke MV, membuat indeks dan sebagainya. Sejauh menyangkut segmen, tidak ada perbedaan antara MV dan sebuah tabel. Sebenarnya Oracle menyimpan segmen sebagai tabel:

SQL pilih SEGMENT_TYPE
2 dari pengguna_segments
3 di mana SEGMENT_NAME = 'MV1';

SEGMENT_TYPE
------------------
TABEL

Namun, perbedaan terbesar adalah masalah yang sedang kita bahas - Anda tidak dapat menambahkan / memodifikasi kolom MV sementara Anda dapat melakukannya dengan bebas untuk sebuah tabel. Jika saya bisa mencoba secara logis merepresentasikan tabel dan MV, inilah tampilannya.



Segmennya sama. Jika dibuat sebagai MV, properti MV mengambil alih segmen tersebut. Jika dibuat sebagai meja, properti sebuah meja mengambil alih kendali.

Tabel Prebuilt

Karena di bawah selimut segmennya sama untuk MV dan meja, tidak bisakah Anda memanfaatkan kenyataan itu? Misalkan Anda punya meja dan sekarang Anda ingin mengubahnya menjadi MV. Dengan kata lain, Anda ingin mengulang panah yang awalnya menunjuk ke meja ke properti MV:




Bisakah kamu melakukannya? Ya, tentu saja kamu bisa. Karena pada tingkat segmen itu sama, Oracle memungkinkan Anda melakukannya. Saat membuat MV, Anda bisa menggunakan klausa khusus ON PREBUILT TABLE. Berikut adalah cara membuat MV dalam pendekatan reguler:

buat tampilan terwujud mv1
jangan pernah refresh sebagai
select cast (hitung (1) sebagai angka (10)) cnt dari t1;


Jika Anda memeriksa objek yang dibuat:

SQL pilih object_id, data_object_id, object_type
2 dari user_objects
3 dimana object_name = 'MV1';

OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
---------- -------------- -------------------
74842 74842 TABEL
74843 PANDANGAN MATERIALISASI

Jadi, itu menciptakan dua benda - sebuah meja dan sebuah MV - toh. Perhatikan perbedaan yang sangat penting meskipun: DATA_OBJECT_ID untuk objek MV adalah null. Jika Anda menjatuhkan MV dan memeriksa objeknya:

SQL drop terwujud melihat mv1;

Tampilan Materialized terjatuh.

SQL pilih object_id, data_object_id, object_type
2 dari user_objects
3 dimana object_name = 'MV1';

tidak ada baris yang dipilih

Meski ada dua benda - sebuah meja dan sebuah MV, saat Anda menjatuhkan MV, keduanya dijatuhkan. Objek meja tidak memiliki eksistensi yang independen. Menjatuhkan MV menurunkan meja secara otomatis.

Sekarang, dalam pendekatan yang dimodifikasi, Anda terlebih dahulu membuat tabel dengan nama yang sama dengan MV yang akan Anda buat:

SQL membuat tabel mv1 (nomor cnt (10));

Selanjutnya Anda membuat MV dengan menambahkan klausa baru yang disebut ON PREBUILT TABLE yang ditunjukkan di bawah ini:

buat tampilan terwujud mv1
pada tabel prebuilt
jangan pernah refresh
sebagai
select cast (hitung (1) sebagai angka (10)) cnt dari t1;

Sekarang akan ada dua objek juga - satu meja dan satu MV. MV hanya mengambil alih komando di atas segmen tapi sejak tabel sudah ada, itu tidak menciptakan objek tabel. Jadi masih ada 2 objek saja.

Satu kekhawatiran: karena Anda membuat tabel secara manual, bisakah Anda menjatuhkannya secara tidak sengaja ? Ayo lihat:

SQL drop table mv1;
drop table mv1
*
ERROR pada baris 1:
ORA-12083: harus menggunakan DROP MATERIALIZED VIEW untuk menjatuhkan "ARUP". "MV1"

Itu menjawabnya. Meja hanya kehilangan eksistensinya yang independen. Namun, lihat apa yang terjadi saat Anda menjatuhkan MV:

SQL DROP MATERIALIZED VIEW mv1;

Tampilan terwujud jatuh.

Sekarang periksa segmennya:

SQL pilih segment_type
2 dari user_segments
3 dimana segment_name = 'MV1';

SEGMENT_TYPE
------------------
TABEL

Segitiga ini masih ada! Saat Anda menjatuhkan MV, segmen tidak terjatuh; itu hanya kembali menjadi sebuah meja. Anda dapat mengonfirmasi bahwa dengan memeriksa tampilan objek:

OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
---------- -------------- -------------------
77432 77432 TABEL

Voila! Benda itu masih ada sebagai meja. Sebelumnya Anda melihat menjatuhkan MV melepas semua benda dan segmennya. Namun, dalam pendekatan ini segmen ini diawetkan. Karena itu kembali ke meja, Anda dapat melakukan semua hal yang mungkin dilakukan di tabel - pilih daripadanya, buat indeks, dan - yang terpenting - ubah kolomnya. Anda dapat mengubah kolom untuk membuat NUMBER (11).

SQL alter table mv1 modify (nomor cnt (11));

Tabel diubah.

Sekarang, buat MV lagi:

buat tampilan terwujud mv1
pada tabel prebuilt
jangan pernah refresh sebagai
select cast (hitung (1) sebagai angka (11)) cnt dari t1;

Itu dia. MV diubah. Seluruh proses memakan waktu sekitar beberapa detik, dan karena Anda tidak perlu menciptakan segmen ini, Anda menyimpan banyak muatan pada database. Berikut gambaran skematik dari apa yang terjadi.

Sekarang Anda tahu betapa kuatnya pilihan tabel prebuilt. Ini hanya mempengaruhi bagaimana Anda menentukan MV; tidak ada lagi. Semua properti MV lainnya tetap utuh. Pengguna akhir bahkan tidak tahu tentang pilihan tabel prebuilt; Tapi untuk DBA tetap menjadi alat yang ampuh di gudang senjata. Sebagai praktik terbaik yang saya sarankan untuk membuat MV, berapapun ukurannya, dengan klausa ON PREBUILT TABLE. Dalam tabel kecil Anda mungkin tidak melihat keuntungan yang sangat besar; Tapi bagaimana jika meja kecil hari ini tumbuh sampai hari esok yang besar? Lebih baik aman daripada menyesal.

Konversi ke Pendekatan Baru

Sekarang setelah Anda memahami kekuatan pilihan prebuilt, Anda mungkin bertanya-tanya bagaimana cara mengubah MV yang ada menjadi klausa baru. Sayangnya tidak ada jalur konversi. Anda harus menjatuhkan dan menciptakan MV. Itulah mengapa saat ini - saat kita memindahkan MV ke tablespace baru - kita memiliki kesempatan emas.

Salah satu pendekatannya adalah membuat tabel baru dengan nama baru dan kemudian mengganti namanya. Berikut adalah langkah-langkahnya:

1. Buat tabel dengan nologging clause dari MV lama
buat tabel new_mv1
nologging
sebagai
pilih * dari mv1;

2. Tangkap definisi MV dari kamus data:

pilih dbms_metadata.get_ddl ('MATERIALIZED_VIEW', 'MV1')
dari dual;

DBMS_METADATA.GET_DDL ('MATERIALIZED_VIEW', 'MV1')
-------------------------------------- ----------
CREATE MATERIALIZED VIEW "ARUP". "MV1" ("CNT")
ORGANISASI HEAP PCTFREE 10
... dan seterusnya ...

3. Spool ini ke file yang akan dieksekusi nanti.

4. Edit file ini untuk menempatkan ON PREBUILT TABLE CLAUSE.

CREATE MATERIALIZED VIEW "ARUP". "MV1" ("CNT")
ORGANISASI TERHADAP TABEL PRABUILT PCTFREE 10

5. Ambil Ekspor Pompa Data dengan DAFTAR ISI = pilihan METADATA_ONLY. Ini menciptakan semua hak yang relevan pada file dump ekspor. Jaga ke samping.

6. Jatuhkan MV View yang Terwujud.

7. Ganti nama tabel NEW_MV1 ke MV1

8. Jalankan script yang Anda buat sebelumnya untuk menciptakan MV.

9. Impor file dump ekspor. Ini akan menciptakan semua hak istimewa.

Ini lambat; tapi pendekatan terbaik karena menghasilkan jumlah minimal redo dan undo.

Semoga ini bisa membantu. Anda mungkin melihat artikel yang saya tulis http://www.dbazine.com/oracle/or-articles/nanda2 Artikel ini menjelaskan, dengan kode lengkap, bagaimana mengubah MV di mana penyegaran terjadi di seluruh basis data.


Avertisement
Comments


EmoticonEmoticon