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

Oracle 12c - apakah indeks pada kolom 'angka' berkinerja lebih cepat daripada indeks pada kolom 'varchar'?

[TL;DR] Gunakan tanggal untuk menyimpan tanggal, angka untuk menyimpan angka, dan string untuk menyimpan string.

Oracle menyimpan NUMBER tipe data sebagai 1 byte per 2 digit.

Oracle menyimpan CHAR tipe data sebagai 1 byte per karakter ASCII (UTF-8 dan penyandian lainnya mungkin memerlukan lebih banyak untuk karakter dalam kumpulan yang diperluas) dan akan melapisi string dengan karakter spasi sehingga semua string memiliki panjang yang persis sama.

Oracle menyimpan VARCHAR2 tipe data sebagai 1 byte per karakter ASCII ditambah overhead kecil (1 atau 2 byte) untuk panjang string.

Oracle menyimpan DATE tipe data sebagai 7 byte (2 untuk tahun dan 1 untuk setiap bulan, hari, jam, menit, detik).

Berdasarkan pertanyaan Anda sebelumnya Anda tampaknya menyimpan year dan quarter dan dengan asumsi bahwa Anda akan selalu memiliki 4 digit tahun dan 1 digit kuartal maka:

  • NUMBER(5,0) akan memakan waktu 3 byte;
  • CHAR(5 CHARACTER) akan memakan waktu 5 byte;
  • VARCHAR2(5 CHARACTER) akan memakan waktu 6 byte; dan
  • DATE akan memakan waktu 7 byte.

Jadi hanya mempertimbangkan memori sebagai NUMBER(5,0) akan menjadi yang paling efisien.

Namun

Segera setelah Anda mulai melakukan aritmatika pada tahun/kuartal yang disimpan sebagai angka/string, Anda akan mengalami masalah kinerja:

Misalnya, mendapatkan kuartal berikutnya :

  • Jika quarter adalah NUMBER tipe data maka Anda dapat menggunakan:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END tetapi ini tidak menangani saat Anda ingin menambahkan 5 perempat atau mulai mengurangi seperempat dan kemudian logikanya mulai menjadi jauh lebih rumit.
  • Jika quarter adalah CHAR tipe data maka Anda dapat mengonversinya menjadi angka atau tanggal dan menggunakan salah satu metode tersebut (manipulasi string tidak mungkin berhasil).
  • Jika quarter adalah DATE maka Anda hanya perlu menggunakan ADD_MONTHS( quarter, 3 ) .

Tanggal DATE metode didokumentasikan sendiri dan sudah ada sedangkan NUMBER metode hanya akan menjadi fungsi khusus untuk perkiraan Anda dari QUARTER tipe data dan setelah Anda menerapkan semua fungsi perbandingan dan manipulasi yang Anda butuhkan, Anda akan secara efektif menulis ulang DATE tipe data sebagai UDT untuk kuartal dan fungsi-fungsi tersebut akan memiliki kinerja yang lebih rendah daripada fungsi tanggal yang dioptimalkan.

Jangan gunakan tipe data yang tidak sesuai - simpan saja tanggal sebagai tanggal; angka sebagai angka; dan string sebagai string.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekstrak bagian waktu dari kolom TimeStamp di ORACLE

  2. ORA-24247:akses jaringan ditolak oleh daftar kontrol akses (ACL)

  3. Seberapa buruk mengabaikan pengecualian Oracle DUP_VAL_ON_INDEX?

  4. Oracle dynamic sql mengevaluasi ekspresi di mana klausa

  5. Mengonfigurasi Pendengar di Oracle Database (edisi 12c, 18c, dan 19c)