First, try changing the AND EXISTS reference to inner joins (the same logical equivalent).SELECT *FROM albumWHERE userid = 1 AND (EXISTS (SELECT referenceid FROM inclusion_reference inner join inclusion_user on inclusion_reference.inclusionid = inclusion_user.inclusionid WHERE inclusion_reference.referenceid = album.id and inclusion_user.userid = @EditingUserId) OR EXISTS (SELECT referenceid FROM inclusion_reference WHERE referenceid = album.id AND inclusionid = @PublicInclusionId) OR EXISTS (SELECT referenceid FROM inclusion_reference inner join user_friends on user_friends.userid = album.userid WHERE referenceid = album.id AND inclusionid = @FriendsInclusionId and user_friends.targetid = @EditingUserID) OR album.userid = @EditingUserId OR @editingUserIsAdmin = 1)
Then, try changing to a UNION querySELECT album.*FROM album inner join inclusion_reference on album.id = inclusion_referenceid inner join inclusion_user on inclusion_reference.inclusionid = inclusion_user.inclusionidWHERE userid = 1 and inclusion_user.userid = @EditingUserIdUNIONselect album.* inner join inclusion_reference on album.id = inclusion_referenceidfrom albumWHERE userid = 1 and inclusion_reference.inclusionid = @PublicInclusionIdUNIONselect album.* inner join inclusion_reference on album.id = inclusion_referenceid inner join user_friends on user_friends.userid = album.useridfrom albumWHERE userid = 1 and inclusion_reference.inclusionid = @FriendsInclusionId and user_friends.targetid = @EditingUserIDUNIONselect album.*from albumwhere album.userid = @EditingUserId OR @editingUserIsAdmin = 1
And of course, make sure your data is indexed properly.e4 d5 xd5 Nf6