SQL Server'da somutlaştırılmış görünümler nasıl oluşturulur?


101

Bir DW tasarlayacağım ve somut görünümler duydum. Aslında bir görünüm oluşturmak istiyorum ve temel tablolar değiştirildiğinde otomatik olarak güncellenmesi gerekiyor. Herhangi biri bir sorgu örneği ile açıklayabilir mi?

Yanıtlar:


144

Bunlara SQL Server'da dizinlenmiş görünümler denir - daha fazla arka plan için bu teknik incelemeleri okuyun:

Temel olarak yapmanız gereken tek şey:

  • normal bir görünüm oluştur
  • bu görünümde kümelenmiş bir dizin oluşturun

ve bitirdiniz!

İşin zor kısmı şudur: görüş, çok sayıda kısıtlamayı ve sınırlamayı karşılamalıdır - bunlar teknik incelemede özetlenmiştir. Eğer bunu yaparsan - hepsi bu. Görünüm otomatik olarak güncelleniyor, bakıma gerek yok.

Ek kaynaklar:


Cevabın için teşekkürler. İstediğimi aldım .. Dizinler hakkında da bilmek istiyorum. Tüm tablo yapısına sahip olduğumda SQL sunucusunda yıldız şema diyagramı oluşturmanın herhangi bir yolu olup olmadığını bilmek istiyorum. Cevabınız evet ise, bunun için nasıl bilgi tablosu oluşturabilirim?
Deepak

4
Görünüme kümelenmiş bir dizin koyma konusundaki kısıtlamalar kapsamlıdır. Örneğin, görünüm diğer görünümlere referans veremez ve dış birleşimler içeremez. Bu nedenle, daha iyi performans gerektiren birçok görünüm bu yöntemi kullanamaz. Yine de iyi bir cevap.
Jeff Wilson

2
İlgili bir soruda belirtildiği gibi, blogs.msdn.microsoft.com/ssma/2011/06/20/… adlı MSDN blog makalesi, somutlaştırılmış görünümler ile dizinlenmiş görünümler arasındaki bazı önemli farkları vurgular. En sorunlu IMHO, yenileme tetikleyicileri belirleyememektir: Dizine alınmış görünümler, temel tablolar her güncellendiğinde güncellenir - bu, somutlaştırılmış bir görünüm kullanmanın performans avantajlarının çoğunu zayıflatır. Birleştirmeler, toplamalar, pencereleme işlevleri ve alt sorgularla ilgili yasaklar, veriler sık ​​sık değişmediği sürece dizinli görünümleri neredeyse anlamsız hale getirir.
Suncat2000

43

Tamamen mühendislik açısından bakıldığında, dizine alınmış görünümler, performansı iyileştirmek için herkesin kullanabileceği bir şey gibi görünse de gerçek hayat senaryosu çok farklıdır. Başarısız oldum, neyin indekslenebileceğine ve neyin yapılamayacağına dair çok fazla kısıtlama nedeniyle onlara en çok ihtiyaç duyduğum yerlerde indekslenmiş görünümleri kullanmak.

Görünümlerde dış birleşimleriniz varsa, bunlar kullanılamaz. Ayrıca, ortak tablo ifadelerine izin verilmez ... Aslında, alt seçimler veya türetilmiş tablolarda herhangi bir sıralama varsa (örneğin bölümlere göre bölümleme ile), şansınız da yok demektir.

Bu, indekslenmiş görünümleri kullanmak için yalnızca çok basit senaryolar bırakıyor, bence bir şey yine de alttaki tablolarda uygun indeksler oluşturarak optimize edilebilir.

İnsanların gerçekten indekslenmiş görünümleri kendi çıkarları için kullandıkları ve onlarsız yapamayacakları bazı gerçek hayat senaryolarını duymaktan heyecan duyacağım.


Aslında, Tam Metin Arama dizinini bölümlemek için Dizine Alınmış Görünümleri (yalnızca bir kez) kullandım. FTS dizinleri aslında bölümlenemez, ancak aynı tablodan birkaç görünümde ayrı dizinler oluşturulabilir. Yine de son çare sayılırdı.
areyesram

4
(NOEXPAND)Dizine alınmış görünümleri kullanan sorgulara ipucu eklemeyi unutmamalısınız . Ve sonra farkı fark edersiniz. Dizine alınmış görünümleri kullanmanın "tabloları düzgün bir şekilde dizine eklemenin" avantajı, kayıt seçimini sınırlamaktır, aksi takdirde haklısınız, aynı olur.
ajeh

