Bir görünüm basit bir sorgudan daha mı hızlı?


359

Bir

select *  from myView

görünümü oluşturmak için sorgunun kendisinden daha hızlı (aynı sonuç kümesine sahip olmak için):

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

?

Görünümü basit bir sorguya göre daha hızlı hale getiren bir çeşit önbellekleme kullanıyorsa benim için tam olarak açık değil.


7
Bir görünümden emin değilim, ancak iç içe görünümler toplam performans cehennemidir.
Muflix

Yanıtlar:


680

Evet , görünümler kümelenmiş bir dizine atanmış olabilir ve bunu yaptıkları zaman sonuçta ortaya çıkan sorguları hızlandırabilecek geçici sonuçlar depolarlar.

Güncelleme: En az üç kişi bana bu konuda oy verdi. Tüm saygımla, onların sadece yanlış olduğunu düşünüyorum; Microsoft'un kendi belgeleri, Views'ın performansı artırabileceğini açıkça ortaya koymaktadır.

İlk olarak, basit görüşler yerinde genişletilir ve bu nedenle performans iyileştirmelerine doğrudan katkıda bulunmazlar - bu çok doğrudur. Ancak, dizine eklenen görünümler performansı önemli ölçüde artırabilir.

Doğrudan belgelere gideyim:

Görünümde benzersiz bir kümelenmiş dizin oluşturulduktan sonra, görünümün sonuç kümesi hemen gerçekleşir ve veritabanındaki fiziksel depolamada kalıcı olarak kalır ve bu pahalı işlemi yürütme zamanında gerçekleştirme yükünü azaltır.

İkincisi, bu dizine alınmış görünümler, başka bir sorgu tarafından doğrudan başvuruda bulunulmasalar bile , optimize edici uygun olduğunda tablo referansı yerine bunları kullanacak şekilde çalışabilir .

Yine, belgeler:

Dizin oluşturulmuş görünüm, sorgu yürütmesinde iki şekilde kullanılabilir. Sorgu, dizinlenmiş görünüme doğrudan başvurabilir veya daha da önemlisi, sorgu en iyileştiricisi, görünümün en düşük maliyetli sorgu planındaki sorgunun bir kısmı veya tamamı için değiştirilebileceğini belirlerse görünümü seçebilir. İkinci durumda, temel alınan tablolar ve sıradan dizinleri yerine dizinlenmiş görünüm kullanılır. Sorgu yürütücüsünün sorgu yürütme sırasında kullanması için görünümde sorguda başvurulmasına gerek yoktur. Bu, mevcut uygulamaların bu uygulamaları değiştirmeden yeni oluşturulan dizine alınan görünümlerden faydalanmasını sağlar.

Bu dokümantasyon ve performans iyileştirmelerini gösteren grafikler burada bulunabilir .

Güncelleme 2: Yanıt, "Görünüm" yerine performans avantajı sağlayan "dizin" olması nedeniyle eleştirildi. Ancak, bu kolayca çürütülür.

Küçük bir ülkede bir yazılım şirketi olduğumuzu varsayalım; Litvanya'yı örnek olarak kullanacağım. Dünya çapında yazılım satıyoruz ve kayıtlarımızı bir SQL Server veritabanında tutuyoruz. Çok başarılıyız ve bu nedenle birkaç yıl içinde 1.000.000'dan fazla kaydımız var. Ancak, genellikle vergi amaçlı satışları bildirmemiz gerekir ve kendi ülkemizde yazılımımızın yalnızca 100 kopyasını sattığımızı tespit ederiz. Yalnızca Litvanya kayıtlarının dizinlenmiş bir görünümünü oluşturarak, ihtiyaç duyduğumuz kayıtları MS belgelerinde açıklandığı gibi dizinlenmiş bir önbellekte tutuyoruz. 2008'de Litvanya satışları için raporlarımızı çalıştırdığımızda, sorgumuz sadece 7 derinliğe (kullanılmayan bazı yaprakları olan Log2 (100)) bir endeks içinde arama yapacak. Aynı şeyi VIEW olmadan ve sadece bir endekse tabloya dayanarak yapsaydık, arama derinliği 21 olan bir dizin ağacını geçmeliyiz!

