【发布时间】:2013-10-11 15:13:14
【问题描述】:
我有这个问题:
SELECT * FROM
(
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES1..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES2..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES3..TVPHONES
) q
WHERE ID_CARD = 'B5XXXXXXX'
此查询需要 0.03 秒才能完成,但如果我将其转换为视图并执行相同的搜索:
ALTER VIEW [dbo].[BTPHONES]
AS
SELECT * FROM
(
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES1..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES2..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES3..TVPHONES
) q
GO
-- ------------------------
SELECT TOP 1 * FROM dbo.BTPHONES
WHERE ID_CARD = 'B5XXXXXXX'
大约需要 3 分钟!为什么需要这么长时间?
计划01:
计划02:
【问题讨论】:
-
你对比过实际的执行计划吗?
-
我运行了 CTRL + L。在第一种情况下,大部分查询的成本为 0%。相比之下,在第二种情况下,成本从 40% 到 60% 不等
-
@csotelo 您应该将其发布为答案
-
另外,查询是不等价的 - 顶部只返回所有结果,底部必须选择任意 TOP 1。为什么使用没有 ORDER BY 的 TOP 1?
-
添加
TOP 1可以大大改变计划(鼓励嵌套循环等非阻塞运算符)
标签: sql-server performance view