Bagaimana cara saya meminta 20 juta tampilan rekaman ini lebih cepat?

14

Untuk fungsi pencarian, saya menggunakan tampilan yang memiliki catatan dari semua tabel di mana saya perlu mencari. Tampilan ini memiliki hampir 20 juta catatan. Pencarian terhadap pandangan ini terlalu banyak waktu.

Di mana saya harus mencari untuk meningkatkan kinerja tampilan ini?

Definisi kasar untuk tampilan di bawah ini. Ini mencakup tiga belas tabel dan sekitar tiga puluh bidang.

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 ..
balu
sumber

Jawaban:

9

Tampilan adalah makro yang mengembang. Jadi, jika tampilan Anda GABUNG dari 2 tabel, rencana eksekusi akan menampilkan 2 tabel. Tampilannya transparan.

Ini tidak berlaku jika tampilan diindeks / terwujud. Namun, Anda tidak akan menanyakan pertanyaan ini.

Jadi, apa rencana eksekusi katakan? DTA? Permintaan indeks dmv tidak ada? Permintaan dmv paling mahal?

gbn
sumber
Dia mungkin mengajukan pertanyaan untuk pandangan terwujud, dan tidak menyadari itu biasanya diterapkan hanya sebagai tabel lain, sehingga dapat diindeks, dll.
Joe
@ Jo: mungkin, tapi kemudian OP tidak akan meminta bantuan jika mereka tahu perbedaannya ...
gbn
Pertanyaan ini ditandai untuk MS SQL Server daripada "tampilan terwujud", kita harus berbicara tentang "tampilan yang diindeks";)
AndrewSQL
1
@AndrewSQL: Ya. Tetapi kita harus memenuhi bentuk kehidupan yang lebih rendah ...
gbn
6

Tanpa rincian lebih lanjut tentang tampilan dan tabel jawabannya adalah "itu tergantung", tetapi Anda bisa mulai melihat klausa WHERE dari pandangan Anda untuk bidang yang mungkin memerlukan indeks.

ggponti
sumber
1
Tapi saya mendapat kesan bahwa pandangan secara umum tidak mendapat banyak manfaat dari indeks (... menurut "Saya diberitahu oleh orang ini yang saya kenal")
jcolebrand
5
@ jcolebrand: tampilan secara umum sangat terbantu oleh indeks, tergantung pada bagaimana mereka digunakan. Pada dasarnya ketika digunakan dalam permintaan yang diberikan mereka akan mendapat manfaat seolah-olah kode mereka dimasukkan langsung ke dalam permintaan. Untuk tampilan + kueri sederhana, ini berarti mereka menggunakan indeks serta kueri sederhana apa pun. Untuk tampilan / kueri yang lebih kompleks, itu tergantung seberapa baik perencana kueri dapat mengatur ulang dan mengoptimalkan pekerjaan yang harus dilakukan. Cara terbaik untuk melihatnya adalah dengan memilih dataset besar dan membuat beberapa contoh tampilan dan kueri menggunakannya, dan melihat apa yang ditampilkan oleh rencana kueri SSMS tentang QP.
David Spillett
6

Selain apa yang dikatakan orang lain (klausa WHERE, INDEKS yang mungkin membantu) Saya sarankan Anda mungkin ingin mempertimbangkan tampilan yang diindeks - dengan asumsi bahkan mungkin untuk membuat indeks pada tampilan ( detail ). Maka Anda mungkin dapat juga menerapkan petunjuk NOEXPAND dalam pertanyaan Anda ( detail ).

AndrewSQL
sumber
Detail ini kedengarannya menjanjikan. Mari saya coba dan akan kembali pada hasilnya.
balu
4

Jawaban umum adalah dengan melihat pada rencana eksekusi. Apakah gabungan Anda diindeks? Apakah bidang output Anda termasuk dalam indeks itu? Apakah Anda hanya menampilkan kolom yang perlu Anda lihat?

Matt M
sumber
0

Apa yang mungkin akan saya lakukan, hanya membuat 2 tampilan

  • Tampilan pertama hanya bidang yang perlu saya cari; hanya bidang-bidang itu. Saya akan mengembalikan bidang ID untuk setiap baris, ditambah tabel seperti apa yang Anda cari. Saya melakukan hal serupa dengan membuat tampilan UNION ALL yang mencari beberapa tabel. Saya hanya memastikan untuk memasukkan id, jenis, dan bidang teks, saya ingin mencari.

  • Tampilan ke-2 akan menangani menampilkan hasil yang dikumpulkan dalam tampilan ke-1, dan akan memiliki setiap tabel yang Anda butuhkan untuk menampilkan hasil, atau mungkin alih-alih tampilan, menjadikannya prosedur yang tersimpan.

Saya akan melakukan UNION ALL, dengan GROUP BY di bagian bawah, dan saya tidak akan melakukan semua LEFT OUTER JOINs.

crosenblum
sumber