Açıkçası, Görünüm'ün kendisi bize sadece endeksin basit kullanımı üzerinde bir performans avantajı (3x) sağlayacaktır. Gerçek dünyadan bir örnek kullanmaya çalıştım, ancak Litvanyalı satışların basit bir listesinin bize daha da büyük bir avantaj sağlayacağını göreceksiniz.

Örneğim için sadece düz bir b-ağacı kullandığımı unutmayın. SQL Server'ın bir b-ağacının bazı varyantlarını kullandığından oldukça emin olmakla birlikte, ayrıntıları bilmiyorum. Bununla birlikte, mesele tutulur.

Güncelleme 3: Bir Dizinlenmiş Görünümün yalnızca temel tabloya yerleştirilmiş bir dizin kullanıp kullanmadığı sorusu ortaya çıktı. Başka bir deyişle, "dizine alınmış bir görünüm yalnızca standart bir dizinin eşdeğeridir ve bir görünüme yeni veya benzersiz bir şey sunmaz." Bu doğruysa, elbette, yukarıdaki analiz yanlış olur! Bu eleştirinin neden geçerli veya doğru olmadığını düşündüğümü gösteren Microsoft belgelerinden bir teklif vereyim:

Sorgu performansını artırmak için dizinleri kullanmak yeni bir kavram değildir; ancak, dizinlenmiş görünümler standart dizinler kullanılarak elde edilemeyen ek performans avantajları sağlar.

Birlikte fiziksel depolama ve endeksleri Views'daki nasıl oluşturulduğunu hakkında dokümandaki diğer bilgilerde verilerin sebat ilgili yukarıdaki alıntı ile, bunun bir Endeksli Görüntüle olduğunu söylemek güvenli olduğunu düşünüyorum değil sadece kullanmak olur bir önbelleğe SQL Select ana tabloda tanımlanmış dizin. Bu yüzden, bu cevabın yanında olmaya devam ediyorum.


29
Evet, dizine eklenmiş görünümler performansı önemli ölçüde artırabilir. Ancak dizine eklenen görünümler yalnızca "görünümler" değildir ve genel olarak konuşursak, normal "görünüm" ilişkili sorgulardan daha hızlı değildir.
BradC

10
@Charles - endeksin olup olmadığı önemli değil, bir görünümün dizinden yararlanabilmesi ve ham bir sorgunun yeterli olmaması yeterli
annakata

196
applaud @Mark onun yerini ayakta ve bunu rasyonel olarak tartıştığı için
annakata

17
Oh, adamým, bu konuda 8 intikam aldým! İnsanların en azından Charles'ın düşüncelerini tartışma cesaretine sahip olmadan bu kadar hızlı bir şekilde aşağı düşeceklerine şaşırdım.
Mark Brittingham

8
Bir tablonun yalnızca bir küme dizini olabileceğinden ve bir görünümde ayrı bir kümelenmiş dizin oluşturabildiğiniz için (kümelenmiş dizindeki alanlar dizin sayfalarında bağımsız olarak kaldığı için), bu bir hile (work-arounnd?) tek bir tabloda İKİ kümelenmiş indeks elde etmenizi sağlar.
Charles Bretana

51

Genel olarak, hayır. Görüşler öncelikle kolaylık ve güvenlik için kullanılır ve (kendi başlarına) herhangi bir hız avantajı sağlamaz.

Yani 2000 ve yukarıda adı verilen bir özelliği var SQL Server dedi Endeksli Görüntüleme olabilir edilecek bir kaç nokta büyük ölçüde performansını artırmak,:

  1. Her görünüm dizinlenmiş bir görünümde oluşturulamaz; onlar takip etmek zorunda kurallar belirli setini araçlarının (diğer kısıtlamalar arasında) Eğer gibi yaygın sorgu unsurları içeremez, COUNT, MIN, MAX, veya TOP.
  2. Dizinlenmiş görünümler, tıpkı bir tablodaki dizinler gibi veritabanındaki fiziksel alanı kullanır.

Bu makalede , dizine eklenen görünümlerin ek avantajları ve sınırlamaları açıklanmaktadır :

Yapabilirsin…

  • Görünüm tanımı, aynı veritabanındaki bir veya daha fazla tabloya başvurabilir.
  • Benzersiz kümelenmiş dizin oluşturulduktan sonra, görünüme karşı ek kümelenmemiş dizinler oluşturulabilir.
  • Ekler, güncellemeler, siler ve hatta kesikler dahil olmak üzere temel tablolardaki verileri güncelleyebilirsiniz.

