Bu 20 milyon kayıt görünümünü daha hızlı nasıl sorgulayabilirim?


14

Bir arama işlevselliği için aramam gereken tüm tablolardan kayıtları olan bir görünüm kullanıyorum. Görüşte yaklaşık 20 milyon kayıt var. Bu görüşe yapılan aramalar çok fazla zaman alıyor.

Bu görüşün performansını artırmak için nereye bakmalıyım?

Görünümün kabaca tanımı aşağıdadır. On üç tablo ve yaklaşık otuz alan içerir.

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, ISNULL(NT.[seventeenSearch],'') AS [seventeenSearch]
, ISNULL(NT.[eighteenSearch],'')AS [eighteenSearch]
, ISNULL(TT.[ninteenSearch],'') AS [ninteenSearch]
, ISNULL(ELT.[twentySearch],'') AS [twentySearch]
, ISNULL(ELT.[twentyOneSearch],'') AS [twentyOneSearch]
, ISNULL(TWT.[twentyTwoSearch],'') AS [twentyTwoSearch]
, ISNULL(THT.twentyThree,'') AS [twentyThree]
, ISNULL(THT.twentyFour,'') AS [twentyFour]
, ISNULL(THT.twentyFive,'') AS [twentyFive]
, ISNULL(THT.twentySix,'') AS [twentySix]
FROM 
      tblFirstTable AS FT         
      LEFT JOIN [tblSecondTable] AS ST 
            ON ST.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblThirdTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblFourthTable] AS FRT 
            ON FRT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblFifthTable] AS FIT 
            ON FIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSixthTable] AS SIT 
            ON SIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSeventhTable] AS SET 
            ON SET.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblEighthTable] AS ET 
            ON ET.[fld_primary] = FT.[fld_primary] 
      LEFT JOIN [tblNinthTable] AS NT 
            ON NT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblELTnthTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblEleventhTable] AS ELT 
            ON ELT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblTwelthTable] AS TWT 
                            ON TWT.[fld_id] = ELT.[fld_id]  
              LEFT JOIN [tblThirteenthTable] AS THT
            ON THT.[firstField]= FT.[firstField]
WHERE fld_Status ..

Yanıtlar:


9

Görünüm, genişleyen makrodur. Dolayısıyla, görünümünüz 2 tablodan BİRLEŞME ise, yürütme planı 2 tabloyu gösterecektir. Görünüm şeffaftır.

Görünüm dizine eklenmiş / gerçekleştirilmişse bu geçerli değildir. Ancak o zaman bu soruyu sormazsınız.

Peki, icra planı ne diyor? DTA? Eksik dizinler dmv sorgusu? En pahalı dmv sorgusu?


O vb, bu yüzden dizine eklenebilir, genellikle sadece başka tablo olarak uygulanan olduğunun farkına bir materialized görünüm için soruyu soran ve etmeyeceğiniz
Joe

@Joe: Muhtemelen, ama sonra farklılıkları biliyorlarsa OP yardım
istemez

Soru MS SQL Server için etiketlendi, bu yüzden "materyalize görünümler" yerine "indekslenmiş görünümler" hakkında konuşmalıyız;)
AndrewSQL

1
@AndrewSQL: Yaptım. Ama daha düşük yaşam formlarına hitap etmeliyiz ...
gbn

6

Görünüm ve tablolar hakkında daha fazla ayrıntı olmadan cevap "bağlıdır", ancak dizinler gerektirebilecek alanlar için görünümünüzün WHERE yan tümcesine bakmaya başlayabilirsiniz.


1
Ama genel olarak görüşlerin endekslerden çok fazla fayda sağlamadığı izlenimindeydim (... "Bu tanıdığım adam tarafından söylendi" göre)
jcolebrand

5
@jcolebrand: genel olarak görünümler, nasıl kullanıldıklarına bağlı olarak dizinler tarafından büyük ölçüde desteklenir. Esasen belirli bir sorguda kullanıldığında, kodları doğrudan sorguya eklenmiş gibi faydalanırlar. Basit görünümler + sorgular için bu, herhangi bir basit sorgunun yanı sıra dizinleri kullandıkları anlamına gelir. Daha karmaşık görünümler / sorgular için, sorgu planlayıcının yapılacak işi ne kadar yeniden düzenleyebileceği ve optimize edebileceğine bağlıdır. Bunu görmenin en iyi yolu, büyük bir veri kümesi seçmek ve bunları kullanarak bazı örnek görünümler ve sorgular üretmek ve SSMS'nin sorgu planı ekranının QP'nin onlarla ne yaptığını görmektir.
David Spillett

6

Diğerlerinin söylediklerine ek olarak (NEREDE yan tümcesi, yardımcı olabilecek INDEXes) Dizine alınmış görünümleri göz önünde bulundurmak isteyebilirim - görünümde dizinler oluşturmanın bile mümkün olduğunu varsayarak ( ayrıntılar ). Ardından NOEXPAND ipucunu sorgularınıza da uygulayabilirsiniz ( ayrıntılar ).


Bunları deneyelim ve sonuçlara döneceğim.
balu

4

Genel cevap, yürütme planına bir göz atmaktır. Birleştirmeleriniz dizine eklendi mi? Çıktı alanlarınız bu dizinlere dahil mi? Yalnızca görmeniz gereken sütunların çıktısını mı alıyorsunuz?


0

Muhtemelen ne yapacağım, sadece 2 görünüm oluşturmak

  • 1. görünüm sadece aramam gereken alanlardan; sadece bu alanlar. Her satır için kimlik alanını ve ayrıca ne tür bir tablo aradığınızı döndürürdüm. Benzer bir şey birden çok tablo arama bir sendika tüm görünümü oluşturarak yaptı. Sadece kimliği, türü ve metin alanlarını dahil etmeyi başardım, aramak istedim.

  • 2nci görünüm, 1nci görünümde toplanan sonuçların görüntülenmesini ele alacak ve sonuçları görüntülemek için ihtiyacınız olan her tabloya veya belki de bir görünüm yerine bunu saklı bir yordam haline getirecektir.

En altta bir GROUP BY ile BİRLİKTE bir sendika yapardım ve tüm bu SOL DIŞ BİRLEŞMELERİ yapmam.

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.