Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menggunakan Indeks Virtual di Oracle Database

Apa itu  Indeks Virtual di Oracle ?

  • Indeks virtual adalah indeks “palsu” yang definisinya ada dalam kamus data, tetapi tidak memiliki segmen indeks terkait.
  • Sering kali penasihat penyetelan sql merekomendasikan Anda membuat indeks baru dan Anda ingin menguji indeks baru. Dalam hal ini Diperlukan waktu yang cukup lama untuk menambahkan indeks ke tabel besar dan itu akan menghabiskan ruang disk yang besar juga jika tabelnya besar. Juga indeks tambahan tersedia untuk digunakan oleh sesi lain, yang dapat mempengaruhi kinerja bagian lain aplikasi Anda yang saat ini tidak Anda uji. Ini bisa menjadi masalah khusus ketika Anda mencoba mengidentifikasi masalah pada sistem produksi. Indeks virtual memecahkan masalah ini
  • Tujuan dari indeks virtual adalah untuk mensimulasikan keberadaan indeks – tanpa benar-benar membangun indeks penuh
  • Ini memungkinkan pengembang untuk menjalankan rencana penjelasan seolah-olah indeks ada tanpa menunggu pembuatan indeks selesai dan tanpa menggunakan ruang disk tambahan.
  • Kami dapat menganalisis indeks virtual.
  • Anda tidak dapat membangun kembali indeks virtual; itu melempar ORA-8114:“Pengguna berusaha mengubah indeks palsu”
  • Anda dapat menghapus indeks seperti indeks biasa.
SQL> drop index <index_name>;

Poin penting untuk Diingat

(1) Kita perlu menyetel “_USE_NOSEGMENT_INDEXES” ke true pada tingkat sesi untuk menggunakan fitur ini
(2) Indeks virtual dibuat dengan penambahan bagian tanpa segmen di akhir skrip pembuatan indeks

Contoh untuk mendemonstrasikan penggunaan Indeks Virtual di Oracle

(1) Buat tabel sampel, misalnya virtual_test_t

SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;

(2) Pilih nilai apa saja dari tabel

SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';

(3) Periksa oracle Explain plan untuk kueri SELECT.

SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

(4) Buat indeks virtual pada tabel yang dibuat.

SQL> create index test_index_v on virtual_test_t(object_name) nosegment;

Ingat, untuk membuat indeks virtual, Anda perlu menentukan klausa NOSEGMENT dalam pernyataan CREATE INDEX.
Perhatikan juga dengan mengeksekusi pernyataan di atas, segmen indeks tidak dibuat.

(5) Anda dapat memeriksa hal yang sama dengan yang berikut ini:

SQL> set autotrace off
SQL> select index_name from dba_indexes where table_name = 'VIRTUAL_TEST_T' and index_name = 'TEST_INDEX_V';

no rows selected

SQL> col OBJECT_NAME format a20;
SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX_V';

Jadi, Objek ada di database, tetapi kami tidak memiliki segmen yang sama.

(6) Sekarang jalankan yang sama untuk memeriksa apakah indeks sedang digunakan.

SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

Kami dapat dengan jelas mengamati bahwa indeks tidak digunakan.

(7) Untuk memanfaatkan indeks virtual yang dibuat, kita perlu menyetel parameter _USE_NOSEGMENT_INDEXES ke true.

SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.

(8) Sekarang, jalankan pernyataan SELECT yang sama.

SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| VIRTUAL_TEST_T | 8 | 1416 | 5 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TEST_INDEX_V | 216 | | 1 (0)| 00:00:01 |

Setelah Anda menyetel parameter tersembunyi ini, pengoptimal oracle akan mulai menggunakan indeks virtual yang Anda buat di tabel ini.
Jika Anda menjalankan kueri ini dari sesi lain, itu tidak akan menggunakan indeks virtual ini (seperti yang telah kami gunakan "alter pernyataan sesi”).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi yang setara untuk DATEADD() di Oracle

  2. Kisah Dua Faktor Pengelompokan

  3. ORA-01652:tidak dapat memperpanjang segmen temp sebesar 128 di tablespace SISTEM:Bagaimana cara memperpanjang?

  4. Menyebarkan Pusat Data Cloudera CDP di Oracle Cloud Infrastructure (OCI)

  5. ORA-00932:tipe data tidak konsisten:diharapkan - mendapat CLOB