it-swarm.asia

Apakah Tampilan dioptimalkan ketika saya menambahkan klausa WHERE kepada mereka?

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 pergi dengan satu tampilan dan klausa WHERE.

30
Rachel

Anda seharusnya sama sekali 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 akan tidak berbeda melalui tampilan atau tanpa.

14
Aaron Bertrand

Berikut ini hanya contoh singkat yang menunjukkan bahwa seharusnya tidak ada perbedaan. Basis data adalah basis data AdventureWorks.

Definisi Dua Tampilan:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

Ini akan menjadi permintaan pertama, dengan klausa WHERE termasuk dalam definisi tampilan:

select *
from person.vContactWhere

Berikut adalah rencana pelaksanaannya:

enter image description here

Dan permintaan kedua, dengan klausa WHERE tidak dalam definisi tampilan, tetapi dalam permintaan SELECT:

select *
from person.vContactNoWhere
where ContactID = 24

Ini adalah rencana eksekusi:

enter image description here

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 Anda aman, dan pergi dengan preferensi pribadi (atau prosedur berbelanja).

6
Thomas Stringer

Berdasarkan apaSayamembaca , SQL akan menggunakan tampilan standar seperti sub kueri saat menentukan rencana eksekusi.

Jadi, menggunakan contoh permintaan saya,

SELECT Id
FROM MyView
WHERE SomeColumn = 1

di mana MyView didefinisikan sebagai

SELECT Id, SomeColumn
FROM MyTable

harus menghasilkan rencana eksekusi yang sama dengan

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

tetapi rencana eksekusi ini mungkin berbeda dari apa yang akan dihasilkan

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Saya tidak yakin apakah jawaban ini akan sama untuk Tampilan Berindeks

2
Rachel