下面是該視圖的聲明:有什麼辦法可以加速這個MSSQL 2012視圖?
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. – sergserg
'JOIN ON'子句中的額外括號不是必需的,可能有點混淆。你爲什麼要用'ROW_NUMBER()'使用'ISNULL'? – NickyvV