Apakah tampilan lebih cepat daripada permintaan sederhana?


358

Adalah

select *  from myView

lebih cepat dari kueri itu sendiri untuk membuat tampilan (agar memiliki hasil yang sama):

select * from ([query to create same resultSet as myView])

?

Tidak sepenuhnya jelas bagi saya jika tampilan menggunakan semacam caching membuatnya lebih cepat dibandingkan dengan permintaan sederhana.


7
Saya tidak yakin tentang satu tampilan, tetapi tampilan bersarang adalah neraka kinerja total.
Muflix

Jawaban:


679

Ya , tampilan dapat memiliki indeks yang dikelompokkan ditugaskan dan, ketika mereka melakukannya, mereka akan menyimpan hasil sementara yang dapat mempercepat permintaan yang dihasilkan.

Pembaruan: Setidaknya tiga orang telah memilih saya untuk hal ini. Dengan segala hormat, saya pikir mereka salah; Dokumentasi Microsoft sendiri membuatnya sangat jelas bahwa Views dapat meningkatkan kinerja.

Pertama, pandangan sederhana diperluas sehingga tidak berkontribusi langsung pada peningkatan kinerja - itu memang benar. Namun, tampilan yang diindeks dapat secara dramatis meningkatkan kinerja.

Biarkan saya langsung pergi ke dokumentasi:

Setelah indeks berkerumun unik dibuat pada tampilan, set hasil tampilan segera terwujud dan bertahan dalam penyimpanan fisik dalam database, menghemat overhead melakukan operasi mahal ini pada waktu pelaksanaan.

Kedua, pandangan yang diindeks ini dapat bekerja bahkan ketika mereka tidak direferensikan secara langsung oleh permintaan lain karena pengoptimal akan menggunakannya sebagai pengganti referensi tabel bila perlu.

Lagi-lagi, dokumentasi:

Tampilan yang diindeks dapat digunakan dalam eksekusi permintaan dalam dua cara. Kueri dapat mereferensikan tampilan yang diindeks secara langsung, atau, yang lebih penting, optimizer kueri dapat memilih tampilan jika menentukan bahwa tampilan dapat diganti untuk beberapa atau semua permintaan dalam rencana kueri berbiaya terendah. Dalam kasus kedua, tampilan yang diindeks digunakan sebagai pengganti tabel yang mendasari dan indeks biasa mereka. Tampilan tidak perlu direferensikan dalam kueri agar pengoptimal kueri menggunakannya selama eksekusi kueri. Ini memungkinkan aplikasi yang ada mendapat manfaat dari tampilan indeks yang baru dibuat tanpa mengubah aplikasi tersebut.

Dokumentasi ini, serta bagan yang menunjukkan peningkatan kinerja, dapat ditemukan di sini .

Pembaruan 2: jawabannya telah dikritik atas dasar bahwa itu adalah "indeks" yang memberikan keuntungan kinerja, bukan "Lihat." Namun, ini mudah dibantah.

Katakanlah kita adalah perusahaan perangkat lunak di negara kecil; Saya akan menggunakan Lithuania sebagai contoh. Kami menjual perangkat lunak di seluruh dunia dan menyimpan catatan kami di database SQL Server. Kami sangat sukses dan, dalam beberapa tahun, kami memiliki 1.000.000 catatan. Namun, kami sering perlu melaporkan penjualan untuk keperluan pajak dan kami menemukan bahwa kami hanya menjual 100 salinan perangkat lunak kami di negara asal kami. Dengan membuat tampilan indeks hanya catatan Lithuania, kita bisa menyimpan catatan yang kita butuhkan dalam cache yang diindeks seperti yang dijelaskan dalam dokumentasi MS. Ketika kami menjalankan laporan kami untuk penjualan Lithuania pada tahun 2008, permintaan kami akan mencari melalui indeks dengan kedalaman hanya 7 (Log2 (100) dengan beberapa daun yang tidak digunakan). Jika kita melakukan hal yang sama tanpa LIHAT dan hanya mengandalkan indeks ke dalam tabel, kita harus melintasi pohon indeks dengan kedalaman pencarian 21!

Jelas, View itu sendiri akan memberi kita keunggulan kinerja (3x) dibandingkan dengan penggunaan sederhana indeks saja. Saya sudah mencoba menggunakan contoh dunia nyata tetapi Anda akan perhatikan bahwa daftar sederhana penjualan Lithuania akan memberi kita keuntungan yang lebih besar.

