Para una funcionalidad de búsqueda, estoy usando una vista que tiene los registros de todas las tablas dentro de las cuales necesito buscar. La vista tiene casi 20 millones de registros. Las búsquedas en contra de esta vista están tomando demasiado tiempo.
¿Dónde debo buscar para mejorar el rendimiento de esta vista?
La definición aproximada de la vista está abajo. Incluye trece mesas y alrededor de treinta campos.
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 ..
Sin más detalles sobre la vista y las tablas, la respuesta es "depende", pero podría comenzar a buscar en la cláusula WHERE de su vista los campos que pueden requerir índices.
fuente
Además de lo que otros han dicho (cláusula WHERE, ÍNDICES que podrían ayudar), sugiero que desee considerar las vistas indexadas, suponiendo que incluso sea posible crear índices en la vista ( detalles ). Entonces también puede aplicar la sugerencia NOEXPAND en sus consultas ( detalles ).
fuente
La respuesta genérica es echar un vistazo al plan de ejecución. ¿Están indexadas sus uniones? ¿Están incluidos sus campos de salida en esos índices? ¿Solo está generando las columnas que necesita ver?
fuente
Lo que probablemente haría, es crear 2 vistas
La primera vista es solo de los campos que necesito buscar; solo esos campos. Devolvería el campo de ID para cada fila, además de qué tipo de tabla está buscando. Hice algo similar al crear una vista UNION ALL que buscó en varias tablas. Solo me aseguré de incluir la identificación, el tipo y los campos de texto que quería buscar.
La segunda vista se encargaría de mostrar los resultados reunidos en la primera vista, y tendría todas las tablas que necesita para mostrar los resultados, o quizás en lugar de una vista, lo convierta en un procedimiento almacenado.
Haría UNION ALL, con GROUP BY en la parte inferior, y no haría todas esas UNIDADES EXTERIORES IZQUIERDAS.
fuente