Kutipan ini bukan tentang menggunakan XML sebagai format penyimpanan secara umum (yang baik-baik saja, tergantung pada persyaratan), tetapi untuk penyimpanan tipe- database .
Ketika orang berbicara tentang database, mereka biasanya berarti sistem penyimpanan yang menyimpan data dalam jumlah besar , seringkali dalam kisaran gigabyte atau terabyte. Database berpotensi jauh lebih besar daripada jumlah RAM yang tersedia di server yang menyimpannya. Karena tidak ada yang pernah membutuhkan semua data dalam database sekaligus, database harus dioptimalkan untuk pengambilan cepat dari subset selektif data mereka: ini adalah tujuan SELECT
pernyataan itu, dan database relasional serta solusi NoSQL mengoptimalkan format penyimpanan internal mereka dengan cepat pengambilan subset tersebut.
XML, bagaimanapun, tidak benar-benar cocok dengan persyaratan ini. Karena struktur tag bersarang, tidak mungkin untuk menentukan di mana dalam file nilai tertentu disimpan (dalam hal byte diimbangi ke dalam file) tanpa berjalan di seluruh pohon dokumen, setidaknya hingga kecocokan. Database relasional memiliki indeks, dan mencari nilai dalam indeks, bahkan dengan implementasi pencarian biner primitif, adalah pencarian O (log n) tunggal, dan kemudian mendapatkan nilai aktual hanyalah pencarian file (misalnya pencarian file (misalnya pencarian file) fseek(data_file_handle, row_index * row_size)
), yaitu O (1). Dalam file XML, cara yang paling efisien adalah menjalankan parser SAX di atas dokumen Anda, melakukan banyak sekali pembacaan dan pencarian sebelum Anda mendapatkan data aktual Anda; Anda hampir tidak bisa mendapatkan ini lebih baik daripada O (n), kecuali jika Anda menggunakan indeks, tetapi kemudian, Anda harus membangun kembali seluruh indeks untuk setiap penyisipan (lihat di bawah).
Memasukkan lebih buruk. Database relasional tidak menjamin urutan baris, yang berarti mereka hanya dapat menambahkan baris baru, atau menimpa baris yang ditandai sebagai 'dihapus'. Ini sangat cepat: DB bisa menyimpan kumpulan lokasi yang dapat ditulisi; mendapatkan entri dari kolam adalah O (1) kecuali kolam itu kosong; kasus terburuk, kumpulan ini kosong dan halaman baru harus dibuat, tetapi ini juga O (1). Sebaliknya, database berbasis XML harus memindahkan semuanya setelah titik penyisipan untuk memberi ruang; ini O (n). Ketika indeks berperan, hal-hal menjadi lebih menarik: indeks basis data relasional yang khas dapat diperbarui dengan kompleksitas yang relatif rendah, misalnya O (log n); tetapi jika Anda ingin mengindeks file XML Anda, setiap penyisipan berpotensi mengubah lokasi pada-disk dari setiap nilai dalam dokumen, jadi Anda harusbangun kembali seluruh indeks . Ini juga berlaku untuk pembaruan, karena memperbarui, katakanlah, konten teks elemen, dapat mengubah ukurannya, yang berarti XML berturut-turut harus bergeser. Database relasional tidak harus menyentuh indeks sama sekali jika Anda memperbarui kolom yang tidak diindeks; database XML harus membangun kembali seluruh indeks untuk setiap pembaruan yang mengubah ukuran simpul XML yang diperbarui.
Itu adalah kerugian paling penting, tetapi ada lebih banyak. XML sangat verbose, yang bagus untuk komunikasi server-ke-server, karena menambah keamanan (server penerima dapat melakukan segala macam pemeriksaan integritas pada XML, dan jika ada yang salah dalam transfer, dokumen tidak mungkin divalidasi ). Namun, untuk penyimpanan massal, ini mematikan: tidak jarang memiliki 100% atau lebih overhead untuk data XML (tidak jarang untuk melihat rasio overhead dalam kisaran 1000% untuk hal-hal seperti pesan SOAP), sementara penyimpanan DB relasional yang khas skema hanya memiliki overhead konstan untuk metadata tabel, ditambah sedikit per baris; sebagian besar overhead dalam database relasional berasal dari lebar kolom tetap. Jika Anda memiliki data terabyte, overhead 500% benar-benar tidak dapat diterima, karena berbagai alasan.