【发布时间】:2010-02-03 21:45:48
【问题描述】:
如果我有一个生成多个列的视图:
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) 疯了?
【问题讨论】:
-
“跑得更好”是什么意思?你看过执行计划吗?它应该清楚地说明这一点。
-
在今天的特定示例中,我正在模拟带有视图的维度表。
-
@Mehrdad,不需要执行计划就知道视图会比 select 语句运行得更糟。
标签: sql-server performance views