Yapamazsın…

  • Görünüm tanımı, diğer görünümlere veya diğer veritabanlarındaki tablolara başvuramaz.
  • COUNT, MIN, MAX, TOP, dış birleşimler veya başka birkaç anahtar kelime veya öğe içeremez.
  • Temel tabloları ve sütunları değiştiremezsiniz. Görünüm WITH SCHEMABINDING seçeneğiyle oluşturulur.
  • Sorgu optimize edicinin ne yapacağını her zaman tahmin edemezsiniz. Enterprise Edition kullanıyorsanız, benzersiz kümelenmiş dizini otomatik olarak bir sorgu seçeneği olarak kabul eder - ancak "daha iyi" bir dizin bulursa kullanılır. Doktoru indeksi WITH NOEXPAND ipucu ile kullanmaya zorlayabilirsiniz - ancak herhangi bir ipucu kullanırken dikkatli olun.

3
tamamen katılmıyorum ... bir görünümden okumak SQL'in yeniden yazılmasına izin verir .. ve genellikle bir görünümden (görünümün bir dökümünden daha) okumak için HIZLI.
Aaron Kempf

@AaronKempf, bununla ilgili bazı referanslar görmek isterim, bu benim deneyimim olmadı. "Yeniden yazılan SQL'i görüntüle" yi aradığımda, elde ettiğim tüm sonuçlar SQL sunucusuna değil Oracle'a başvuruyor
BradC

Ben sadece dün üzerinde bazı kıyaslama yapıyordum, ben şaşırdım .. temelde bir görünümden (bir tabloya) bir dökümü alırsanız çalıştırdığım herhangi bir sorgu YAVAŞ olduğunu .. çünkü çoğu sorgu tereyağı gibi görünümden geçer ve yeniden yazılır sorgu optimizer tarafından .. En azından benim varsayım bu. Yakında bir blog girişi yazmaya çalışacağım, kıyaslama oldukça büyüleyici şeylerdi. Temel olarak görüntüler performansa muazzam bir şekilde yardımcı oluyor.
Aaron Kempf

@AaronKempf Orijinal soruyla aynı senaryodan bile emin değilim (bir sorgunun aynı sorguyu bir görünüme koymasıyla karşılaştırması). Her neyse, bir tabloya bir görünümün nasıl materyalize edilmesinin onu daha zayıf hale getireceğini göremiyorum (dizinlenmiş bir görünümün aynısı budur), yeni tablonuzda iyi dizinler yoksa.
BradC

1
Brad; Görüntülemelerin beni bu durumdaki performansımın% 99'unu nasıl koruduğuna dair gerçekten kötü bir blog yazısı yazdım .. Birkaç başka makale yazmayı planlıyorum, ancak buna daha fazla TON koymam gerektiğini biliyorum. Buna bir göz atmayı ve açıklamam hakkında ne düşündüğünüzü söylemeyi düşünür müsünüz? Daha fazla anlam ifade etmeyeceğini biliyorum (2-3 tane daha makale yazana kadar) .. ama çılgınca manzaraya aşığım ve uzun süredir varım! accessadp.com/2013/01/22/do-views-increase-performance
Aaron Kempf

14

SQL Server'da en azından Sorgu planları, sorgu / görünüm parametrelerine dayalı olarak hem görünümler hem de sıradan SQL sorguları için plan önbelleğinde depolanır. Her ikisi için de, yeterince uzun bir süre kullanılmadıklarında önbellekten bırakılırlar ve yeni gönderilen başka bir sorgu için alan gerekir. Bundan sonra, aynı sorgu verilirse, yeniden derlenir ve plan önbelleğe geri konur. Bu nedenle, aynı SQL sorgusunu ve aynı görünümü aynı sıklıkta yeniden kullandığınız göz önüne alındığında, hiçbir fark yoktur.

Açıkçası, genel olarak, bir görünüm, çok doğası gereği (Birisinin bir görünümü oluşturmak için yeterince sık kullanıldığını düşündüğü), genellikle herhangi bir keyfi SQL ifadesinden "yeniden" kullanılması daha olasıdır.


14

EDIT: Yanılmışım ve yukarıdaki Marks cevap görmelisiniz .

