Bagaimana cara membuat tampilan terwujud di SQL Server?

101

Saya akan mendesain DW dan saya mendengar tentang tampilan terwujud. Sebenarnya saya ingin membuat tampilan dan itu harus diperbarui secara otomatis ketika tabel dasar diubah. Adakah yang bisa menjelaskan dengan contoh kueri ..

Deepak
sumber

Jawaban:

144

Mereka disebut tampilan terindeks di SQL Server - baca kertas putih berikut untuk latar belakang selengkapnya:

Pada dasarnya, yang perlu Anda lakukan adalah:

  • buat tampilan biasa
  • membuat indeks berkerumun pada tampilan itu

dan selesai!

Bagian yang rumit adalah: tampilan harus memenuhi sejumlah kendala dan batasan - yang diuraikan di kertas putih. Jika Anda melakukan ini - hanya itu yang ada. Tampilan diperbarui secara otomatis, tidak perlu perawatan.

Sumber daya tambahan:

marc_s
sumber
Terima kasih untuk balasan Anda. Saya mendapatkan apa yang saya inginkan .. Saya ingin tahu tentang indeks juga. Saya ingin tahu apakah ada cara untuk menghasilkan diagram skema bintang di SQL server ketika saya sudah menyiapkan semua struktur tabel? Jika ya, bagaimana cara membuat tabel fakta untuk itu?
Deepak
3
Pembatasan dalam menempatkan indeks berkerumun pada tampilan sangat luas. Misalnya, tampilan tidak bisa mereferensikan tampilan lain dan tidak bisa berisi gabungan luar. Jadi, banyak tampilan yang membutuhkan performa lebih baik tidak dapat menggunakan metode ini. Masih jawaban yang bagus.
Jeff Wilson
1
Seperti disebutkan dalam pertanyaan terkait, artikel blog MSDN, blogs.msdn.microsoft.com/ssma/2011/06/20/… , menyoroti beberapa perbedaan utama antara tampilan terwujud dan tampilan terindeks. IMHO yang paling bermasalah adalah tidak dapat menentukan pemicu penyegaran: tampilan yang diindeks diperbarui setiap kali tabel dasar diperbarui - merusak sebagian besar manfaat kinerja dari penggunaan tampilan yang terwujud. Larangan pada gabungan, agregat, fungsi windowing, dan subkueri membuat tampilan yang diindeks hampir tidak ada gunanya kecuali data tidak sering berubah.
Suncat2000
43

Meskipun murni dari perspektif teknik, tampilan yang diindeks terdengar seperti sesuatu yang dapat digunakan semua orang untuk meningkatkan kinerja, tetapi skenario kehidupan nyata sangat berbeda. Saya tidak berhasil menggunakan tampilan terindeks di mana saya paling membutuhkannya karena terlalu banyak batasan tentang apa yang dapat diindeks dan apa yang tidak.

Jika Anda memiliki gabungan luar dalam tampilan, mereka tidak dapat digunakan. Juga, ekspresi tabel umum tidak diperbolehkan ... Bahkan jika Anda memiliki pengurutan dalam subselect atau tabel turunan (seperti dengan partisi dengan klausa), Anda juga kurang beruntung.

Itu hanya menyisakan skenario yang sangat sederhana untuk memanfaatkan tampilan yang diindeks, sesuatu yang menurut saya dapat dioptimalkan dengan membuat indeks yang tepat pada tabel yang mendasarinya.

Saya akan sangat senang mendengar beberapa skenario kehidupan nyata di mana orang benar-benar menggunakan tampilan terindeks untuk keuntungan mereka dan tidak dapat melakukannya tanpa mereka

Rajiv
sumber
Sebenarnya saya telah menggunakan Tampilan Terindeks (hanya sekali) untuk mempartisi indeks Pencarian Teks Lengkap. Indeks FTS memang tidak dapat dipartisi, tetapi indeks terpisah dapat dibuat pada beberapa tampilan dari tabel yang sama. Tapi itu semacam pilihan terakhir.
areyesram
4
Anda harus ingat untuk menambahkan (NOEXPAND)petunjuk ke kueri yang menggunakan tampilan terindeks. Dan kemudian Anda melihat perbedaannya. Keuntungan menggunakan tampilan yang diindeks vs "mengindeks tabel dengan benar" adalah dalam membatasi pilihan rekaman, jika tidak, Anda benar, itu akan sama.
ajeh
Ya, hal NOEXPAND tidak bisa diremehkan!
Simon_Weaver
18

