Select distinct c.classID, co.fCourseName as CourseName, StreetAddress + ', ' + l.City as LocationAddress, s.SessionName, sh.fShift as shift, StartTime, EndTime, c.classname, s.SessionID,
c.StartDate,c.enddate
From dbo.vw_Class c
Inner Join dbo.lk_Session s
On (s.SessionID = c.sessionID)
Inner Join dbo.lk_Course co
On (co.CourseID = c.CourseID )
Inner Join dbo.vw_Location l
On (l.locationid = c.locationid)
Inner Join lk_District d
On (d.districtID = c.districtId)
Inner Join lk_Province p
On (p.provik = d.provik)
Inner Join lk_Shift sh
On (c.shiftid = sh.shiftid)
where
c.DistrictID = case when @Districtid is null then c.DistrictID else @Districtid end
and c.LocationID = case when @locationid is null then c.LocationID else @locationid end
and s.SessionID = case when @sessionid is null then s.SessionID else @sessionid end
and c.CourseID = case when @levelid is null then c.CourseID else @levelid end
and c.ShiftID = case when @shiftid is null then c.ShiftID else @shiftid end
and c.StartDate >= case when @startdate is null then c.StartDate else @startdate end
and c.EndDate <= case when @enddate is null then c.EndDate else @enddate end
and convert(time,c.StartTime) >= case when @starttime is null then convert(time,c.StartTime) else convert(time,@starttime) end
and convert(time,c.endtime) <= case when @endtime is null then convert(time,c.endtime) else convert(time,@endtime) end
and c.Monday = case when @day1 = 'N' then c.monday else @day1 end
and c.Tuesday = case when @day2 = 'N' then c.Tuesday else @day2 end
and c.Wednesday = case when @day3 = 'N' then c.Wednesday else @day3 end
and c.Thursday = case when @day4 = 'N' then c.Thursday else @day4 end
and c.Friday = case when @day5 = 'N' then c.Friday else @day5 end
and c.Saturday = case when @day6 = 'N'then c.Saturday else @day6 end
and c.Sunday = case when @day7 = 'N' then c.Sunday else @day7 end
and c.RowStatus = 'A'
ORDER BY co.fCourseName, s.SessionID ,c.ClassName
在上面的代码中,我需要为哪些列创建索引。(此查询中使用的所有表都没有创建主键或索引)
答案 0 :(得分:1)
首先,这是你的sql查询格式,在我公司确定。 我将过滤器从案例(不可移动)替换为&#34;或&#34;。
SELECT DISTINCT
[c].[classID]
, [co].[fCourseName] as [CourseName]
, [StreetAddress] + ', ' + [l].[City] as [LocationAddress]
, [s].[SessionName]
, [sh].[fShift] as [shift]
, [StartTime]
, [EndTime]
, [c].[classname]
, [s].[SessionID]
, [c].[StartDate]
, [c].[enddate]
FROM
[dbo].[vw_Class] as [c]
INNER JOIN
[dbo].[lk_Session] as [s] ON [s].[SessionID] = [c].[sessionID]
INNER JOIN
[dbo].[lk_Course] as [co] ON [co].[CourseID] = [c].[CourseID]
INNER JOIN
[dbo].[vw_Location] as [l] ON [l].[locationid] = [c].[locationid]
INNER JOIN
[lk_District] as [d] ON [d].[districtID] = [c].[districtId]
INNER JOIN
[lk_Province] as [p] ON [p].[provik] = [d].[provik]
INNER JOIN
[lk_Shift] as [sh] ON [c].[shiftid] = [sh].[shiftid]
WHERE
(
[c].[DistrictID] = @Districtid
OR
@Districtid IS NULL
)
AND
(
[c].[LocationID] = @locationid
OR
@locationid IS NULL
)
AND
(
[s].[SessionID] = @sessionid
OR
@sessionid IS NULL
)
AND
(
[c].[CourseID] = @levelid
OR
@levelid IS NULL
)
AND
(
[c].[ShiftID] = @shiftid
OR
@shiftid IS NULL
)
AND
(
[c].[StartDate] >= @startdate
OR
@startdate IS NULL
)
AND
(
[c].[EndDate] <= @enddate
OR
@enddate IS NULL
)
AND
(
convert(time, [c].[StartTime]) >= @starttime
OR
@starttime IS NULL
)
AND
(
convert(time, [c].[endtime]) <= @endtime
OR
@endtime IS NULL
)
AND
(
convert(time, [c].[endtime]) <= @endtime
OR
@endtime IS NULL
)
AND
(
[c].[Monday] = @day1
OR
@day1 = 'N'
)
AND
(
[c].[Tuesday] = @day2
OR
@day2 = 'N'
)
AND
(
[c].[Wednesday] = @day3
OR
@day3 = 'N'
)
AND
(
[c].[Thursday] = @day4
OR
@day4 = 'N'
)
AND
(
[c].[Friday] = @day5
OR
@day5 = 'N'
)
AND
(
[c].[Saturday] = @day6
OR
@day6 = 'N'
)
AND
(
[c].[Sunday] = @day7
OR
@day7 = 'N'
)
AND
[c].[RowStatus] = 'A'
ORDER BY
[co].[fCourseName]
, [s].[SessionID]
, [c].[ClassName]
在你的问题的答案中,你需要索引所有字段,其中一个用于连接(如[sessionID],[CourseID]等)。
您无法始终在视图上使用索引,但如果可以,请根据重复值在字段上创建索引。我使用了下一个规则 - &#34;如果某些列中的值重复超过10%,我们可以在过滤器中使用它 - 创建索引&#34;。