2010-05-21 4 views
9

인덱스가 정의되지 않은 중간 크기의 SQL Server 기반 응용 프로그램이 있습니다. 신분증 열에도 없습니다. 적절한 분야에 대한 색인을 작성하여 더 나은 성능 (특히 데이터베이스가 커짐에 따라)을 얻을 수 있다고 적당히 비싼 애플리케이션 컨설턴트에게 제안했으며, 그는 말했다 :SQL Server에 인덱스를 추가하는 것이 나쁜 생각입니까?

"색인은 응용 프로그램 및 고객의 다른 영역에 큰 영향을 미칩니다. 어떤 상황에서도 그들을 만들면 안된다. "

아무도이 같은 것을 들어 본 적이 없습니까? 어떤 경우에 색인을 만들지 않는 상황이 있습니까?? 나는이 앱에 특별한 것이 아무것도 없다는 것을 볼 수있다. 그것은 int identity 컬럼, 많은 문자열 컬럼, 많은 관계형 테이블을 가지고 있지만, 볼 수있는 특별한 것이나 이상한 것은 없다.

감사합니다.

:

[편집 신원 열, 그들은 Management Studio를 사용하여 데이터베이스에서 찾고, 프로그램에서 설정 한 것 같다 "신원 사양"을 사용하지 않는, 나는 NO 인덱스 ... 찾을 수 있습니다]를 다음과 같은 회의에서 나는이 제품을 생산하는 회사의 CEO (및 수석 건축가)에게이 점에 관해 질문했다. 중소 규모 배포 환경에서 느낀 응답은 색인 관리와 관련된 오버 헤드가 전반적인 사용자에게 부정적인 영향을 미쳤다. 경험은 (응용 프로그램이 많은 쓰기를 수행함) 인덱스의 이점보다 훨씬 유리하지만 대규모 데이터베이스의 경우에는 인덱스를 작성합니다. 기술 지원 담당자는 지나치게 열정적이었고 그의 대답에별로 도움이되지 않았습니다. 신비가 풀렸다.

답변

3

나를 고용하면 색인이 생성됩니다. 14 년의 Sybase/SQL Server 경험을 통해 이러한 사실을 알게되었습니다! 색인. 귀하의 테이블에 각각 500 개 미만의 레코드가없는 경우.

내 생각은 인덱스 해시 노드가 약 1000

당신이 당신의 컨설턴트가 테이블을 정상화 여부를 위해 밖으로 볼 필요가 다른 것은 할 수있는 크기이다. 아마도이 테이블에는 하나 이상의 개념적 엔터티 또는 전체 12 개의 개념적 엔터티가 포함 된 500 개의 필드/열이 있습니다. 테이블에 개념적 엔티티가 12 개있는 경우 적어도 12 세트의 인덱스가 존재하기 때문에 인덱스 생성에 신경이 쓰이는 이유가 될 수 있습니다. 어떤 경우에도 그는 절대적으로 사실입니다.

그러나 그는 실제로 테이블 당 500 개의 열 또는 감지 가능하게 여러 개의 개념적 엔티티가있는 경우 매우 유감스럽게도 데이터 디자인 엔지니어입니다. 경험 많은 데이터 엔지니어와 일하는 내내, 우리 테이블은 거의 20 열을 넘지 않습니다. 낮은쪽에 5, 평균에 10. 성능 향상을 위해 때때로 테이블의 두 엔티티를 혼합하거나 행 발생을 테이블의 열로 가로 챌 수 있습니다.

교육받지 않은 눈으로 볼 수있는 테이블 디자인을 보면 Product, Project, BuildSheet, FloorPlan, Equipment 등의 모든 레코드가 하나의 긴 행에 롤백됩니다. 이러한 엔티티를 모두 하나의 테이블로 혼합 할 수는 없습니다.

그게 내가 색인을 가지고있는 것에 대해 조언 할 수있는 유일한 이유입니다.그가 그 일을하는 경우, 귀하는 자신의 데이터 설계 기술을 사기로 대표한다는 사실을 알아야하며 즉시 주간 계약 비용에서 그를 내 보내야합니다.

좋아, 래리의 글을 읽은 후 - 나는 그도 동의한다.

+0

많은 열이있는 테이블이 있지만 개념적 엔티티가 여러 개 포함되어 있지 않은 것 같습니다. 더 큰 테이블 (열 단위)에는 해당 테이블의 합리적인 그룹에있는 것 같은 많은 특성 데이터가 있습니다. – Aerik

+0

30 열의 좋은 테이블이라고 생각한 것을 보았습니다. 하지만 네 테이블은 약 5에 초점을 맞춘 포아송 분포를 따른다. – Joshua

0

id 열에 대한 색인이없는 것은 정말 이상한 소리가 들리며, 나는 매우 비린내가 난다는 것을 알지 못한다는 이유로 모든 정당성을 발견하게됩니다.

데이터베이스에 많은 양의 커밋을 수행하는 경우 더 많은 인덱스를 추가하면 삽입 속도에는 영향을 미치지 만 ID에는 인덱스가 적용되지 않는다는 점에 유의해야합니다. 와우.

여분의 색인을 추가하는 것이 문제를 일으킬 수있는 방법을 정확하게 정당화하는 것이 좋습니다.

3

여분의 디스크 공간이 있습니까? 인덱스가 테이블보다 많은 경우를 보았습니다.

그러나 색인이 전혀 존재하지 않습니다! 모든 읽기 조작이 전체 테이블을 필요로 할 때를 제외하고는 그럴 수 없습니다.

