【发布时间】:2014-03-04 22:55:51
【问题描述】:
这是视图的声明:
USE [calendar2014]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE view [dbo].[AdminRegisteredCards] WITH SCHEMABINDING as
SELECT ISNULL(ROW_NUMBER()
OVER (ORDER BY ta.CreatedOn, ta.ItemId), -1000) AS AdminRegisteredCardsId,
ta.ItemId,
ta.CardNumber,
ta.FirstName,
ta.LastName,
ta.Birthday,
ta.PostalCode,
ta.[Description],
ta.CardActivated,
ta.ContactInfo,
ta.PhoneNumber,
ta.ReceiveCalendarReminders,
ta.ReceiveGeneralMails,
ta.ReceivePrefStoreMails,
ta.CardStatus,
ta.SamoaCardId,
ta.CalendarUserId,
ta.LiveOpsRegistrantId,
ta.UseType,
ta.CreatedOn,
ta.ModifiedBy,
ta.ModifiedOn
from (
SELECT CalendarUser.CalendarUserId as ItemId,
SamoaCard.CardNumber,
SamoaCard.FirstName,
SamoaCard.LastName,
CalendarUser.Birthday,
CalendarUser.PostalCode,
RegisterSourceType.[Description],
CalendarUserCard.CardActivated,
CalendarUser.EmailAddress as ContactInfo,
CalendarUser.PhoneNumber,
CalendarUser.ReceiveCalendarReminders,
CalendarUser.ReceiveGeneralMails,
CalendarUser.ReceivePrefStoreMails,
CASE WHEN CalendarUserCard.CardDeactivated IS NOT NULL THEN 'Deactivated' ELSE 'Activated' END AS CardStatus,
SamoaCard.SamoaCardId,
CalendarUser.CalendarUserId,
null as LiveOpsRegistrantId,
SamoaCard.CreatedOn,
'C' as UseType,
CalendarUser.ModifiedBy,
CalendarUser.ModifiedOn
FROM dbo.CalendarUser CalendarUser
INNER JOIN dbo.RegisterSourceType RegisterSourceType
ON CalendarUser.RegisterType = RegisterSourceType.RegisterType
INNER JOIN dbo.CalendarUserCard CalendarUserCard
ON CalendarUserCard.CalendarUserId = CalendarUser.CalendarUserId
INNER JOIN dbo.SamoaCard SamoaCard
ON CalendarUserCard.SamoaCardId = SamoaCard.SamoaCardId
UNION ALL
SELECT LiveOpsRegistrant.LiveOpsRegistrantId as ItemId,
LiveOpsRegistrant.CardNumber,
'Registered' as FirstName,
'Card' as LastName,
LiveOpsRegistrant.Birthday,
null as PostalCode,
'LiveOps' as Description,
LiveOpsRegistrant.CreatedOn as CardActivated,
LiveOpsRegistrant.PhoneNumber as ContactInfo,
LiveOpsRegistrant.PhoneNumber,
CONVERT(bit,0) as ReceiveCalendarReminders,
CONVERT(bit,0) as ReceiveGeneralMails,
CONVERT(bit,0) as ReceivePrefStoreMails,
'Activated' AS CardStatus,
SamoaCard.SamoaCardId,
null as CalendarUserId,
LiveOpsRegistrant.LiveOpsRegistrantId,
SamoaCard.CreatedOn,
'L' as UseType,
SamoaCard.ModifiedBy,
SamoaCard.ModifiedOn
FROM dbo.LiveOpsRegistrant LiveOpsRegistrant
INNER JOIN dbo.SamoaCard SamoaCard
ON LiveOpsRegistrant.CardNumber = SamoaCard.CardNumber
) ta;
目前此视图需要非常很长时间才能访问 - 我们有大约 140 万条记录。
有没有办法优化这个视图?
【问题讨论】:
-
@SaUce - 这不太准确。嵌套子查询有可能成为问题。如果 OP 使用的是新版本的 SQL Server,公用表表达式可能会有所帮助。
-
@JustinNiessner:是的,我使用的是 MSSQL 2012。
-
JOIN ON子句上的额外括号不是必需的,可能会有点混乱。为什么要将ISNULL与ROW_NUMBER()一起使用? -
不是我格式化了你的代码,而是更容易看到子选择和额外的括号
-
@Serg NickyvV 正在谈论基础表。他们肯定有架构和索引...
标签: sql-server tsql view sql-server-2012 query-optimization