Perhatikan bahwa saya hanya menggunakan b-tree lurus sebagai contoh. Sementara saya cukup yakin bahwa SQL Server menggunakan beberapa varian dari b-tree, saya tidak tahu detailnya. Meskipun demikian, intinya tetap berlaku.

Pembaruan 3: Pertanyaan telah muncul tentang apakah Tampilan Indexed hanya menggunakan indeks yang ditempatkan di tabel yang mendasarinya. Artinya, untuk parafrase: "tampilan yang diindeks hanya setara dengan indeks standar dan tidak menawarkan sesuatu yang baru atau unik untuk tampilan." Jika ini benar, tentu saja, maka analisis di atas akan salah! Biarkan saya memberikan kutipan dari dokumentasi Microsoft yang menunjukkan mengapa saya pikir kritik ini tidak valid atau benar:

Menggunakan indeks untuk meningkatkan kinerja kueri bukanlah konsep baru; namun, tampilan yang diindeks memberikan manfaat kinerja tambahan yang tidak dapat dicapai menggunakan indeks standar.

Bersama dengan kutipan di atas mengenai persistensi data dalam penyimpanan fisik dan informasi lain dalam dokumentasi tentang bagaimana indeks dibuat pada Views, saya pikir lebih aman untuk mengatakan bahwa Tampilan Terindeks bukan hanya Pilih SQL yang di-cache yang kebetulan menggunakan indeks didefinisikan pada tabel utama. Jadi, saya terus mendukung jawaban ini.


29
Ya, tampilan yang diindeks dapat secara dramatis meningkatkan kinerja. Tetapi tampilan yang diindeks bukan hanya "tampilan", dan secara umum, "tampilan" normal tidak lebih cepat dari kueri terkait.
BradC

10
@ Charles - tidak masalah apakah itu indeks, fakta bahwa pandangan dapat memanfaatkan indeks dan permintaan mentah tidak cukup
annakata

194
/ Tepuk tangan @Mark untuk berdiri di tanah dan secara rasional berdebat satu ini
annakata

17
Oh, kawan, aku mendapat 8 downvotes yang satu ini! Saya kagum bahwa orang-orang akan turun begitu cepat tanpa setidaknya memiliki keberanian Charles untuk memperdebatkan pendapat mereka.
Mark Brittingham

8
Karena sebuah tabel hanya dapat memiliki satu indeks clusterdee, dan Anda BISA membuat indeks berkerumun terpisah pada tampilan, (karena bidang dalam indeks berkerumun secara tetap ada di halaman indeks), ini adalah cheat (work-arounnd?) Yang memungkinkan Anda untuk mendapatkan DUA indeks berkerumun di satu Tabel.
Charles Bretana

51

Secara umum, tidak. Tampilan terutama digunakan untuk kenyamanan dan keamanan, dan tidak akan (dengan sendirinya) menghasilkan keuntungan kecepatan apa pun.

Yang mengatakan, SQL Server 2000 dan di atas memang memiliki fitur yang disebut Indexed Views yang dapat sangat meningkatkan kinerja, dengan beberapa peringatan:

  1. Tidak setiap tampilan dapat dibuat menjadi tampilan yang diindeks; mereka harus mengikuti serangkaian tertentu pedoman , yang (di antara pembatasan lainnya) berarti Anda tidak dapat mencakup unsur-unsur permintaan umum seperti COUNT, MIN, MAX, atau TOP.
  2. Tampilan yang diindeks menggunakan ruang fisik dalam database, seperti halnya indeks pada sebuah tabel.

Artikel ini menjelaskan manfaat tambahan dan batasan tampilan indeks :

Kamu bisa…

  • Definisi tampilan dapat merujuk satu atau lebih tabel dalam database yang sama.
  • Setelah indeks berkerumun unik dibuat, indeks nonclustered tambahan dapat dibuat terhadap tampilan.
  • Anda dapat memperbarui data di tabel yang mendasarinya - termasuk menyisipkan, memperbarui, menghapus, dan bahkan memotong.

