2012-04-15 2 views
1

우리는 ASP.NET MVC 3 응용 프로그램 용 사용자 정의 관리 페이지를 작성하고 있으며 사용자는 aspnet "응용 프로그램 서비스"데이터베이스에서 얼마나 오래 걸리는지에 놀랐습니다.ASP.NET 회원 데이터베이스 및 성능

내장 된 Membership.GetAllUsers() 메서드는 매우 느리지 만 각 사용자에 대해 많은 양의 정보를 가져 오기 때문에 당연히 그렇게 느립니다. 우리는 aspnet db 위에 SQL 계층에 LINQ를 던지고 LINQ를 사용하여 자체 쿼리를 작성하기로 결정했습니다. 모든 것을 가져 오는 대신 몇 열만 가져옵니다.

결과가 더 좋지만 여전히 표준 방법으로 120 명 이상의 사용자를 가져 오는 데 약 30 초가 걸립니다. 우리의 커스텀 쿼리로 9 초가 걸렸다.

150 행 9 초가 거대 해 보입니다. 왜 그렇게 오래 걸리는 지 아십니까?

편집 여기에 뭔가 돌아 구초을 소요하는 방법의 예 :

public static List<LightMembershipUser> GetUsersInRole(string roleName) { 
     //Find the role 
     var roleId = (from role in db.Roles 
         where roleName == role.RoleName 
         select role.RoleId) 
         .First(); 
     if (roleId==null){ return null; } 

     var res = from u in db.Users 
        join ur in db.UsersInRoles on u.UserId equals ur.UserId 
        join m in db.Memberships on u.UserId equals m.UserId 
        where ur.RoleId==roleId 
        select new LightMembershipUser { UserName = u.UserName, CreationDate = m.CreateDate, Email = m.Email, Roles = Roles.GetRolesForUser(u.UserName) }; 
     return res.ToList(); 
    } 
+0

콜드 스타트 ​​또는 이미 실행중인 응용 프로그램 풀에서 측정 했습니까? – jgauffin

+0

@jgauffin : 그랬어. – guidupuy

+1

Molesere Man이 제안한 것처럼 'Roles = Roles.GetRolesForUser (u.UserName)'비트가 150 개의 쿼리를 수행한다는 것을 의미하지 않습니까? 생성 된 SQL을 보셨습니까? –

답변

1

느린 액세스를 유발하는 회원 시스템에는 특별한 것이 없으며 30 초 안에 120 명의 사용자가 전형적인 것이어야합니다. 회원 자격은 데이터베이스에있는 테이블 세트 일뿐입니다. 그런 식으로 설정하지 않으면 별도의 데이터베이스가 아닙니다. 그들은 단지 행에 불과합니다.

분명히 데이터베이스 서버에 문제가 있습니다. 서버가 느린 경우에도 마이크로 초 단위로 150 개의 행을 반환 할 수 있어야합니다. 질문에 질문을 포함 시키려 할 수도 있습니다. 아마도 당신이 잘못하고있는 것이기 때문입니다.

잠깐 .. 150 가지 검색어를 사용하고 계십니까? 또는 150 개의 레코드를 반환하는 하나의 쿼리? 분명히 Membership API는 한 번에 여러 사용자를 반환 할 수있는 방법이 없기 때문에 Membership을 사용하는 경우 150 명의 사용자를 얻으려면 150 개의 쿼리를 수행해야합니다. 그러나 자신의 쿼리는 원하는만큼의 행을 처리 할 수 ​​있어야합니다.

+0

그것을 알아 냈습니다. 그'Roles = Roles.GetRolesForUser (u.UserName)'호출은 발견 된 각 레코드에 대한 개별 데이터베이스 쿼리를 트리거합니다. 그래서 네, 결국 150 개의 쿼리를하고 있습니다. 바보 야. – guidupuy

-1

난 당신이 오히려 자신의 데이터베이스와 수업을 전혀 ASPNET 데이터베이스를 사용하지 않는 것이 좋습니다을 그 MembershipProviderRoleProvider을 확장하십시오.

검색어를 제공해 줄 수 있습니까?