2009-03-10 3 views
3

약 400 000 개의 레코드가 들어 있고 인트라넷 웹 사이트의 홈페이지에서 호출되는 테이블이 있습니다. 성수기에는 300-400 명의 동시 사용자를 보유 할 수 있습니다. SQL 프로필러 도구는 다음과 같은 결과를 제공합니다.SQL 서버 쿼리 응답 시간 개선

  • CPU : 406
  • 읽고 : 32,446
  • 기간 : 나는 '어디에'조항에 포함 된 필드를 색인을 397

. 응답 시간을 더 향상시킬 수있는 방법이 있습니까?

디스크 읽기를 줄이기 위해 수행해야 할 작업은 무엇입니까?

서버 구성 : Windows 2003 64 비트, SQL Server 2005 64 비트 SP2, .NET 2.0.

아래에 쿼리 및 테이블 정의가 추가되었습니다. 여기 내가 단순화를 위해 여기에 추가하지 않은 40 개의 필드가 더 있습니다. 대부분 varchar 인 필드는 where 절에서 사용되지 않습니다. 그들은 단지 페이지에 나타납니다. 현재 사용되지 않는 일부 필드 (5-6)가 있지만 나중에 필요할 것이기 때문에 쿼리에 남겨 두었습니다. 나는 지금 그 (것)들을 벗어야 하는가? 응답 시간을 향상시킬 수 있습니까?

쿼리

SELECT 
    u.[PeopleKey], 
    u.[EnterpriseId], 
    u.[PersonnelNbr], 
    u.LastName, 
    u.FirstName, 
    u.MiddleName,  
    cc.WorkForceCd AS CareerCounselorWorkForceCd,      
    cc.WorkForceDesc AS CareerCounselorWorkForceDesc,      
    cc.WorkGroupCd AS CareerCounselorWorkGroupCd,     
    cc.WorkGroupDesc AS CareerCounselorWorkGroupDesc,     
    cc.CareerLevelCd As CareerCounselorCareerLevelCd,    
    cc.CareerLevelDesc AS CareerCounselorCareerLevel,    
    CL.NextLevelCD as nextCareerLevelCd 
FROM 
    [User] u 
    LEFT JOIN [User] cc ON 
     u.[CareerCounselorPeopleKey] = cc.PersonnelNbr 
    Left JOIN [CareerLevel] CLON 
     u.WorkForceCd= CL.WorkForceCd AND 
     u.CareerLevelCd = CL.LevelCd 
WHERE 
    u.PeopleKey = <integer> 

[CareerLevel]

ID int 4 [Primary Key - clustered index] 
Description varchar 150 
WorkforceCd varchar 4 
LevelCD varchar  10 
NextLevelCD varchar 10 

[사용자]

PeopleKey int 4 [Primary Key - clustered index] 
EnterpriseId varchar 50 [non clustered index] 
PersonnelNbr varchar 8 [non clustered index] 
FirstName varchar 40 
LastName varchar 40 
MiddleName varchar 40 
CareerCounselorPeopleKey int 4 
CareerCounselorPersonnelNbr varchar 8 
CareerCounselorName varchar 50 
CapabilityCd varchar 5 
CapabilityDesc varchar 25 
WorkforceCd varchar 4 
WorkForceDesc varchar 40 
WorkGroupCd varchar 4 
WorkGroupDesc varchar 50 
CareerLevelCd varchar 10 
CareerLevelDesc varchar 50 
+0

테이블 정의를 게시하시기 바랍니다 ...도 색인화해야하며, SQL 쿼리 –

+0

은 매우 도움이 될 것입니다, 동의했다. –

+0

와우 :) 고마워요, 당신의 반응 그 자체가 저에게 많이 생각해 줬습니다. 나는 몇 분 안에 테이블 정의와 쿼리를 게시 할 것이다. – user20358

답변

1

테이블 스키마와 인덱스 정의를 게시 할 수 있습니까? 너는 무엇을 묻는가?

읽기의 양은 대량 I/O 작업을 암시합니다. 테이블 및 인덱스 설정 및/또는 쿼리 방법으로 인해 인덱스가 있어도 사용되지 않고 있습니다.

정기적으로 데이터베이스에서 유지 관리 계획을 실행합니까? 예 : 인덱스 조각화가 너무 높아지면 인덱스가 재구성되거나 재구성됩니까?

항상 SQL의 Database Tuning Advisor를 사용하여 특정 쿼리를 최적화하는 방법에 대한 힌트를 얻을 수 있습니다. SQL Trace를 사용하여 실제 사용 데이터를 수집하고 잠재적인 튜닝 단계를 분석 할 수 있습니다. 마크

0

얼마나 큰 당신의 DB 및 방법 그 상자에 많은 RAM이 있습니까?

'where'절과 관련된 필드에 인덱스가있는 것은 ... where 절의 컬럼과 동일한 순서로 설정된 인덱스 컬럼입니까?

SQL 관리 스튜디오에서 쿼리 실행 계획을 실행하면 모든 테이블 스캔 (검색을 원함)이 표시됩니다. 검사가 표시되면 누락 된 색인이 될 수 있습니다.

기본 키/클러스터형 인덱스 란 무엇입니까? 클러스터 된 인덱스를 사용하도록 조회를 전환 할 수 있습니까? 이것은 항상 귀하의 데이터에 대한 가장 빠른 경로입니다.

희망 하시겠습니까?

+0

안녕하세요 이안, 회신 주셔서 감사합니다 :) "인덱스 열은 where 절 열과 같은 순서로 설정됩니다" 어떻게 영향을 줍니까? – user20358

0

SQL Server Performance Dashboard를 살펴 보자. 명백한 문제가있는 경우 해당 문제가 표시됩니다.

또한 쿼리 실행 계획을 분석하지 않고 인덱스 만 추가하면 안됩니다.

+0

고마워, 나는이 도구가 존재한다는 것을 알지 못했다. 확실히 살펴볼 것이다. –

0

왼쪽에 합류 -이 모든 열 : ON u. [CareerCounselorPeopleKey] = cc.PersonnelNbr 왼쪽 JOIN [CareerLevel] CL ON u. WorkForceCd = CL. WorkForceCd 및 u. CareerLevelCd = CL. LevelCd

WHERE 절과 마찬가지로 ON 절은 분명한 키 관계를 나타냅니다.

그래서 지방 표시된 열은