Kamu tidak bisa ...

  • Definisi tampilan tidak bisa mereferensikan tampilan lain, atau tabel di database lain.
  • Itu tidak dapat berisi COUNT, MIN, MAX, TOP, gabungan luar, atau beberapa kata kunci atau elemen lainnya.
  • Anda tidak dapat mengubah tabel dan kolom yang mendasarinya. Tampilan dibuat dengan opsi WITH SCHEMABINDING.
  • Anda tidak selalu dapat memprediksi apa yang akan dilakukan pengoptimal kueri. Jika Anda menggunakan Edisi Perusahaan, secara otomatis akan mempertimbangkan indeks berkerumun unik sebagai opsi untuk kueri - tetapi jika menemukan indeks "lebih baik", itu akan digunakan. Anda dapat memaksa pengoptimal untuk menggunakan indeks melalui petunjuk DENGAN NOEXPAND - tetapi berhati-hatilah saat menggunakan petunjuk apa pun.

3
benar-benar tidak setuju ... membaca dari tampilan memungkinkan SQL untuk ditulis ulang .. dan umumnya LEBIH CEPAT untuk membaca dari tampilan (daripada dari dump tampilan).
Aaron Kempf

@ AaronKempf, saya ingin melihat beberapa referensi tentang itu, itu belum pengalaman saya. Ketika saya mencari "view SQL rewritten", semua hasil yang saya dapatkan merujuk ke Oracle, bukan SQL server, misalnya docs.oracle.com/cd/E14072_01/server.112/e10810/qrbasic.htm
BradC

Saya baru saja melakukan benchmarking kemarin, saya terpana .. pada dasarnya jika saya mengambil dump dari tampilan (ke dalam tabel) permintaan apa pun yang saya jalankan adalah SLOWER .. karena sebagian besar kueri melewati tampilan seperti mentega dan ditulis ulang oleh pengoptimal permintaan .. Setidaknya itulah yang saya asumsikan. Saya akan mencoba untuk menulis entri blog di atasnya segera, pembandingan itu hal yang sangat menarik .. Pada dasarnya pandangan sangat membantu kinerja.
Aaron Kempf

@ AaronKempf Tidak yakin itu bahkan skenario yang sama dengan pertanyaan asli (yaitu tentang permintaan vs menempatkan permintaan yang identik dalam tampilan). Lagi pula, saya tidak bisa melihat bagaimana mematerialisasi tampilan menjadi sebuah tabel akan membuatnya MENURUN (itulah yang dilakukan oleh tampilan yang diindeks), kecuali tabel baru Anda tidak memiliki indeks yang baik.
BradC

1
Brad; Saya menulis posting blog yang sangat buruk tentang bagaimana pandangan menyelamatkan saya 99% dari kinerja saya dalam situasi ini .. Saya berencana untuk menulis beberapa artikel lain, tetapi saya tahu bahwa saya perlu menambahkan TON lebih detail dalam hal ini. Apakah Anda keberatan melihat ini dan memberi tahu saya apa yang Anda pikirkan tentang uraian saya? Saya tahu itu tidak masuk akal (sampai saya mendapatkan 2-3 artikel lainnya) .. tapi saya jatuh cinta dengan pandangan, dan saya telah lama! accessadp.com/2013/01/22/do-views-increase-performance
Aaron Kempf

14

Setidaknya dalam SQL Server, paket kueri disimpan dalam cache paket untuk tampilan dan kueri SQL biasa, berdasarkan parameter kueri / tampilan. Untuk keduanya, mereka dikeluarkan dari cache ketika mereka sudah tidak digunakan untuk jangka waktu yang cukup lama dan ruang yang dibutuhkan untuk beberapa permintaan yang baru diajukan. Setelah itu, jika kueri yang sama dikeluarkan, itu dikompilasi ulang dan rencananya dimasukkan kembali ke dalam cache. Jadi tidak, tidak ada perbedaan, mengingat Anda menggunakan kembali permintaan SQL yang sama dan tampilan yang sama dengan frekuensi yang sama.

Jelas, secara umum, pandangan, pada dasarnya (bahwa seseorang mengira itu akan cukup sering digunakan untuk membuatnya menjadi tampilan) umumnya lebih mungkin untuk "digunakan kembali" daripada pernyataan SQL sewenang-wenang.


14

EDIT: Saya salah, dan Anda akan melihat jawaban Marks di atas.

Saya tidak dapat berbicara dari pengalaman dengan SQL Server , tetapi untuk sebagian besar database jawabannya adalah tidak. Satu-satunya manfaat potensial yang Anda peroleh, berdasarkan kinerja, dari menggunakan tampilan adalah bahwa hal itu berpotensi membuat beberapa jalur akses berdasarkan kueri. Tetapi alasan utama untuk menggunakan tampilan adalah untuk menyederhanakan kueri atau untuk membakukan cara mengakses beberapa data dalam tabel. Secara umum, Anda tidak akan mendapatkan manfaat kinerja. Tapi saya mungkin salah.

