2009-02-09 3 views
1

빠른 질문입니다. 한 번에 정의 된 데이터베이스 테이블과 시간이 지남에 따라 추가 된 열이있는 테이블간에 차이가 있는지 궁금했습니다. 컬럼 성능이 추가 된 성능이 다소 저하됩니까?컬럼 추가를 통해 생성 된 테이블과 생성 된 테이블간에 성능 차이가 있습니까?

어쨌든 데이터베이스 공급 업체는이 사례에 대한 공급 업체 차이가 없으면 여기에도 관련이 없습니다.

감사합니다.

답변

3

여기에서 입니다. SQL 언어는 표준에 의해 정의되지만 저장소 세부 정보는 구현할 각 공급 업체에 맡깁니다.

예를 들어, MySQL에서 열을 추가하면 데이터베이스 엔진이 전체 테이블을 복사하여 각 행의 새 열에 공백을 넣습니다. 일단 모든 행을 복사하면, 테이블의 이전 복사본이 삭제됩니다. 따라서 새 테이블은 처음부터 새 열로 정의한 것처럼 정확하게 저장됩니다. 그러나 사본이 완료되기를 기다려야 ALTER TABLE이 반환됩니다 (테이블이 거대하면 시간이 오래 걸릴 수 있습니다).

다른 브랜드의 데이터베이스에서 (한 가지 염두하지는 않지만) 열을 추가하면 원본 테이블과 별도로 여분의 열이 저장 될 수 있습니다. 이렇게하면 새 열을 빠르게 추가하는 데 도움이되지만 데이터 검색은 연결되지 않은 데이터 섹션의 영향을받습니다. 아마도 나중에 데이터베이스 엔진에 테이블의 "조각 모음"을 지시하고 모든 열을 함께 가져올 수 있습니다.

1

이것은 완전히 저장소 엔진에 의존합니다. 일반적으로 나는 추가 된 열을 매우 편안하게 사용할 것입니다. 아마도 OPTIMIZE TABLE을 던진 후에 가능할 것입니다.

2

오라클에서는 기존의 채워진 테이블에 빈 열을 추가 할 수 있으며 결과적으로 테이블 구조의 논리적 재정의 정의 이외의 다른 결과는 발생하지 않습니다. 물론 열이 추가 될 때 그 열을 채울 때 행이 확장되어야하며 열을 포함하는 블록에 충분한 여유 공간이없는 일부 행에 문제가 발생할 수 있습니다. 원래 위치에 포인터가있는 다른 블록으로 마이그레이션됩니다 (따라서 인덱스는 원래 위치를 계속 가리키므로 영향을받지 않습니다).

행이있는 테이블에 채워진 열을 추가하는 경우 원본 테이블의 이름을 바꾸고 "선택 항목으로 테이블 만들기"를 수행하여 새 버전을 만들고 채울 수 있습니다. 인덱스, 트리거, 권한 등은 물론 마이그레이션해야합니다. 그러나 테이블이 너무 크지 않은 경우, 채워진 컬럼을 추가하고, 행 마이그레이션으로 인한 성능 저하를 가져온 다음 테이블 이동을 수행하여 재구성 할 수 있습니다.

+0

오라클 조언을 주셔서 감사합니다. 오라클 DB와 함께 작업했을 때 발생했습니다. –

+0

그 다음에는 더 큰 행 이동이 항상 염려되는 테이블을 갖는 것과 상황이 동일하다는 점을 기억하십시오. 항상 문제를 완화 할 수있는 몇 가지 방법이 있습니다. –