Если у меня есть представление, которое генерирует несколько столбцов:
CREATE VIEW dbo.foo AS
SELECT
id,
SUM(SELECT [...] ) AS c1,
STDEV(SELECT [...] ) AS c2,
AVG(SELECT [...] ) AS c3,
MIN(SELECT [...] ) AS c4,
MAX(SELECT [...] ) AS c5,
SUM(SELECT [...] ) AS c6,
[...]
COUNT(SELECT [...] ) AS cN,
FROM Table
GROUP BY id
Но в итоге я запрашиваю только одно из этих вычисленных значений:
SELECT id, c382
FROM foo
WHERE id = 42
Будет ли SQL Server вычислять все столбцызначения, только чтобы игнорировать их?
По моему опыту, ответ, кажется, "да".Запрос:
SELECT id, c382
FROM foo
WHERE id = 42
будет медленнее, чем я думаю.Если я нарушу абстракцию, дублируя нужный мне код:
SELECT id, c382
FROM (
SELECT
id,
MAX(SELECT [...] ) AS c382
FROM Table
GROUP BY id
) AS MiniView
WHERE id = 42
Запрос выполняется лучше.
Или, возможно, в более реальных конструкциях он начинает разваливаться:
SELECT bar.*, foo.384
FROM bar
INNER JOIN foo
ON bar.Bing = foo.id
WHERE bar.Reticulated = 'splines'
Я сумасшедший или SQL Server (2000) сумасшедший?