Для функции поиска я использую представление, содержащее записи из всех таблиц, в которых мне нужно искать. Представление имеет почти 20 миллионов записей. Поиски против этой точки зрения занимают слишком много времени.
Где я должен искать, чтобы улучшить производительность этого представления?
Грубое определение для представления ниже. Он включает в себя тринадцать столов и около тридцати полей.
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 ..
Без дополнительных подробностей о представлении и таблицах ответ будет «это зависит», но вы можете начать искать в предложении WHERE своего поля для полей, которые могут требовать индексов.
источник
В дополнение к тому, что сказали другие (предложение WHERE, INDEX, которые могут помочь), я предлагаю вам, возможно, захотеть рассмотреть индексированные представления - при условии, что даже возможно создать индексы для представления ( подробности ). Тогда вы также сможете применить подсказку NOEXPAND в ваших запросах ( подробности ).
источник
Общий ответ - взглянуть на план выполнения. Индексируются ли ваши объединения? Включены ли ваши выходные поля в эти индексы? Вы выводите только те столбцы, которые вам нужны?
источник
Что я, вероятно, сделал бы, это просто создать 2 представления
Первый вид - это просто поля, которые мне нужно искать; только эти поля. Я бы вернул поле идентификатора для каждой строки, а также таблицу, которую вы ищете. Я сделал то же самое, создав представление UNION ALL, которое осуществляло поиск по нескольким таблицам. Я просто включил идентификатор, тип и текстовые поля, которые я хотел найти.
Второе представление будет обрабатывать отображение результатов, собранных в первом представлении, и будет иметь каждую таблицу, необходимую для отображения результатов, или, возможно, вместо представления сделать ее хранимой процедурой.
Я бы сделал UNION ALL, с GROUP BY внизу, и я бы не сделал все эти ЛЕВЫЕ НАРУЖНЫЕ СОЕДИНЕНИЯ.
источник