2009-05-18 4 views
2

누군가가 질문 : "INT, BIGINT or UUID/GUID in Oracle, DB2, Derby and HSQLDB?"및 내가 설계 한 모든 데이터베이스 스키마에 대해 생각하기 시작했고 하나의 참조가 제공되지 않은 색인 만들기에 대한 조언을 읽었습니다.적절한 데이터베이스 인덱스를 만드는 전략이 있습니까?

예 : 이 인덱스는 날짜 범위의 데이터를 검색 및 정렬을 위해 좋은 동안 당신이

date() ++ foo() ++ bar() 

같은 복합 인덱스가있는 경우 (읽기, 읽기 성능) ... 그것은 쓰기에 대한 끔찍한입니다. (삽입은 균형 잡힌 트리의 오른쪽에 항상 발생하여 값 비싼 작업 인 재조정을 강제합니다.)

분명히 ... a) 데이터를 알고 있어야합니다. b) 귀하의 유스 케이스를 알고 있어야합니다. c) 데이터베이스 엔진을 알고 있어야합니다.

그러나 고성능 데이터베이스에 대한 합리적인 스키마를 정의하는 상식적인 일반 규칙은 무엇입니까?

답변

4

좋아요, 여기 색인 생성에 대한 몇 가지 확실한 조언이 있습니다.

정말 분명하지만 전혀 구체적인 것은 아닙니다. 좀 더 구체적인 것을 원한다면, 그것이 무엇에 의존 하는지를 알아야 할 것입니다.

이것은 DBMS와 DBMS 버전에 따라 다릅니다. 다음은 최소한 외면적으로 배워야 할 유행어입니다. "피상적으로"나는 그것이 당신을 위해 무엇을하는지, 그리고 그것이 당신을 해칠 수있는 방법을 배우는 것을 의미하지만 반드시 그것이 어떻게 작동 하는지를 의미하지는 않습니다. DBMS에 고유 한 문서를 사용하십시오 (얻을 수있는 경우).

전체 테이블 스캔 방지.

색인 만 검색.

범위 검색. (및 복합 또는 복합 인덱스)

병합 조인 (나중에 설명 함).

해시 인덱스.

동시성 제어 (나중에 설명).

기본 키와 색인 (나중에 설명).

색인 업데이트 비용.

색인에 대한 지연된 업데이트.

비용 기반 최적화. DBMS에 CBO가없는 경우 다른 DBMS를 가져옵니다.

힌트. (사용법 및 사용하지 않고 생활하는 방법)

데이터베이스 관리 및 CBO. 일부 DBMS는 옵티마이 저가 구식 전략을 사용하지 못하도록 정기적 인 DBA 조치가 필요합니다.

볼륨에 따라 다릅니다. 아주 작은 테이블의 경우 인덱스 디자인이 비교적 간단합니다. "비교적 사소한"이란 말은 상당히 쉽다는 뜻이기도하지만 상당히 중요하지 않습니다. 잘못된 비용은 적습니다. 조회 테이블을 작성하는 경우 코드 열에 고유 한 색인이 있어야합니다. 코드 열을 기본 키로 선언하면 이러한 테이블 (대부분의 DBMS가 있음)이 표시됩니다. 다른 색인을 작성하지 않으면 비용이 지연 될 수있는 특수한 상황에서 작은 표의 표 스캔이 될 수 있습니다.

스키마의 큰 테이블은 일상적인 트랜잭션 처리로 추가되는 경향이 있습니다. 이는 속도면에서나 트랜잭션 동시성면에서 어느 정도의 인덱스를 갖는 이점을 제공합니다. 또한 트랜잭션이 인덱스를 업데이트해야하기 때문에 인덱스 보유 비용이 추가됩니다. 비용 편익 교환은 트랜잭션 테이블에 대해 매우 미묘하고 매우 중요합니다.

DBMS가 지원하는 경우 트랜잭션 테이블의 일부 인덱스에서 지연된 업데이트를 적용하면 좋은 결과를 얻을 수 있습니다.

스키마에서 적어도 참조 테이블과 트랜잭션 테이블을 구별하십시오. 나는 이것이 다소 주관적인 것을 안다. 최선의 판단을 사용하십시오.

트래픽에 따라 다르지만 모든 테이블에서 동일한 트래픽 양을 얻지는 않습니다. 인덱스는 조인과 조회 속도를 높입니다. 최소한 DBMS에 사용 가능한 인덱스와 테이블 볼륨을 기반으로 병합 조인을 수행하는 방법을 알고있는 옵티 마이저가 있는지 여부를 알아야합니다. 병합 조인이 무엇인지 알지 못하는 경우 해당 내용을 확인하십시오. 그러나 병합 조인을 프로그램하는 방법을 배우는 데 시간을 낭비하지 마십시오. 그것이 생존을 위해하는 일이 아니라면 말입니다.

긴급 사안에 따라 다릅니다. 벡크 렛 배치 처리 중에 한 달에 한 번 수행되는 쿼리는 사용자를 하루에 1000 번 잡아 먹는 쿼리만큼 시급하지 않지만 해당 사용자는 화면을 보거나 컨텍스트가 그녀의 멀티 태스킹을 전환합니다.

제품 마케팅이 긴급성에 대해 알려줄 것입니다. 그들은 당신이 첫 아이의 출생을 놓치지 않고 일하는 저녁과 주말을 의미한다고하더라도 경쟁이 모든 상황에서 가장 시급하다는 것보다 더 빠르다고 말할 것입니다. 마케팅은 종종 불에 타는지 여부에 상관하지 않습니다. 그들은 말의 재발 여부에 상관하지 않는 기수와 같습니다. 사실 일부 거래는 매우 시급한 반면 다른 거래는 상대적으로 중요하지 않습니다.

색인 디자인에 대해 유연하게 조정하고 절충안을 고려할 수 있도록 준비하십시오.

나는이 주제에 관해 당신에게 정말로 좋은 책을 가르쳐 주었으면 좋겠다. 다른 사람들도 그렇게하기를 바랍니다.

+0

좋은 답변입니다. 감사! – Richard

3

인덱스 작성하는 엄지 손가락의 몇 가지 규칙이 있습니다

  • 같은
  • 일반적인 검색 컬럼에 인덱스를 생성 외래 키에 인덱스 만들기를 로그에 이름과 사용자의 핀의 제품 ID 제품 등
  • 성능을 향상시킬 수 있다고 생각하여 작성하지 마십시오.

추가 인덱스가

  • 응용 프로그램 및 identfy 시간이 많이 소요를 관찰 응용 프로그램의 성능 문제에 의해 구동을 추가해야 당신이 중요한 쿼리를 확인하는 경우
  • 은, 실행 계획을 분석하고 최적화 쿼리 인덱스 사용.

마지막 문장에서 "합리적인 스키마 정의"라고 말합니다. 인덱스를 설계하는 방법보다 훨씬 일반적인 방법입니다.

+0

멋진 문서가 있습니까? – Rams

관련 문제