Saya akan memberikan contoh yang cukup rumit dan waktu untuk melihat sendiri.


1
Alasan lain untuk pandangan adalah untuk membantu kontrol akses dalam model berbasis peran
annakata

1
Anda salah tentang peningkatan kinerja. Saya tidak menjelaskan cukup untuk meyakinkan beberapa orang di komentar asli saya tetapi MS memiliki dokumentasi eksplisit tentang cara menggunakan tampilan untuk meningkatkan kinerja. Lihat respons saya (sekarang sangat tidak disukai) di bawah ini.
Mark Brittingham

7

Mungkin lebih cepat jika Anda membuat tampilan terwujud ( dengan skema mengikat ). Tampilan yang tidak terwujud mengeksekusi seperti kueri biasa.


schemabinding tidak ada hubungannya dengan kinerja, ia mengikat skema tampilan ke tabel yang mendasarinya sehingga tetap sinkron dan merupakan pra-req untuk tampilan yang diindeks.
Sam Saffron

5

Pemahaman saya adalah bahwa beberapa waktu yang lalu, tampilan akan lebih cepat karena SQL Server dapat menyimpan rencana eksekusi dan kemudian hanya menggunakannya daripada mencoba mencari satu dengan cepat. Saya pikir peningkatan kinerja saat ini mungkin tidak sebagus dulu, tapi saya harus menebak akan ada beberapa perbaikan marjinal untuk menggunakan tampilan.


Ini adalah pemahaman saya: dulu penting, tidak lagi
annakata

Tidak dari sudut pandang kinerja - lakukan sebagai sarana pembatasan akses. Tapi itu akan menjadi topik lain. ;)
AnonJr

oh tentu, banyak alasan bagus untuk menggunakan tampilan, tidak satu pun untuk menggunakan kueri mentah: P
annakata

4

Jelas tampilan lebih baik daripada permintaan bersarang untuk SQL Server. Tanpa tahu persis mengapa itu lebih baik (sampai saya membaca posting Mark Brittingham), saya telah menjalankan beberapa tes dan mengalami peningkatan kinerja yang hampir mengejutkan ketika menggunakan tampilan versus permintaan bersarang. Setelah menjalankan setiap versi kueri beberapa ratus kali berturut-turut, versi tampilan kueri selesai setengah waktu. Saya akan mengatakan itu cukup bukti bagi saya.


Terima kasih Jordan ... senang mendengar bahwa semua teori ini berhasil di dunia nyata .
Mark Brittingham

Saya memiliki pengalaman dengan tampilan bersarang (view in view) dan ada kinerja yang sangat buruk. Ketika semua tampilan ditulis ulang untuk dipilih, kinerja jauh lebih cepat, jadi mungkin ada tempat untuk beberapa pengujian serius.
Muflix

2

Saya mengharapkan dua pertanyaan untuk melakukan identik. Tampilan tidak lebih dari definisi kueri yang disimpan, tidak ada cache atau penyimpanan data untuk tampilan. Pengoptimal akan secara efektif mengubah permintaan pertama Anda menjadi permintaan kedua Anda saat Anda menjalankannya.


Jika tampilan adalah seperangkat bidang kecil dan bidang-bidang tersebut kemudian ditutup dengan indeks apakah SQL Server cukup pintar untuk menggunakan indeks yang mencakup saat memenuhi bentuk kueri kedua?
AnthonyWJones

1

Semua tergantung pada situasinya. MS SQL Indexed views lebih cepat daripada view normal atau query tetapi viewed indexed tidak dapat digunakan dalam mirrored database invironment (MS SQL).

Tampilan dalam segala bentuk loop akan menyebabkan perlambatan serius karena tampilan diisi kembali setiap kali disebut dalam loop. Sama seperti kueri. Dalam situasi ini tabel sementara menggunakan # atau @ untuk menahan data Anda agar lebih cepat daripada tampilan atau kueri.

Jadi itu semua tergantung situasi.


0

Tidak ada perbedaan praktis dan jika Anda membaca BOL Anda akan menemukan bahwa SQL SELECT * tua biasa Anda * DARI X memang memanfaatkan caching paket, dll.


