Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

L'interrogazione sulle viste è più lenta dell'esecuzione di una query?

Mentre nel tuo semplice esempio le cose saranno le stesse, è necessaria una certa cautela con l'utilizzo di viste nidificate.

Ho lavorato su un sistema in cui le query scadevano dopo 30 secondi basato su circa 6 livelli di viste nidificate e sono riuscito a velocizzarle di un fattore di circa 100 riscrivendo le query sulle tabelle di base.

Di seguito un semplice esempio del tipo di problema che può sorgere.

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.
*/