Apakah ada bedanya jika Anda memfilter Tampilan di dalam atau di luar Tampilan?
Misalnya, apakah ada perbedaan antara kedua pertanyaan ini?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Atau
SELECT Id
FROM MyView
WHERE SomeColumn = 1
Dan MyView
didefinisikan sebagai
SELECT Id, SomeColumn
FROM MyTable
Dan apakah jawabannya berbeda jika tabel sumber terletak di Server Linked?
Saya bertanya karena saya harus meminta tabel besar (baris 44mil) dua kali dari server yang ditautkan, dan mendapatkan agregat hasil. Saya ingin tahu apakah saya harus membuat dua tampilan untuk mengakses data, satu untuk setiap permintaan, atau jika saya bisa lolos dengan satu tampilan dan WHERE
klausa.
UNION ALL
. Jauh lebih mudah menggunakan Tampilan daripada harus menulis ulang kueri UNION kapan pun saya membutuhkan data.Jawaban:
Anda seharusnya benar-benar tidak melihat perbedaan dalam rencana atau kinerja antara dua pilihan ini. Ketika tampilan ditanya, itu diperluas ke permintaan terhadap tabel dasar, yang berarti pencarian atau pemindaian yang sama akan digunakan.
Sekarang, tergantung pada tipe data dan selektivitas
MyColumn
, jika Anda ingin membuat indeks yang difilter pada tabel dasar (ketika Anda pindah ke SQL Server 2008+), Anda mungkin mendapatkan kinerja yang lebih baik, tetapi ini lagi tidak akan berbeda melalui tampilan atau tanpa.sumber
where
klausa di luar tampilan membutuhkan waktu lebih lama daripada saat dimasukkan dalam tampilan?Berikut ini hanya contoh singkat yang menunjukkan bahwa seharusnya tidak ada perbedaan. Basis data adalah
AdventureWorks
basis data.Definisi Dua Tampilan:
Ini akan menjadi permintaan pertama, dengan
WHERE
klausa yang disertakan dalam definisi tampilan:Berikut adalah rencana pelaksanaannya:
Dan permintaan kedua, dengan
WHERE
klausa tidak dalam definisi tampilan, tetapi dalamSELECT
permintaan:Ini adalah rencana eksekusi:
Seperti yang Anda lihat dari rencana eksekusi ini, mereka identik dengan hasil yang identik. Saya tidak tahu situasi di mana jenis logika / desain ini akan menghasilkan hasil yang berbeda. Jadi saya bersedia mengatakan bahwa Anda aman, dan pergi dengan preferensi pribadi (atau prosedur berbelanja).
sumber
where
klausa di luar tampilan membutuhkan waktu lebih lama daripada saat dimasukkan dalam tampilan?Where
klausa cocok denganPARTITION BY
. SQL Server 2008 tampaknya memiliki aturan baruSelOnSeqPrj
untuk mengenali kasus khusus ini.Berdasarkan apa yang saya baca , SQL akan menggunakan tampilan standar seperti sub kueri saat menentukan rencana eksekusi.
Jadi, menggunakan contoh permintaan saya,
dimana
MyView
didefinisikan sebagaiharus menghasilkan rencana eksekusi yang sama dengan
tetapi rencana eksekusi ini mungkin berbeda dari apa yang akan dihasilkan
Saya tidak yakin apakah jawaban ini akan sama untuk Tampilan Berindeks
sumber
sp_refreshview
diperlukan konsep substitusi teks yang tidak.