2010-01-14 2 views
3

나는 충분히 이론을 알고 있다고 생각하고 싶지만 실제 세계에서 DB를 최적화하는 경험은 거의 없습니다. 나는 관점, 생각 또는 경험에 대해 알고 싶습니다.인덱스, 기본 키, 고유 키에 대한 세부 정보

의이 같은 시나리오를 가정 해 봅시다 :

표 A 키 : C1, C2, C3, C4 지수 : C7, C3, C2

표 B 키 : C1, C2, C3, C4 색인 : c1, c5

모두 클러스터되지 않습니다. 테이블에 40 개 이상의 필드가 있습니다. 그들은 하루 종일 먹이를 먹으며 하루 동안 약간의 업데이트가 있습니다.

표 A를 참조하십시오. 인덱스보다 키로 많은 쿼리가 도움이 될 경우 인덱스가 부정적인 영향을 줄 수 있습니까? 삽입/삭제는 1 대신에 2 개의 인덱스를 업데이트해야하기 때문에

표 B에는 인덱스에 키에없는 추가 필드가 있습니다.

수 (C1)을 사용하여 쿼리, C5에서

혜택이 키? 키 : C1, C2는, C3, C4, C5

은 그래서 지수가 떨어 뜨린 수 있습니다.

필드의 순서에는 어떤 영향이 있습니까? 키 : c1, c2, c3 키 : c3, c1, c2

일반적인 시나리오는 process_date, client_number, operation입니다. 그리고 매일 많은 양의 데이터를 제공합니다 (process_date).

+0

커뮤니티 위키를 참조하십시오. – bmargulies

+2

@bmargulies : 왜 CW인가? 이것들은 인덱스가 작동하는 방식에 관한 직접적인 질문이지 주관적인 토론이 아닙니다. – womp

답변

1

더 쿼리 지수보다 키 혜택을 경우, 수 인덱스 영향 부정적인? 삽입/삭제하는 대신 1

비 클러스터형 인덱스는 삽입/업데이트에 부정적인 영향을 2 개 인덱스를 업데이트 할 을 가지고 있기 때문에/성능을 삭제합니다. 일반적으로 부정적인 영향은 선택 항목의 성능 향상으로 인해 상쇄됩니다. (C1)을 사용하여 쿼리가이 키? 키에서 혜택 C5 수

: C1, C2, C3, C4, C5

예, 몇 행이 동일한 C1을 공유하는 경우, 색인은 매우 효과적 일 것입니다.

필드의 순서에는 어떤 영향이 있습니까? 키 : c1, c2, c3 키 : c3, c1, c2

필터링 및 주문 모두에서 순서가 중요합니다. where c1 = 1where c1 = 1 and c2 = 1에는 (c1, c2)의 인덱스를 사용할 수 있지만 where c2 = 1에는 사용할 수 없습니다. 마찬가지로 order by c1에서는 도움이되지만 order by c2에서는 도움이되지 않습니다.

+0

클러스터 된 색인은 삽입/업데이트/삭제에 영향을주지 않습니까?c1이 날짜이고 많은 행이 같고 c5가 costumer ID 인 경우 c1, c5를 사용하는 쿼리의 키는 c5, c2, c3, c4, c1이어야합니다. – mencargo

+1

@mencargo : 클러스터 된 인덱스는 테이블의 일부로 저장되므로 삽입/업데이트/삭제에 미치는 영향이 적습니다. 클러스터 된 인덱스가 있는지 여부에 관계없이 테이블을 수정해야합니다. 키는 행을 고유하게 식별해야합니다. 따라서 고객 테이블의 경우 CustomerID와 CustomerID 만 키가되어야합니다. – Andomar

1

색인에서 Key보다 많은 쿼리가 도움이되면 색인이 부정적인 영향을 줄 수 있습니까?

예.

하지만 ...

당신은 실제로 이것이 사실인지 확인하기 위해 실제 작업 부하를 측정해야합니다. 순전히 이론적 인 근거로 예측하기는 어렵습니다. 가능하지만 어렵습니다.

수있는이 키? 키에서 C1, C5의 혜택을 사용하여 쿼리 :

드물게 C1, C2, C3, C4, C5. 쿼리 알고리즘은 키나 인덱스의 일부를 거의 사용하지 않습니다. 그것은 대개 전부 또는 아무것도 아닙니다. 전체 키 (또는 색인)를 사용할 수없는 경우에는 사용되지 않습니다.

쿼리 실행 계획을 얻고이 질문에 대한 확실한 답을 얻는 것은 쉽습니다.

실행 계획을 실제로 얻고 실제로 얻으십시오.

필드의 순서에는 어떤 영향이 있습니까? 키 : c1, c2, c3 키 : c3, c1, c2

전혀 영향이 없습니다. 일부 데이터베이스에서는 ORDER BY 절을 생략해도 행이 표시되는 방식을 변경할 수 있습니다.다른 데이터베이스에서는 물리적 행과 키 인덱스의 순서가 분리되어 있기 때문에 영향을 미치지 않습니다.

