2013-10-11 70 views
0

我有这个疑问:为何在查看中使用此查询时速度较慢?

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:

Plan 01

Plan02:

Plan 02

+7

比较实际执行计划吗? –

+0

我运行了CTRL + L.在第一种情况下,查询的大部分部分的成本为0%。相反,在第二种情况下,成本从40-60%变化到 – csotelo

+0

@csotelo您应该将其作为回答发布 – Kermit

回答

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子句t o每个内部选择。相反,它会创建整个表的联合,然后对结果执行全面扫描以应用where子句。