Anda mungkin perlu lebih banyak latar belakang tentang apa sebenarnya Materialized View itu. Di Oracle, ini adalah objek yang terdiri dari sejumlah elemen saat Anda mencoba membangunnya di tempat lain.

MVIEW pada dasarnya adalah cuplikan data dari sumber lain. Tidak seperti tampilan, data tidak ditemukan saat Anda membuat kueri, tampilan itu disimpan secara lokal dalam bentuk tabel. MVIEW disegarkan menggunakan prosedur latar belakang yang dimulai secara berkala atau ketika data sumber berubah. Oracle memungkinkan penyegaran penuh atau sebagian.

Di SQL Server, saya akan menggunakan yang berikut ini untuk membuat MVIEW dasar untuk (menyelesaikan) refresh secara teratur.

Pertama, pemandangan. Ini semestinya mudah bagi kebanyakan orang karena tampilan cukup umum dalam database apa pun. Berikutnya, tabel. Ini harus identik dengan tampilan di kolom dan data. Ini akan menyimpan snapshot dari data tampilan. Kemudian, prosedur yang memotong tabel, dan memuatnya kembali berdasarkan data saat ini dalam tampilan. Akhirnya, pekerjaan yang memicu prosedur untuk memulainya berhasil.

Yang lainnya adalah eksperimen.

Jason A.
sumber
5
Komentar Anda tentang SQL Server salah - tampilan yang terwujud adalah hal yang sangat berbeda di Oracle dan SQL Server. Di SQL Server, tampilan dengan indeks berkerumun unik di atasnya (alias "tampilan terwujud") tidak dan tidak dapat diperbarui oleh pengguna, juga tidak disimpan dalam tabel terpisah yang dibuat pengguna - itu selalu diperbarui oleh mesin selama pembaruan, dan tidak pernah keluar dari sinkronisasi. Tidak perlu ada pekerjaan untuk menyimpan snapshot dari data.
ErikE
10
Apa yang diminta OP dengan mudah disediakan oleh tampilan yang diindeks. Itulah hal terdekat yang disediakan SQL Server secara native ke tampilan terwujud Oracle. Namun jika Anda ingin / perlu mereplikasi cara kerja Oracle MVIEW, Jason benar. Pendekatan Jason juga membantu dalam skenario yang sama yang dapat dilakukan Oracle MVIEWs - misalnya melakukan refresh tabel pelaporan di luar jam kerja di mana Anda lebih peduli tentang pemuatan database daripada cara memperbarui tampilan (misalnya, melaporkan hanya pada angka kemarin ...)
4

Jika tampilan yang diindeks bukan merupakan opsi, dan pembaruan cepat tidak diperlukan, Anda dapat membuat tabel cache retas:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

lalu sp_rename view / table atau ubah kueri atau tampilan lain yang mereferensikannya untuk mengarah ke tabel cache.

jadwalkan harian / malam / mingguan / yang tidak menyegarkan seperti

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

NB: ini akan memakan ruang, juga di log tx Anda. Paling baik digunakan untuk kumpulan data kecil yang lambat untuk dihitung. Mungkin refactor untuk menghilangkan kolom "mudah tapi besar" terlebih dahulu ke tampilan luar.

Stox
sumber
1

Untuk MS T-SQL Server, saya sarankan untuk membuat indeks dengan pernyataan "include". Keunikan tidak diperlukan, begitu pula pengurutan fisik data yang terkait dengan indeks berkerumun. "Index ... Include ()" membuat penyimpanan data fisik terpisah yang secara otomatis dikelola oleh sistem. Ini secara konseptual sangat mirip dengan Oracle Materialized View.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

Scott Nightlinger
sumber