인덱스를 손쉽게 삭제하고 다시 작성하고 실행 계획을 확인하고 영향을 받는지 확인할 수 있습니다.

유일한 확실한 방법은 실행 계획을 세우고 살펴 보는 것입니다.

+1

색인이 전부 또는 아닌 것을 말하는 근거는 무엇입니까? c1, c2에 대한 쿼리는 확실히 c1, c2, c3에 대한 인덱스를 사용할 수 있습니다. c1, c3, c2에 대한 색인조차 사용 가능한 유일한 커버링 색인 인 경우 사용할 수 있습니다. 당신은 명확히 할 수 있습니까? –

+0

쿼리 실행 계획을 얻고 싶지만 내 시나리오가 실행 중이므로 쿼리가 이미 sepcified되고 단기간에 변경할 수 없습니다. – mencargo

+0

SQL이 이미 작성된 경우에도 여전히 쿼리 실행 계획을 가져와야합니다. 인덱스 생성에 대해 이야기하고 있습니다. 인덱스가 있는지 여부를 확인하는 유일한 방법은 실제 응용 프로그램의 실제 쿼리에서 실행 계획을 얻는 것입니다. –

1

인덱스 전략을 최적화하려는 경우 데이터베이스 조정 관리자 또는 쿼리 sys.dm_db_index_usage_stats을 실행하여 인덱스 사용 방법을 찾을 수 있습니다. 이러한 통계는 SQL Server 프로세스가 다시 시작될 때 지워집니다.

첫 번째 질문에 대한 대답으로 색인은 항상 쓰기 성능에 부정적인 영향을 미치므로 사용되지 않는 색인을 제거하는 것이 유용 할 수 있습니다. 그러나 그들이 정말로 처음에는 사용되지 않았는지 확인하십시오.

두 번째 질문에 대한 대답으로 인덱스를 제거하면 쿼리 성능이 향상되고 인덱스가 최소 열 수를 사용하여 쿼리를 처리하기 때문에 실제로 쿼리 성능이 저하 될 수 있습니다. "c1, c5를 사용하여"라는 것이 두 개의 열만있는 경우 색인을 제거하면 성능이 약간 저하 될 수 있습니다. 쿼리가 인덱스보다 많은 열을 선택하면 인덱스가 사용되면 테이블에 조인해야하므로 인덱스를 놓으면 성능에 많은 영향을 미치지 않습니다. 유일한 방법은 두 시나리오의 쿼리 비용을 분석하는 것입니다.

+0

sys.dm_db_index_usage_stats는 Microsoft SQL Server 전용이고 Sybase에 상응하는 것이 있는지 알지 못합니다. – mencargo

+0

예, SQL Server에 고유합니다. 나는 그가 SQL 서버로 태그를 붙인 이유에 대해 생각했다. 어쨌든 도움이 되었습니까? – womp

+0

"sql-server"가 아닌 "sql"이라는 태그를 붙였습니다. 그러나 Sybase와 동일한 기능을 찾으면 많은 도움이됩니다. – mencargo

1

인덱스는 테이블 변경 (삽입, 업데이트 또는 삭제)에 부정적인 영향을 미칠 수 있습니다. 많은 수의 불필요한 인덱스가 있거나 시스템의 데이터 변경 비율이 매우 높지 않은 한, 1-2 개의 추가 인덱스가 문제가되지는 않습니다. 아무 이유없이 테이블에 인덱스를 놓는 것만은 아니지만 일반적으로 인덱스를 피하기 위해 광범위한 분석을 수행 할 필요는 없습니다.

테이블의 키는 행을 고유하게 식별하는 최소한의 열 집합이어야합니다. 추가 열이 없어야합니다. 예를 들어, 고유 한 전자 메일 주소의 테이블이 있고 키가 email_address에있는 경우 "[email protected]"에 대해 하나의 행만 가질 수 있습니다.많은 쿼리에서 설명을 사용하기 때문에 설명에 키를 추가하면 갑자기 "[email protected]", "Description # 1"AND "[email protected]", "Description # 2 ". 귀하의 데이터는 더 이상 적절히 제약을받지 않으며 결국 당신의 손에 큰 혼란을 야기합니다.

키의 열 순서는 사용중인 쿼리에 따라 매우 큰 영향을 줄 수 있습니다. 예를 들어 c1, c2를 기반으로하는 행을 찾고 있다면 c1, c2, c3의 키가 매우 유용합니다. 키가 c1, c3, c2이면 그다지 유용하지 않습니다.

이 방법을 상상해보십시오. 전화 번호부를보고 성이 "TO"로 시작하는 모든 사람을 찾으십시오. 그것은 매우 간단한 요청입니다. 이름이 성의 첫 글자와 성의 세 번째 글자에 이어 순서가 정해지면 어떻게 될까요? "TO"로 시작하는 이름을 찾는 것은 매우 어렵고 시간이 오래 걸립니다.

관련 문제