SQL Server 2005를 사용하여 지속적으로 들어오는 데이터 (초당 5-15 회 업데이트)를 추적합니다. 테이블 중 하나가 외설적 인 쿼리를 수행하기 시작한 지 2 개월 만에 프로덕션을 진행 한 후에 나타났습니다.큰 데이터 집합에 대해 SQL Server의 고유 쿼리가 느림
테이블은 3 열이 있습니다 - 일련 번호 (클러스터)
typeUUID
-
id
를 삽입이 발생하기 전에 GUID가 생성; 함께 유형typeName
그룹에 사용 - 우리가 실행하는 쿼리의
하나는 typeName
필드에서 구분된다 (... 대만족) 유형 이름 :
SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
typeName
필드의 클러스터되지 않은 비 고유 오름차순 인덱스가 있습니다. 이 테이블에는 현재 약 200M 개의 레코드가 있습니다. 우리가이 쿼리를 실행할 때 쿼리는 5m 58 초가 걸렸습니다! 아마도 우리는 인덱스가 어떻게 작동하는지 이해하지 못하고 있습니다 ... 그러나 나는 우리가 그들을 잘못 이해했다고 생각하지 않았습니다 그 많이. 내가 기대하는 것처럼,이 테이블을 스캔하는 것, 약 10 초
SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]
이 쿼리 반환 :
이 조금 더 테스트하기 위해, 우리는 다음 쿼리를 실행했습니다.여기에 누락 된 것이 있습니까? 첫 번째 쿼리가 왜 그렇게 오래 걸릴까요?
편집 : 아, 내 사과, 첫 번째 쿼리는 76 레코드를 반환, ninesided 감사합니다.
후속 조치 : 답장을 보내 주셔서 감사합니다. 지금은 나에게 더 의미가 있습니다. 인덱스가 없으면 인덱스가있는 200M 행의 테이블을 스캔하고 200M 행의 인덱스 스캔을 수행합니다 ...
SQL Server는 인덱스를 선호하며 약간의 성능 향상을 제공합니다 , 그러나 흥분하는 것을 아무것도. 색인을 다시 작성하면 질의 시간이 6m가 아닌 3m를 약간 넘는 수준으로 향상되었지만 충분하지는 않습니다. 상사에게 테이블 구조를 표준화 할 것을 권유합니다.
다시 한 번 도움을 주셔서 감사합니다.
일반적으로 몇 가지 고유 한 유형을 예상합니까? – ninesided
솔직히 말하면 디자인에 근본적인 결함이있는 것 같습니다. 200M 레코드가 "들어오는"테이블에 있습니까? 그들은 잠시 둘러 본 후 다른 곳으로 밀어 넣을 수 없습니까? 응용 프로그램을 이해하지 않고 더 나은 조언을하는 것은 힘들지만 심각한 리펙토링이 필요할 수도있는 것처럼 들립니다. – kquinn
네, 우리는 현재 4 개월 분량의 데이터를 다루고있는 많은 데이터를 보유하고 있습니다. 우리는 데이터를 분할 할 필요가있을 것입니다, 그러나 우리는 아직 거기에 도착하지 않았습니다. – Miquella