SQL Server ile deneyimlerimden konuşamıyorum , ancak çoğu veritabanı için cevap hayır olacaktır. Bir görünümü kullanarak performans açısından akıllıca elde edebileceğiniz tek avantaj, sorguya dayalı olarak bazı erişim yolları oluşturabilmesidir. Ancak bir görünümü kullanmanın ana nedeni, bir sorguyu basitleştirmek veya tablodaki bazı verilere erişmenin bir yolunu standartlaştırmaktır. Genel olarak, bir performans avantajı elde edemezsiniz. Yine de yanlış olabilirim.

Orta derecede daha karmaşık bir örnek bulurdum ve görmeniz için kendinize zaman ayırırdım.


1
görüşlerin bir başka nedeni de rol tabanlı modellerde erişim kontrolüne yardımcı olmaktır
annakata

1
Performans iyileştirmeleri konusunda yanılıyorsunuz. Orijinal yorumumda bazı insanları ikna edecek kadar açıklama yapmadım, ancak MS'in performansı artırmak için görünümleri nasıl kullanacağına dair açık belgeleri var. Aşağıdaki (şimdi çok aşağı indirilmiş) yanıtıma bakın.
Mark Brittingham

7

Gerçekleştirilmiş bir görünüm oluşturursanız ( şema bağlamasıyla ) daha hızlı olabilir . Gerçekleştirilmemiş görünümler, normal sorgu gibi yürütülür.


şemayı bağlama işleminin performansla pek ilgisi yoktur, görünümün şemasını alttaki tabloya bağlar, böylece senkronize kalır ve dizinlenmiş görünümler için bir ön gereksinimdir.
Sam Saffron

5

Anladığım kadarıyla SQL Server bir yürütme planını saklayabildiğinden ve daha sonra bunu bir an önce anlamaya çalışmak yerine kullanabileceğinden, bir süre daha hızlı bir görünüm daha hızlı olurdu. Bugünlerde performans artışlarının muhtemelen bir zamanlar olduğu kadar büyük olmadığını düşünüyorum, ancak görünümü kullanmak için biraz marjinal bir iyileşme olacağını tahmin etmeliyim.


Bu benim anlayışımdı:
eskiden önemliydi

Performans açısından değil - erişim kısıtlaması aracıdır. Ama bu başka bir konu olurdu. ;)
AnonJr

ah emin, görünümleri kullanmak için çok iyi nedenler, ham sorgular kullanmak için tek bir değil: P
annakata

4

