actually I'm still on 1.9.4, can't upgrade easily here due to server access.
I modified yaf_forum_moderators to restrict the views before union and brought the time down from ~45s to < 1s as below:
select
ForumID = a.ForumID,
ModeratorID = a.GroupID,
ModeratorName = b.Name,
IsGroup=1
from
[dbo].[yaf_ForumAccess] a WITH(NOLOCK)
INNER JOIN [dbo].[yaf_Group] b WITH(NOLOCK) ON b.GroupID = a.GroupID
INNER JOIN [dbo].[yaf_AccessMask] c WITH(NOLOCK) ON c.AccessMaskID = a.AccessMaskID
where
(b.Flags & 1)=0 and
(c.Flags & 64)<>0
union all
select
ForumID = access.ForumID,
ModeratorID = usr.UserID,
ModeratorName = usr.Name,
IsGroup=0
from
[dbo].[yaf_User] usr WITH(NOLOCK)
INNER JOIN (
select
UserID = a.UserID,
ForumID = x.ForumID,
ModeratorAccess = MAX(ModeratorAccess)
from
(
SELECT UserID, ForumID, MAX(ReadAccess) AS ReadAccess, MAX(PostAccess) AS PostAccess, MAX(ReplyAccess) AS ReplyAccess, MAX(PriorityAccess) AS PriorityAccess,
MAX(PollAccess) AS PollAccess, MAX(VoteAccess) AS VoteAccess, MAX(ModeratorAccess) AS ModeratorAccess, MAX(EditAccess) AS EditAccess, MAX(DeleteAccess)
AS DeleteAccess, MAX(UploadAccess) AS UploadAccess, MAX(DownloadAccess) AS DownloadAccess, MAX(AdminGroup) AS AdminGroup
FROM
(
SELECT UserID, ForumID, ReadAccess, PostAccess, ReplyAccess, PriorityAccess, PollAccess, VoteAccess, ModeratorAccess, EditAccess, DeleteAccess,
UploadAccess, DownloadAccess, AdminGroup
FROM dbo.yaf_vaccess_user AS b where ModeratorAccess <> 0 AND AdminGroup = 0
UNION ALL
SELECT UserID, ForumID, ReadAccess, PostAccess, ReplyAccess, PriorityAccess, PollAccess, VoteAccess, ModeratorAccess, EditAccess, DeleteAccess,
UploadAccess, DownloadAccess, AdminGroup
FROM dbo.yaf_vaccess_group AS b where ModeratorAccess <> 0 AND AdminGroup = 0
UNION ALL
SELECT UserID, ForumID, ReadAccess, PostAccess, ReplyAccess, PriorityAccess, PollAccess, VoteAccess, ModeratorAccess, EditAccess, DeleteAccess,
UploadAccess, DownloadAccess, AdminGroup
FROM dbo.yaf_vaccess_null AS b where ModeratorAccess <> 0 AND AdminGroup = 0
) AS access
GROUP BY UserID, ForumID
) as x
INNER JOIN [dbo].[yaf_UserGroup] a WITH(NOLOCK) on a.UserID=x.UserID
INNER JOIN [dbo].[yaf_Group] b WITH(NOLOCK) on b.GroupID=a.GroupID
WHERE
ModeratorAccess <> 0 AND x.AdminGroup = 0
GROUP BY a.UserId, x.ForumID
) access ON usr.UserID = access.UserID
where
access.ModeratorAccess<>0
order by
IsGroup desc,
ModeratorName asc