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 ..
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.
sumber
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 ).
sumber
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?
sumber
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.
sumber