Kesinlikle bir görünüm SQL Server için iç içe bir sorgu daha iyidir. Tam olarak neden daha iyi olduğunu bilmeden (Mark Brittingham'ın gönderisini okuyana kadar), bazı testler yaptım ve iç içe bir sorguya karşı bir görünüm kullanırken neredeyse şok edici performans geliştirmeleri yaşadım. Sorgunun her sürümünü arka arkaya birkaç yüz kez çalıştırdıktan sonra, sorgunun görünüm sürümü yarı sürede tamamlanır. Bunun benim için yeterli bir kanıt olduğunu söyleyebilirim.


Teşekkürler Jordan ... tüm bu teorinin gerçek dünyada işe yaradığını duyduğuma sevindim .
Mark Brittingham

iç içe görünümü (görünümü görünümü) ile deneyimim var ve çok kötü performans oldu. Tüm görüşler alt seçimlere yeniden yazıldığında, performans birçok kez daha hızlıydı, bu yüzden belki de bazı ciddi testlere yer var.
Muflix

2

İki sorgunun da aynı şekilde olmasını beklerim. Bir görünüm, saklanan sorgu tanımından başka bir şey değildir; bir görünüm için verilerin önbelleğe alınması veya depolanması yoktur. Optimize edici, çalıştırdığınızda ilk sorgunuzu etkili bir şekilde ikinci sorgunuza dönüştürür.


Görünüm küçük bir alan kümesiyse ve bu alanlar bir dizinle kaplanmışsa, SQL Server sorgu formunu yerine getirirken bu kaplama dizinini kullanacak kadar zekidir?
AnthonyWJones

1

Herşey duruma bağlı. MS SQL Dizinlenmiş görünümler normal görünüm veya sorgudan daha hızlıdır, ancak dizinlenmiş görünümler yansıtılmış veritabanı ortamında (MS SQL) kullanılamaz.

Herhangi bir döngüdeki görünüm ciddi yavaşlamaya neden olur, çünkü görünüm döngüde her çağrıldığında yeniden doldurulur. Bir sorgu ile aynı. Bu durumda, verilerinizi dolaşmak için # veya @ kullanarak geçici bir tablo bir görünümden veya sorgudan daha hızlıdır.

Yani her şey duruma bağlı.


0

Pratik farklı değildir ve BOL okursanız, düz eski SQL SELECT * FROM X'in plan önbelleğe alma vb.


0

İcra planının saklanmasında önemsiz bir kazanç olmalı, ancak ihmal edilebilir olacaktır.


0

Bir görünümün amacı, sorguyu tekrar tekrar kullanmaktır. Bu amaçla, SQL Server, Oracle vb. Genellikle görünümünüzün "önbelleğe alınmış" veya "derlenmiş" bir sürümünü sunarak performansını artırır. Genel olarak, bu "basit" bir sorgudan daha iyi performans göstermelidir, ancak sorgu gerçekten çok basitse, faydalar ihmal edilebilir olabilir.

Şimdi, karmaşık bir sorgu yapıyorsanız görünümü oluşturun.


0

Bulduğumda, görünümü kullanmak normal bir sorgudan biraz daha hızlı. Benim saklı yordam yaklaşık 25 dakika alarak (farklı daha büyük rekor setleri ile çalışan ve birden katılır) ve görünümü kullandıktan sonra (kümelenmemiş) oldu, performans sadece biraz daha hızlı ama anlamlı hiç oldu. Ben dramatik bir değişiklik yapmak için başka bazı sorgu optimizasyon teknikleri / yöntemi kullanmak zorunda kaldı.


Sorguyu nasıl yazdığımız / tasarladığımız çok önemlidir.
kta


0

Bir Görünüm'den veya bir tablodan seçim yapmak çok mantıklı olmaz.

Elbette Görünüm'de gereksiz birleştirmeler, alanlar vb. Yoksa Görünüm performansını iyileştirmek için kullanılan sorgularınızın, birleştirmelerin ve dizinlerin yürütme planını kontrol edebilirsiniz.

Daha hızlı arama gereksinimleri için görünümlerde dizin bile oluşturabilirsiniz. http://technet.microsoft.com/en-us/library/cc917715.aspx

Ancak sql motorundan '% ...%' gibi arama yapıyorsanız, metin sütunundaki bir dizinden yararlanamaz. Kullanıcılarınızı '...%' gibi arama yapmaya zorlayabilirseniz bundan daha hızlı olur

asp forumlarında yanıtlamaya yönlendirildi: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+


0

Tüm beklentilere rağmen, bazı durumlarda görüşler çok daha yavaştır.

Son zamanlarda Oracle'dan alınan ve başka bir formata masaj yapılması gereken verilerle ilgili sorun yaşadığımda bunu keşfettim. Belki 20k kaynak satırı. Küçük bir masa. Bunu yapmak için, oracle verilerini bir tabloya olabildiğince değişmeden içe aktardık ve sonra verileri ayıklamak için görünümler kullandık. Biz bu görüşlere dayalı ikincil görüş vardı. Belki 3-4 görüş seviyesi.

Belki 200 satır çıkartılan son sorgulardan biri 45 dakika kadar sürebilir! Bu sorgu, bir dizi çağlamaya dayanıyordu. Belki 3-4 seviye derin.

Söz konusu görünümlerin her birini alabilir, sql'i bir iç içe sorguya ekleyebilir ve birkaç saniye içinde yürütebilirim.

Hatta her görünümü bir geçici tabloya yazabileceğimizi ve görünümün yerine sorgulayabildiğimizi ve hala iç içe görünümleri kullanmaktan daha hızlı olduğunu gördük.

Daha da kötüsü, veritabanına çekilen kaynak satırlarının bir sınırına ulaşana kadar performansın iyi olmasıydı, birkaç gün boyunca sadece bir uçurumdan düştü - birkaç kaynak satırı daha aldı.

Bu nedenle, görünümlerden gelen sorgulardan gelen sorguları kullanmak, iç içe bir sorgudan çok daha yavaştır - bu benim için anlamsızdır.


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.