0

Seharusnya ada beberapa keuntungan sepele dalam menyimpan rencana eksekusi, tetapi akan diabaikan.


0

Tujuan tampilan adalah untuk menggunakan kueri berulang-ulang. Untuk itu, SQL Server, Oracle, dll. Biasanya akan menyediakan versi "cached" atau "compile" dari pandangan Anda, sehingga meningkatkan kinerjanya. Secara umum, ini harus berkinerja lebih baik daripada permintaan "sederhana", meskipun jika permintaan itu benar-benar sangat sederhana, manfaatnya dapat diabaikan.

Sekarang, jika Anda melakukan kueri yang kompleks, buat tampilan.


0

Dalam temuan saya, menggunakan tampilan sedikit lebih cepat daripada permintaan normal. Prosedur tersimpan saya memakan waktu sekitar 25 menit (bekerja dengan set rekaman yang lebih besar berbeda dan beberapa bergabung) dan setelah menggunakan tampilan (non-cluster), kinerjanya hanya sedikit lebih cepat tetapi tidak signifikan sama sekali. Saya harus menggunakan beberapa teknik / metode optimisasi kueri untuk membuatnya berubah secara dramatis.


Cara kami menulis / mendesain kueri sangat penting.
kta

Saya telah menemukan menggunakan CTE untuk membatasi data yang kembali dari tabel dan kemudian melakukan semua pekerjaan / bergabung, dll. CTE telah secara dramatis meningkatkan kinerja dalam banyak kasus
MattE

0

Pilih dari Tampilan atau dari tabel tidak akan masuk akal.

Tentu saja jika Tampilan tidak memiliki gabungan yang tidak perlu, bidang, dll. Anda dapat memeriksa rencana pelaksanaan kueri, gabungan, dan indeks yang digunakan untuk meningkatkan kinerja Tampilan.

Anda bahkan dapat membuat indeks pada tampilan untuk persyaratan pencarian yang lebih cepat. http://technet.microsoft.com/en-us/library/cc917715.aspx

Tetapi jika Anda mencari seperti '% ...%' dari mesin sql tidak akan mendapat manfaat dari indeks pada kolom teks. Jika Anda dapat memaksa pengguna untuk melakukan pencarian seperti '...%' maka itu akan menjadi cepat

merujuk jawaban di forum asp: https://forums.asp.net/t/1697933.aspx?Which+adalah lebih cepat+ketika+menggunakanSELECT+ query+VIEW+ atauTabel+


0

Melawan semua harapan, pandangan jauh lebih lambat dalam beberapa keadaan.

Saya menemukan ini baru-baru ini ketika saya memiliki masalah dengan data yang ditarik dari Oracle yang perlu dipijat ke dalam format lain. Mungkin baris sumber 20k. Meja kecil. Untuk melakukan ini, kami mengimpor data oracle tidak berubah sebanyak yang saya bisa ke dalam tabel dan kemudian menggunakan tampilan untuk mengekstrak data. Kami memiliki pandangan sekunder berdasarkan pandangan tersebut. Mungkin 3-4 level tampilan.

Salah satu pertanyaan terakhir, yang diekstraksi mungkin 200 baris akan memakan waktu hingga 45 menit! Permintaan itu didasarkan pada kaskade pandangan. Mungkin 3-4 level.

Saya bisa mengambil setiap tampilan yang dipermasalahkan, memasukkan sql ke dalam satu query bersarang, dan menjalankannya dalam beberapa detik.

Kami bahkan menemukan bahwa kami bahkan dapat menulis setiap tampilan ke tabel temp dan kueri bahwa di tempat tampilan dan itu masih jauh lebih cepat daripada hanya menggunakan tampilan bersarang.

Apa yang lebih aneh adalah bahwa kinerjanya baik-baik saja sampai kita mencapai batas tertentu dari baris sumber yang ditarik ke dalam database, performanya baru saja jatuh dari tebing selama beberapa hari - hanya beberapa baris sumber yang diperlukan.

Jadi, menggunakan kueri yang menarik dari tampilan yang menarik dari tampilan jauh lebih lambat daripada permintaan bersarang - yang tidak masuk akal bagi saya.


-1

Saya berlari melintasi utas ini dan hanya ingin membagikan pos ini dari Brent Ozar sebagai sesuatu yang perlu dipertimbangkan ketika menggunakan grup ketersediaan.

Laporan bug Brent Ozar

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.