在视图中使用时,为什么此查询较慢?

时间:2013-10-11 15:13:14

标签: sql-server performance view

我有这个问题:

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

1 个答案:

答案 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子句。