WHERE yan tümcesi yan tümce yan tümce eklediğimde görüntüleme en iyi duruma getirilmiş mi?


28

Görünümün içinde veya dışında bir Görünümü filtrelemeniz fark yaratır mı?

Örneğin, bu iki sorgu arasında herhangi bir fark var mı?

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Veya

SELECT Id
FROM MyView
WHERE SomeColumn = 1

Ve MyViewolarak tanımlanır

SELECT Id, SomeColumn
FROM MyTable

Kaynak tablo bir Bağlantılı Sunucu'da bulunuyorsa, cevabınız farklı mı?

Bağlantılı bir sunucudan iki kez büyük bir tablo (44mil satır) sorgulamam ve sonuçları bir araya getirmem gerekiyor çünkü soruyorum. Verilere erişmek için iki sorgu oluşturmalı mıyım, her sorgu için bir tane mi, yoksa tek bir görünüm ve bir WHEREcümle ile kaçabilir miyim, bilmek istiyorum .


1
İçinde sadece bir masa varsa, neden bir manzara kullandın?
HLGEM

3
@HLGEM güvenliği?
JNK

2
@HLGEM Görünüm aslında farklı sunuculardaki birden çok veritabanına ilişkin birden çok sorgu içeriyor ve hepsini a ile birleştiriyor UNION ALL. Bir View kullanmak, veriye ihtiyacım olduğunda UNION sorgusunu yeniden yazmak zorunda kalmaktan çok daha kolaydır.
Rachel


1
@datagod bunu aklımda tutacağım, teşekkürler :) Bu durumda, bir grup sunucudan veri toplayan, bazı hesaplamalar yapan ve bir sürü rapor dağıtan oldukça küçük bir uygulama var. Kendi veritabanına sahiptir, çünkü hesaplamaların bazıları oldukça kaynak yoğundur ve ben her şeyden ayırmak istedim.
Rachel

Yanıtlar:


12

Bu iki seçenek arasındaki planlarda veya performansta kesinlikle bir fark görmemeniz gerekir. Görünüm sorgulandığında, temel tabloya karşı bir sorguya genişletilir, yani aynı arama veya tarama kullanılır.

Şimdi, veri türüne ve seçiciliğine bağlı MyColumnolarak, temel tabloda filtrelenmiş bir dizin oluşturmak istiyorsanız (SQL Server 2008+ sürümüne geçtiğinizde) daha iyi performans elde edebilirsiniz, ancak bu görünüm üzerinden farklı olmayacak veya olmadan.


3
Peki , görünüm dışında yan tümce ile bir sorgu neden görünüme göre daha uzun sürdüğünü soran bu soruwhere ?
Rachel

1
Eğer görüşler performans için değilse, sadece yapı için mi?
profimedica

1
@profimedica endeksli görünümler performans nedenleriyle oluşturulabilir (örneğin çalışma zamanında hesaplamak yerine toplu gibi orta sonuçları depolamak için). Bir görüntünün gerçekleşmemesi halinde, çeşitli nedenlerden ötürü olabilir: DRY (birçok farklı sorguda gerçekleştirilen ortak birleştirme veya filtre), güvenlik, şaşırtma, şema sadeleştirmesi.
Aaron Bertrand

5

İşte fark olmaması gerektiğini gösteren hızlı bir örnek. Veri tabanı veri AdventureWorkstabanıdır.

İki Görünüm tanımı:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

WHEREGörünüm tanımında yan tümce tümce ile birlikte ilk sorgu gelir :

select *
from person.vContactWhere

İşte yürütme planı:

görüntü tanımını buraya girin

Ve ikinci sorgu, WHEREyan tümce görünüm tanımında değil, SELECTsorguda:

select *
from person.vContactNoWhere
where ContactID = 24

İşte bu yürütme planı:

görüntü tanımını buraya girin

Bu uygulama planlarından görebileceğiniz gibi, bunlar aynı sonuçlarla aynıdır. Bu tür bir mantık / tasarımın farklı sonuçlara neden olacağı bir durum bilmiyorum. Bu yüzden her iki şekilde de güvende olduğunuzu söylemeye ve kişisel tercihlerinize (ya da alışveriş prosedürlerine) uymaya istekli olacağım.


1
Peki , görünüm dışında yan tümce ile bir sorgu neden görünüme göre daha uzun sürdüğünü soran bu soruwhere ?
Rachel

1
@Rachel, gbn'nin görevinde ve işaret ettiği makalede oldukça iyi açıkladığını düşünüyorum. Nasıl koyacağımı bilmiyorum.
Thomas Stringer

Bağladım, çünkü bu durumda, yürütme planları aynı değildi, bu sizin cevabınızın söylediklerinden farklıydı.
Rachel

1
@Rachel Bu örnekteki mesele eksik bir dönüşüm kuralıdır . Yalnızca görünümler için değil aynı zamanda CTE'ler ve diğer tablo ifadeleri için de geçerlidir. Genel durumda, sonucu değiştirecek şekilde sıralama işlevlerini içeren tablo ifadelerine aşağı doğru itmek geçerli değildir. Bu durumda geçerli olmasının nedeni, Wheremaddenin yanına uymasıdır PARTITION BY. SQL Server 2008'in SelOnSeqPrjbu özel durumu tanıması için yeni bir kuralı var gibi görünüyor .
Martin Smith


2

Dayanarak neyi ben değilim okuma yürütme planını belirlerken, SQL alt sorguda gibi standart bir görünüm kullanacaktır.

Yani benim örnek sorgu kullanarak

SELECT Id
FROM MyView
WHERE SomeColumn = 1

nerede MyViewtanımlanır

SELECT Id, SomeColumn
FROM MyTable

ile aynı uygulama planını oluşturması gerekir

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

ancak bu uygulama planı, oluşturulacak olandan farklı olabilir

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Bu cevabın Dizinli Görünümler için aynı olup olmadığından emin değilim.


Bunun açık bir şekilde değiştirilebileceğini sanmıyorum.
Aaron Bertrand

@AaronBertrand Haklı olabilirsiniz. Açıkçası hiçbir fikrim yok ... Gittikçe öğreniyorum :) Bu varsayım, görüşlerin makrolar gibi nasıl olduğu hakkında okuduğum diğer şeylere dayanıyordu. Dizine alınmış görünümler yerine standart görünümlere atıfta bulunduğumu belirtmek için soruyu biraz düzenledim.
Rachel

@Rachel - Yer değiştirme, cebirleştirilmiş bir ağacın metin düzeyinde olmaması durumunda gerçekleşir.
Martin Smith,

@ MartinSmith Hrrmm dediğim bu değil mi? Yürütme planlarının aynı olması gerektiği, metnin aynı olması gerektiği değil mi? "Cebirleşmiş ağaç" ı anladığımdan emin değilim
Rachel

Sadece Q'nun "sorgunuza bir Görünüm metni ekler" ve Aaron'un yukarıdaki yorumuna yazdığını söyleyen yorumuna bir cevaptı. Burada ayrıştırma / derleme aşamaları hakkında bazı bilgiler . Aslında cevabınız aynı zamanda metin yerine geçmekten de söz ediyor. Bunun yapmaya değer bir ayrım olup olmadığı. Emin değil! Fakat sanırım sp_refreshview, metin değiştirme kavramının neden ihtiyaç duymadığını açıklıyor .
Martin Smith,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.