PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Smallint atau karakter mana yang lebih efisien (10)?

Saya akan mengatakan bahwa menambahkan smallint buatan kunci utama akan lebih murah dalam hal ruang penyimpanan, jika tabel dirancang dengan cermat.

Sebuah smallint membutuhkan 2 byte, sedangkan character(10) (yaitu, berlawanan dengan intuisi, sebuah varlena ) yang berisi karakter ASCII, akan menghabiskan 14 byte.

Dalam tabel, 2 byte tambahan akan sia-sia, tetapi jangan lupa bahwa Anda akan memiliki indeks pada kolom kunci utama. Jadi nilai yang diindeks sebenarnya akan disimpan dua kali:sekali di tabel, sekali di indeks.

Demi kesederhanaan, mari kita abaikan header tuple dan overhead lainnya.

  • Menggunakan ISBN sebagai kunci utama akan dikenakan biaya tambahan 14 byte per baris tabel.

  • Menambahkan smallint kunci utama akan menambahkan dua byte ke tabel dan dua ke indeks, sehingga total empat byte yang ditambahkan.

Jadi menambahkan smallint kunci utama harus menghemat ruang .

Anda tidak boleh mengabaikan masalah penyelarasan. Semua tipe data disimpan di alamat memori yang merupakan kelipatan dari dua kekuatan tertentu. Ini diperlukan oleh arsitektur prosesor. Sebuah smallint biasanya memiliki keselarasan 2, character memiliki keselarasan 1, sedangkan misalnya timestamp memiliki keselarasan 8.

Jadi jika tabel Anda didefinisikan sebagai

CREATE TABLE book (
   id smallint PRIMARY KEY,
   issue_time timestamp with time zone,
   isbn character(10)
);

Maka tabel data akan terlihat seperti ini:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |X|X|X|X|X|X| | | | | | | | | ... (ISBN omitted)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 id    padding     issue_time

Baris disejajarkan pada batas 8 byte, dan enam byte dari akhir jika id ke awal issue_time akan menjadi “byte padding” kosong.

Jadi untuk memaksimalkannya, Anda harus mempertimbangkan urutan pendefinisian kolom.

Mengapa semua ini tidak terlalu relevan dalam kenyataan:

Tabel dengan 5.000 atau 10.000 entri kecil, apa pun yang terjadi.

Meskipun dihabiskan untuk mengoptimalkan ruang di sini adalah pengoptimalan mikro yang tidak perlu.

Tapi apa yang mungkin menjadi ide cerdas di meja perencanaan dapat dengan mudah menjadi bumerang nanti:Jika – berbeda dari yang Anda harapkan – Anda ingin menyimpan 70.000 buku di meja, Anda akan menemukan bahwa smallint tidak akan cukup, bahkan jika Anda mengizinkan id negatif s. Rasa sakit yang harus Anda tanggung ketika Anda harus mengubah tipe data dari kunci utama dan semua kunci asing yang mereferensikannya dalam sistem langsung akan jauh lebih besar daripada kesenangan yang Anda dapatkan dari menghemat sekitar 100 KB dengan pengoptimalan yang cerdas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Manakah opsi akses data terbaik yang tersedia untuk kerangka Play dengan Scala dan PostgreSQL?

  2. Cara menjalankan beberapa gabungan dengan params berbeda dalam satu kueri

  3. Bagaimana cara menentukan hari terakhir bulan sebelumnya menggunakan PostgreSQL?

  4. Urutan yang baru ditetapkan tidak berfungsi

  5. cari duplikat lintas bidang di postgresql