2009-09-23 5 views
1

나는 이와 같은 질의를 생성하는 nhibernate 질의를 가지고있다. I는 EMPLOYEE WHERE EMPLOYEE.NAME = @ P1 AND MANAGER_ID AND IN (@ P2, P3 @ @ @ P4 ... PN) 등등에서 예시적인 시나리오를NHibernate 질의 최적화

SELECT ID 추출 하였다.

NHprofiler를 사용하여 쿼리에 약 500ms 걸리는 것으로 나타났습니다. 표에는 name 및 manager_id에 대한 색인이 있습니다. 종업원 수는 약 600 만 레코드입니다.

쿼리에 manager_id 내에서 검색 할 레코드가 하나만있는 경우 (예 : EMPLOYEE.NAME = @ P1 AND MANAGER_ID AND IN (@의 P2)는, 쿼리가 약 2 초에 완료 EMPLOYEE FROM

SELECT ID.

따라서이 쿼리는 최종 쿼리를 사용하고 @n 번 (n - pn 수) 쿼리를 실행하여 나눕니다. 그러나 각 쿼리의 성능은 최대 400ms 이상이됩니다.

동등한 StoredProc가의 거기 훨씬 빠르게 수행

내가 여기에 놓친 거지 뭔가가 있나요 .. (다음 관리자 ID 나무를 찾기위한 조건이 있다면이있는)?

감사합니다.

+0

적절한 DB 인덱스를 설정 했습니까? –

+0

예 .. sp와 nhibernate가 타격을 가하는 그 동일한 db ..! – bkhanal

답변

0

생각 ...

  • IN이 당신이 인덱스 스캔이 때문에 등을 ..OR..OR..OR을 평가합니다. 이 사람이 범인이야.

  • 키 조회를 피하기 위해 색인을 "포함"합니까?

  • 두 가지 방법으로 색인을 작성하면 어떤 차이가 있습니까? 나는 둘 다 너무 최적화가 최선의 선택할 수 있습니다 제안을 가지는 것 (통계에 따라, 기수 등)이 같은

:

CREATE INDEX IX_MN ON EMPLOYEE (MANAGER_ID, NAME) INCLUDE (ID) 
CREATE INDEX IX_NM ON EMPLOYEE (NAME, MANAGER_ID) INCLUDE (ID) 
  • 당신은 UNION/UNION ALL로 다시 쓸 수 있습니까? 이 같은

:

SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p2 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p3 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p4 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p5 
UNION ALL 
.... 
  • 마 @ P1과 P2 @ .. @ PN 열 데이터 유형 정확히 일치?

  • SP의 모습은 무엇입니까?