我有这个问题:
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分钟!!为什么需要这么长时间?
Plan01:
Plan02:
答案 0 :(得分:0)
第二种情况相当于:
SELECT TOP 1 * FROM (
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'
优化器可能没有意识到它可以将where子句应用于每个内部选择。相反,它创建整个表的并集,然后对结果进行全面扫描以应用where子句。