2009-10-09 8 views
1

나는 잠시 동안 SQL 서버를 사용해 왔으며 많은 쿼리를 미세 조정하기 위해 많은 성능 기술을 사용 해왔다. 대부분의 쿼리는 몇 초 내에 실행되거나 몇 분이 걸릴 수 있습니다.장기 실행 작업 성능 팁

저는 약 100K의 데이터를로드하고 약 10 시간 동안 실행하는 작업을하고 있습니다.

이러한 쿼리를 작성하거나 튜닝하는 동안 고려해야 할 사항은 무엇입니까? (예 : 메모리, 로그 크기, 기타 사항)

+1

100K 레코드에 대해 10 시간입니까? 응. 100,000 개의 레코드가 _nothing_입니다. –

+0

맞습니다. 사실 그 70K 기록. 제 일에는 복잡한 처리가 있습니다. 처음 1 시간 동안 18-20K 개의 레코드를 실행합니다. 그런 다음 무언가가 발생하고 나머지 50K는 실행하는데 약 9 시간이 걸립니다. 나는 아직도이 문제가 무엇인지 잘 모른다. 작은 배치로 실행하면 잘 작동하지만 원하는 것은 아닙니다. – BinaryHacker

+0

동일한 유형의 처리가 선형 적으로 느려지는 경우 프로파일 러를 실행하면 많은 것들 중에서 메모리 사용의 비효율을 의미 할 수 있습니다. –

답변

3

쿼리중인 열에 올바른 인덱스가 정의되어 있는지 확인하십시오.

+0

관련된 모든 테이블에 인덱스가 있습니다. 개별적으로 실행되는 쿼리는 잘 작동하지만 대량으로 실행될 때만 문제가 발생합니다. – BinaryHacker

+0

인덱스가 여전히 최신입니까? Server Management Studio의 인덱스 속성을보고 조각화 탭을 확인하십시오. 너무 세분화 된 인덱스를 다시 작성하십시오. – TLiebe

+0

감사합니다 TLiebe. 나는 그것을 확인했고, 그것을 다시 점검 할 것이다. 하지만 지금 당장 괴롭히는 것은 10K를 처리 할 때와 100K를 처리 할 때의 차이점입니다. 인덱스가 업데이트되지 않으면 10K 레코드를 처리 할 때 성능이 떨어집니다. – BinaryHacker

1

궁극적으로 병목 현상의 원인을 실제로 측정하고 발견하는 것이 가장 좋습니다. 스토어드 프로 시저에서 어떤 쿼리를 실행하는지 또는 코드에서 어떤 연산이 가장 오래 걸리는지 파악하고, 먼저 이들을 슬리밍하는 데 집중하십시오.

많은 수의 데이터베이스 레코드에 대해 Java에서 복잡한 비즈니스 로직을 수행하는 작업에서 지금 당장 비슷한 문제가 발생합니다. 나는 레코드를 일괄 적으로 처리하고 가능한 한 많은 로직을 단일 레코드에서 작동하는 대신 일괄 처리로 작동시키는 것이 핵심이라는 사실을 발견했습니다. 이렇게하면 데이터베이스 왕복이 최소화되므로 한 번에 하나의 레코드를 실행할 때보 다 특정 쿼리가 훨씬 효율적입니다. 배치 크기를 제한하면 Java 측에서 작업 할 때 서버 메모리가 부족하지 않게됩니다. 내가 Hibernate를 사용하고 있기 때문에 세션이 이전 배치에서 더 이상 필요하지 않은 객체의 복사본을 유지하지 못하도록 모든 배치 후에 session.clear()를 호출한다.

또한 RDBMS는 많은 양의 데이터로 작업 할 수 있도록 최적화되어 있습니다. 가능할 때마다 정상적인 SQL 조작을 사용하십시오. 커서와 많은 절차 프로그래밍을 피하십시오. 다른 사람들이 말했듯이 인덱스를 올바르게 설정했는지 확인하십시오.

+0

두 가지 추가 제안 사항 : SQL Server Management Studio에서 쿼리 실행 계획을보고 적절한 인덱싱으로 제거 할 수있는 테이블 검색을 찾아 쿼리가 가능한지 확인하십시오. 매우 큰 테이블로 작업하는 경우 인덱스 조각 모음을 시도하십시오. 참조 : http://updates.sqlservervideos.com/2009/09/power-up-with-sql-server-sql-server-performance.html – RMorrisey

1

쿼리를 보지 않고 말할 수는 없습니다. 색인을 가지고 있다고해서 사용 중이라는 것을 의미하지는 않습니다. 실행 계획을보고 사용 계획을 확인해야합니다. 그들은 실행 계획에 유용하지 않다는 것을 보여줄 수 있습니다.

예상 된 실행 계획을보고 시작할 수 있습니다. 작업이 실제로 완료되면 실제 실행 계획을 기다릴 수 있습니다. 매개 변수 스니핑을보십시오. 또한, 나는 SQL 서버 2005에서 매우 이상한 사건이 있었다 곳

SELECT * FROM l LEFT JOIN r ON r.ID = l.ID WHERE r.ID IS NULL 

것 완료되지, 아직

SELECT * FROM l WHERE l.ID NOT IN (SELECT r.ID FROM r) 

이 잘 작동 -하지만 특정 테이블. 문제가 해결되지 않았습니다.

통계가 최신인지 확인하십시오.

0

가능한 경우 여기에 검색어를 게시하여 살펴볼 항목이 있습니다. 나는 약 4 또는 1 백만 개의 레코드를 다루는 12 개의 다른 테이블에 조인을하여 작성한 쿼리를 회상합니다. 불필요한 조인을 제거하여 30 분 이내에 실행되도록 튜닝 할 수있었습니다. 가능한 경우 결과를 반환하기 전에 합류하는 데이터 집합을 줄이십시오. 필요한 경우 임시 테이블, 전망 등을 충분히 사용하십시오.

조건이있는 큰 데이터 집합의 경우 조인 전에보기를 통해 조건을 미리 적용하여 레코드 수를 줄이십시오. 100k에 합류하는 100k는 2k 합류보다 훨씬 큽니다. 3K

관련 문제