
Foto oleh panumas nikhomkhai via Pexels
VIEW adalah objek database yang menyimpan definisi query SELECT secara permanen dengan nama tertentu, sehingga bisa dipanggil berulang kali seperti memanggil tabel biasa tanpa perlu menulis ulang query yang sama berkali-kali di berbagai tempat.
Berbeda dengan tabel fisik, VIEW tidak menyimpan data secara langsung (kecuali indexed view); setiap kali VIEW dipanggil, SQL Server akan menjalankan ulang query SELECT yang menjadi definisinya terhadap data terbaru pada tabel sumber. Ini membuat VIEW selalu menampilkan data terkini tanpa risiko data basi.
Artikel ini membahas cara membuat VIEW, mengubahnya, serta pertimbangan penting seperti keterbatasan VIEW untuk operasi tulis dan dampaknya terhadap performa jika dipakai sembarangan dalam query yang sudah kompleks.
Membuat VIEW Dasar dengan CREATE VIEW
CREATE VIEW menyimpan definisi query secara permanen
Mengubah Definisi VIEW dengan ALTER VIEW
ALTER VIEW mengubah definisi tanpa menghapus objeknya
Keterbatasan VIEW untuk Operasi INSERT dan UPDATE
Updatable view terbatas pada struktur tertentu
Indexed View untuk Mempercepat Query Berat
Indexed view menyimpan data secara fisik lewat clustered index
Indexed View dan Batasannya di SQL Server
Membuat indexed view dengan SCHEMABINDING dan clustered index
Secara default, view di SQL Server hanyalah query tersimpan yang dijalankan ulang setiap kali dipanggil, sehingga tidak memberi keuntungan performa dibanding menulis query yang sama secara langsung. Indexed view mengubah perilaku ini dengan menyimpan hasil query secara fisik di disk melalui pembuatan unique clustered index pada view tersebut, mirip seperti materialized view pada database lain.
Untuk bisa diberi clustered index, view harus dibuat dengan opsi WITH SCHEMABINDING yang mengunci struktur tabel dasar agar tidak bisa diubah tanpa menghapus dependensi terlebih dahulu, dan query di dalamnya memiliki banyak batasan, misalnya tidak boleh memakai SELECT *, harus memakai COUNT_BIG bukan COUNT, tidak boleh memakai subquery, dan semua kolom yang direferensikan harus menyebutkan nama tabel secara eksplisit.
Keuntungan utama indexed view adalah query yang mengagregasi tabel besar bisa menjadi jauh lebih cepat karena SQL Server cukup membaca hasil yang sudah terangkum, namun konsekuensinya setiap operasi INSERT UPDATE atau DELETE pada tabel dasar akan memicu pembaruan index view secara otomatis, sehingga beban tulis pada tabel sumber akan sedikit meningkat dan harus dipertimbangkan pada sistem dengan volume transaksi tulis yang tinggi.
WITH SCHEMABINDING dan WITH CHECK OPTION pada View
SCHEMABINDING mengunci skema, CHECK OPTION menjaga konsistensi hasil DML
WITH SCHEMABINDING mengikat definisi view secara ketat pada struktur tabel dasarnya, sehingga tabel yang direferensikan tidak dapat diubah strukturnya, misalnya menghapus atau mengganti tipe kolom yang dipakai view, selama view tersebut masih ada. Selain menjadi syarat wajib untuk indexed view, SCHEMABINDING juga berguna sebagai pengaman agar perubahan skema tabel tidak secara tidak sengaja merusak view yang bergantung padanya di aplikasi lain.
WITH CHECK OPTION berfungsi pada view yang bisa menerima operasi DML (updatable view), memastikan bahwa setiap INSERT atau UPDATE yang dilakukan melalui view tersebut menghasilkan baris yang tetap memenuhi kondisi WHERE pada definisi view. Tanpa CHECK OPTION, sangat mungkin terjadi baris yang baru disisipkan atau diubah melalui view langsung menghilang dari hasil SELECT berikutnya pada view yang sama karena tidak lagi memenuhi filter.
Kedua opsi ini menyasar masalah berbeda: SCHEMABINDING melindungi integritas struktural view dari perubahan skema tabel dasar, sedangkan CHECK OPTION melindungi integritas logis data yang dimasukkan melalui view agar tetap konsisten dengan tujuan filter view itu sendiri, dan keduanya sering dipakai bersamaan pada view yang menjadi lapisan akses utama bagi aplikasi eksternal terhadap subset data tertentu. Tanpa CHECK OPTION, developer yang memakai view untuk pembaruan data sering kali tidak menyadari bahwa baris yang baru saja mereka ubah sudah tidak lagi tampak pada hasil SELECT berikutnya.
View dengan UNION ALL sebagai Lapisan Abstraksi Tabel Terpisah
View UNION ALL menyembunyikan pemisahan tabel fisik dari sisi aplikasi
View yang menggabungkan beberapa tabel melalui UNION ALL berguna sebagai lapisan abstraksi ketika data secara fisik disimpan terpisah, misalnya per tahun atau per cabang, namun aplikasi maupun laporan ingin memperlakukannya sebagai satu sumber data tunggal tanpa perlu tahu detail pemisahan tersebut.
UNION ALL dipilih dibanding UNION karena tidak melakukan pengecekan dan penghapusan baris duplikat, sehingga performanya lebih baik ketika memang tidak ada kemungkinan baris identik muncul di kedua sumber. Pendekatan ini juga memudahkan migrasi data, karena tabel fisik baru bisa ditambahkan ke definisi view kapan pun tanpa mengubah query aplikasi yang sudah ada. Satu konsekuensi yang perlu diperhatikan adalah seluruh kolom pada tiap bagian UNION ALL harus memiliki jumlah dan tipe data yang kompatibel, sehingga penyesuaian tipe sering diperlukan ketika tabel sumber memiliki struktur yang sedikit berbeda.
Kesalahan Umum yang Sering Terjadi
Membuat VIEW Berlapis Terlalu Dalam
VIEW yang memanggil VIEW lain yang memanggil VIEW lain lagi akan membuat query optimizer kesulitan menghasilkan execution plan yang efisien, dan menyulitkan developer melacak dari mana sebenarnya data tertentu berasal.
Mengira VIEW Selalu Mempercepat Query
VIEW biasa (non-indexed) hanya menyimpan definisi query, bukan hasilnya, sehingga query yang berat tetap berat setiap kali VIEW tersebut dipanggil — ia tidak otomatis menjadi cache.
Lupa SCHEMABINDING Membuat Tabel Sumber Tidak Bisa Diubah Sembarangan
VIEW dengan WITH SCHEMABINDING mencegah perubahan struktur tabel sumber (seperti DROP COLUMN) selama VIEW tersebut masih ada, yang bisa membuat developer bingung saat ALTER TABLE tiba-tiba gagal.
Kapan Pendekatan Ini Tidak Cocok Dipakai
VIEW biasa cocok untuk menyederhanakan query kompleks yang sering dipakai ulang dan menyembunyikan detail JOIN dari pengguna akhir, namun tidak memberikan manfaat performa karena query di baliknya tetap dieksekusi penuh setiap saat.
Indexed view memberikan manfaat performa nyata untuk query agregat yang sering diakses dengan data yang jarang berubah, namun menambah overhead saat INSERT/UPDATE/DELETE pada tabel sumber karena indexnya harus ikut diperbarui, sehingga kurang cocok untuk tabel dengan frekuensi tulis yang sangat tinggi.
Ringkasan
VIEW memberikan lapisan abstraksi yang berguna untuk menyederhanakan query kompleks dan menyembunyikan detail implementasi dari pengguna, namun perlu diingat bahwa VIEW biasa tidak menyimpan data secara fisik dan tidak otomatis mempercepat query. Gunakan indexed view hanya ketika benar-benar dibutuhkan performa ekstra pada query agregat yang datanya relatif stabil.
Seri Belajar SQL Server:
← Sebelumnya: Window Function ROW_NUMBER RANK dan PARTITION BY
→ Selanjutnya: Stored Procedure Dasar di SQL Server (segera terbit)