I'm no DBA and I'm out of ideas on optimizing this query. It's taking roughly 40+ seconds to run. Any glaring newbie mistakes where I could optimize?
USE [deskcal2014]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[proc_AdminRegisteredCards]
(
@Take AS INT,
@Skip AS INT,
@FilterColumn AS NVARCHAR(max),
@FilterOrder AS NVARCHAR(max))
AS
BEGIN
SELECT TOP(@Take)
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)
ORDER BY
case when @FilterColumn = 'FirstName' and @FilterOrder = 'ASC'
then CalendarUser.Firstname end asc,
case when @FilterColumn = 'FirstName' and @FilterOrder = 'DESC'
then CalendarUser.Firstname end desc,
case when @FilterColumn = 'LastName' and @FilterOrder = 'ASC'
then CalendarUser.Lastname end asc,
case when @FilterColumn = 'LastName' and @FilterOrder = 'DESC'
then CalendarUser.Lastname end desc,
case when @FilterColumn = 'CardNumber' and @FilterOrder = 'ASC'
then CalendarUser.CardNumber end asc,
case when @FilterColumn = 'CardNumber' and @FilterOrder = 'DESC'
then CalendarUser.CardNumber end desc,
case when @FilterColumn = 'Birthday' and @FilterOrder = 'ASC'
then CalendarUser.Birthday end asc,
case when @FilterColumn = 'Birthday' and @FilterOrder = 'DESC'
then CalendarUser.Birthday end desc,
case when @FilterColumn = 'Description' and @FilterOrder = 'ASC'
then RegisterSourceType.[Description] end asc,
case when @FilterColumn = 'Description' and @FilterOrder = 'DESC'
then RegisterSourceType.[Description] end desc,
case when @FilterColumn = 'ContactInfo' and @FilterOrder = 'ASC'
then CalendarUser.EmailAddress end asc,
case when @FilterColumn = 'ContactInfo' and @FilterOrder = 'DESC'
then CalendarUser.EmailAddress end desc,
case when @FilterColumn = 'CardActivated' and @FilterOrder = 'ASC'
then CalendarUserCard.CardActivated end asc,
case when @FilterColumn = 'CardActivated' and @FilterOrder = 'DESC'
then CalendarUserCard.CardActivated end desc,
case when @FilterColumn = 'PostalCode' and @FilterOrder = 'ASC'
then CalendarUser.PostalCode end asc,
case when @FilterColumn = 'PostalCode' and @FilterOrder = 'DESC'
then CalendarUser.PostalCode end desc
OFFSET @Skip ROWS -- skip N rows
FETCH NEXT @Take ROWS ONLY
union all
SELECT TOP(10)
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
END
GO