Evet, NOEXPAND şeyi küçümsenemez!
Simon_Weaver

18

Bir Materyalleştirilmiş Görünümün gerçekte ne olduğu konusunda biraz daha fazla arka plana ihtiyacınız olabilir. Oracle'da bunlar, başka bir yerde inşa etmeye çalıştığınızda bir dizi unsurdan oluşan bir nesnedir.

MVIEW, aslında başka bir kaynaktan gelen verilerin anlık görüntüsüdür. Görünümden farklı olarak, bir tablo biçiminde yerel olarak depolanan görünümü sorguladığınızda veriler bulunmaz. MVIEW, düzenli aralıklarla veya kaynak veriler değiştiğinde başlayan bir arka plan prosedürü kullanılarak yenilenir. Oracle, tam veya kısmi yenilemelere izin verir.

SQL Server'da, düzenli olarak yenilemek (tamamlamak) için temel bir MVIEW oluşturmak için aşağıdakileri kullanırdım.

Önce bir manzara. Görünümler herhangi bir veritabanında oldukça yaygın olduğundan, bu çoğu kişi için kolay olmalıdır. Sonra, bir tablo. Bu, sütunlardaki ve verilerdeki görünümle aynı olmalıdır. Bu, görünüm verilerinin anlık görüntüsünü saklayacaktır. Ardından, tabloyu kesen ve görünümdeki mevcut verilere göre yeniden yükleyen bir prosedür. Son olarak, işe başlamak için prosedürü tetikleyen bir iş.

Diğer her şey deneydir.


5
SQL Server hakkındaki yorumlarınız yanlıştır - somutlaştırılmış görünümler Oracle ve SQL Server'da çok farklı şeylerdir. SQL Server'da, üzerinde benzersiz bir kümelenmiş dizine sahip bir görünüm (diğer bir deyişle "somutlaştırılmış görünüm") kullanıcı tarafından güncellenmez ve güncellenemez ve kullanıcı tarafından oluşturulan ayrı bir tabloda saklanmaz - her zaman tarafından güncellenir. güncellemeler sırasında motor ve hiçbir zaman senkronizasyon dışı değildir. Verilerin anlık görüntüsünü depolamak için herhangi bir iş gerekmez.
ErikE

10
OP'nin istediği, indekslenmiş bir görünümle kolayca sağlanır. Bu, SQL Server'ın bir Oracle materyalleştirilmiş görünümüne yerel olarak sağladığı en yakın şeydir. Bununla birlikte, bir Oracle MVIEW'nin çalışma şeklini tam olarak çoğaltmak istiyorsanız / ihtiyacınız varsa, Jason haklıdır. Jason'ın yaklaşımı aynı senaryoda Oracle MVIEWs'in yapabileceği gibi yardımcı olur - örneğin, görünümün ne kadar güncel olduğundan ziyade veritabanı yükünü önemsediğiniz bir raporlama tablosunun saatler dışında yenilenmesi (ör. Yalnızca dünün rakamlarını raporlama ...)

4

Dizine alınmış görünüm bir seçenek olmadığında ve hızlı güncellemeler gerekmediğinde, bir bilgisayar korsanlığı önbellek tablosu oluşturabilirsiniz:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

sonra sp_rename görünümü / tablosu veya ona başvuran sorguları veya diğer görünümleri önbellek tablosuna işaret edecek şekilde değiştirin.

günlük / gece / haftalık / yenilenmeyecek şekilde planla

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

Not: bu, tx günlüklerinizde de yer kaplar. En iyi, hesaplanması yavaş olan küçük veri kümeleri için kullanılır. Belki de "kolay ama büyük" sütunları önce bir dış görünüme elemek için yeniden düzenleme yapın.


1

MS T-SQL Sunucusu için, "include" ifadesiyle bir dizin oluşturmayı öneriyorum. Benzersizlik gerekli değildir, ayrıca kümelenmiş bir indeksle ilişkili verilerin fiziksel olarak sıralanması da gerekmez. "Dizin ... Dahil Et ()", sistem tarafından otomatik olarak tutulan ayrı bir fiziksel veri deposu oluşturur. Kavramsal olarak Oracle Materialized View'a çok benzer.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

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.