+0

우리는 충분한 디스크 공간이 있습니다. 그리고 우리의 경우는 매우 일반적입니다 : 큰 테이블, 그리고 읽기 작업은 일반적으로 특정 행을 찾거나 SELECT TOP ... ORDER BY 쿼리를 수행합니다. 그래서 전체 테이블을 읽지 않습니다. – Aerik

+0

사실 그것은 인덱스가 없습니다. 인덱스가 없으면 테이블 전체를 읽을 수만 있습니다. – TomTom

+1

SELECT TOP ... ORDER BY는 ORDER BY 열의 인덱스를 크게 활용합니다. – Joshua

2

키 제약 조건이있는 열은 어쨌든 암시 적 인덱스를 갖습니다. 따라서 기본 키로 항상 선택하는 경우 색인을 더 추가 할 필요가 없습니다. 다른 기준으로 선택하는 경우 쿼리중인 열에 인덱스를 추가하는 것이 좋습니다.

또한 데이터를 얼마나 많이 삽입 하느냐에 따라 다릅니다. 쿼리하는 것보다 자주 삽입하는 경우 인덱스를 최신 상태로 유지하는 오버 헤드로 인해 삽입 속도가 느려질 수 있습니다.

그러나 "어떤 상황에서도 [색인]을 만들면 안됩니다."라는 말은 조금 있습니다.

내가 추천하는 것은 쿼리를 사용하여 SQL Server Profiler 도구를 실행하는 것입니다. 이 도구는 성능에 가장 큰 영향을 줄 인덱스를 추가 할 것을 권장합니다.

+0

응용 프로그램이 쓰기보다 읽기쪽으로 많은 왜곡되어 있습니다. 조인을 사용하기보다는 개별 SELECT – Aerik

+0

SQL Server 프로파일 러 도구에 대해 조금 추가했습니다. –

+0

profiler 도구를 제안 해 주셔서 감사합니다. 전에 "손으로"최적화를 수행했습니다. 나는 컨설턴트의 권고에 반대 할 의지가 있는지에 관해서 진짜 문제가 될 것이라고 생각한다. 진정한 진화론자는 그가 응용 프로그램을 작성한 회사의 것입니다. – Aerik

0

색인이 많을수록 데이터 삽입 및 수정 속도가 느려집니다.적절한 경우 인덱스를 추가하고 해당 인덱스를 활용할 수있는 쿼리를 작성하십시오. 인덱스의 선택도가 낮아서 효과적으로 사용되지 않을 수도 있습니다.

1

대부분의 평범한 응용 프로그램 삽입 성능에 대한 색인의 영향은 약간의 문제가 아닙니다. 일반적으로 색인을 생성하는 편이 낫고 삽입 성능이 크게 떨어지면 (아마도 그렇지 않을 수도 있습니다) 다른 것을 시도 할 수 있습니다. 분명히 몇 가지 예외가 있습니다. 예를 들어 로깅에 사용되는 테이블과 같이 조심해야합니다.

위에서 언급 한 것처럼 디스크 공간이 문제가 될 수 있습니다.

무의미한 색인 (예 : 중복)을 만들면 마이크로 초를 낭비하게되고 때때로 쿼리 실행 계획이 잘못됩니다.

내가 본 다른 문제는 런타임에 데이터베이스의 일부를 생성하는 이상하게 코드가있는 타사 응용 프로그램과 관련되어 있으며 모르는 인덱스를 삭제하거나 질식시킬 수 있다는 것입니다.

그러나 대다수의 경우 신중하게 선택한 지수는 이익이됩니다.

3

특히 테이블 크기가 큰 INSERT 및 UPDATE 무거운 응용 프로그램에서는 오버 인덱싱과 같은 문제가 있습니다. 제목에 대한 질문에 대한 대답은 예입니다. 색인을 추가하는 것이 좋지 않을 수도 있습니다.

"SQL Server 데이터베이스에 인덱스가없는 것이 정상입니까?"라는 질문과는 다른 질문입니다. 대답은 데이터를 추가하지만 대량으로 추출하여 다른 데이터 저장소로 변환 한 후에 읽기만하는 "쓰기 전용"시스템으로 데이터베이스를 사용하지 않는 한 해당 데이터베이스에서 일부 인덱스가없는 것은 매우 드문 일입니다. 데이터 베이스.

귀하의 컨설턴트의 진술은 귀하가 귀하의 설명에서 중요한 정보를 남겨 둘 수 있다고 생각하도록 충분히 이상합니다. 그렇지 않다면 나는 그가 열매라고 말할 것입니다.

+0

실제로 그는 그가 눈부신 감독을 은폐하고있는 것으로 의심합니다. 그의 회사는 디자인에서 데이터베이스 인덱스와 같은 것을 놓친 것보다 오히려 우리에게 나쁜 조언을 주려고합니다. – Aerik

+0

그 또는 그는 총 바보입니다. 많은 프로젝트에서, 길이도 오브젝트 모델의 일부가 아니기 때문에 모든 필드를 텍스트 필드로 만드는 일부 총 bunkhead 데이터베이스 전문가 (ergo : 제품 번호와 같은 인덱싱 할 수없는 일들). 주위 사람들은 그 지역을 좋아하고 때로는 컨설턴트 로서도 마찬가지입니다. 슬프게도. – TomTom

+0

길이가 필요하다면 postgresql을 사용하여 varchar (2000000000)가 유효하고 색인 가능하며 varchar (100)가 필요한 경우 varchar (100) 이상을 들여야합니다. – Joshua

관련 문제