it-swarm.asia

Apakah tampilan lebih cepat daripada permintaan sederhana?

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. 

298
JohnIdol

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 terhadap 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 biaya tambahan untuk melakukan operasi yang mahal ini pada waktu pelaksanaan.

Kedua, tampilan yang diindeks ini dapat berfungsi bahkan ketika mereka tidak direferensikan secara langsung oleh permintaan lain karena pengoptimal akan menggunakannya di tempat referensi tabel bila perlu. 

Sekali 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, pengoptimal 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 dikritik atas dasar bahwa itu adalah "indeks" yang memberikan keunggulan 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, kami bisa menyimpan catatan yang kami 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 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 Terindeks hanya menggunakan indeks yang ditempatkan di tabel yang mendasarinya. Artinya, untuk parafrase: "tampilan yang diindeks hanya setara dengan indeks standar dan tidak menawarkan apa pun yang baru atau unik untuk tampilan." Jika ini benar, tentu saja, maka analisis di atas akan salah! Izinkan 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 aman untuk mengatakan bahwa Tampilan Berindeks adalah bukan hanya SQL cached Select kebetulan menggunakan indeks yang ditentukan pada tabel utama. Jadi, saya terus mendukung jawaban ini.

550
Mark Brittingham

Secara umum, tidak. Tampilan terutama digunakan untuk kenyamanan dan keamanan, bukan untuk peningkatan kecepatan.

Yang mengatakan, SQL Server 2000 dan di atas memang memiliki fitur khusus yang disebut Tampilan Terindeks yang dapat sangat meningkatkan kinerja, tetapi Anda harus membuat tampilan yang diindeks mengikuti sangat seperangkat pedoman

Ada referensi penting dalam Books Online sehubungan dengan lihat resolusi

Berikut adalah artikel yang menjelaskan manfaat dan pembuatan tampilan yang diindeks :

Selama bertahun-tahun, Microsoft® SQL Server ™ telah mendukung kemampuan untuk membuat tabel virtual yang dikenal sebagai views . Secara historis, pandangan-pandangan ini melayani .__ ini. tujuan utama: 

  • Untuk menyediakan mekanisme keamanan membatasi pengguna ke bagian tertentu dari data dalam satu atau beberapa tabel dasar. 

  • Untuk menyediakan mekanisme yang memungkinkan pengembang untuk menyesuaikan cara pengguna secara logis melihat data yang disimpan dalam basis meja.

Dengan SQL Server 2000, fungsionalitas tampilan SQL Server adalah diperluas untuk memberikan kinerja sistem manfaat. Dimungkinkan untuk membuat indeks berkerumun unik pada tampilan, sebagai serta indeks nonclustered, ke meningkatkan kinerja akses data di pertanyaan paling kompleks. Dalam SQL Server 2000 dan 2005, pandangan yang memiliki indeks cluster unik disebut sebagai tampilan yang diindeks. 

41
BradC

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 tidak digunakan untuk 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 rencana itu 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, suatu pandangan, pada dasarnya (bahwa seseorang mengira itu cukup sering digunakan untuk membuatnya menjadi tampilan) umumnya lebih mungkin untuk "digunakan kembali" daripada pernyataan SQL sembarang. 

13
Charles Bretana

EDIT: Saya salah, dan Anda akan melihat Menandai jawaban 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, dari segi kinerja, dari menggunakan tampilan adalah bahwa ia 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.

12
Ryan Guill

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

4
Otávio Décio

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 peningkatan marjinal untuk menggunakan tampilan.

4
E.J. Brennan

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.

2
Jordan

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 kueri pertama Anda menjadi kueri kedua saat Anda menjalankannya.

2
Tony Andrews

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

0
keithwarren7

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

0
JosephStyons

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

Tampilan dalam segala bentuk loop akan menyebabkan perlambatan yang serius karena tampilan diisi ulang 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
Dasboot

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 rumit, buat tampilan.

0
CAReed

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 cepat

merujuk jawaban di forum asp: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+

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 dan beberapa gabungan) dan setelah menggunakan tampilan (non-cluster), kinerjanya hanya sedikit lebih cepat tetapi tidak signifikan sama sekali. Saya harus menggunakan beberapa teknik/metode optimisasi kueri lainnya untuk membuatnya berubah secara dramatis.

0
kta