Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'interrogation des vues est-elle plus lente que l'exécution d'une seule requête ?

Alors que dans votre exemple simple, les choses seront les mêmes, une certaine prudence est nécessaire avec l'utilisation de vues imbriquées.

J'ai travaillé sur un système où les requêtes expiraient après 30 secondes, construit sur environ 6 niveaux de vues imbriquées et j'ai réussi à les accélérer d'un facteur d'environ 100 en réécrivant les requêtes sur les tables de base.

Un exemple simple du type de problème qui peut survenir est présenté ci-dessous.

CREATE VIEW MaxTypes
AS
SELECT
  [number],
  MAX(type) AS MaxType
  FROM [master].[dbo].[spt_values]
GROUP BY [number]

GO

CREATE VIEW MinTypes
AS
SELECT
  [number],
  MIN(type) AS MinType
  FROM [master].[dbo].[spt_values]
GROUP BY [number]

GO
SET STATISTICS IO ON

SELECT     MaxTypes.number, MinTypes.MinType, MaxTypes.MaxType
FROM         MinTypes INNER JOIN
                      MaxTypes ON MinTypes.number = MaxTypes.number
ORDER BY MaxTypes.number

/*
Gives

Table 'spt_values'. Scan count 2, logical reads 16, physical reads 0, 
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
*/
GO

SELECT 
  [number],
  MAX(type) AS MaxType,
  MIN(type) AS MinType
  FROM [master].[dbo].[spt_values]
GROUP BY [number]
ORDER BY  [number]

/*
Gives

Table 'spt_values'. Scan count 1, logical reads 8, physical reads 0, 
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
*/