2008-09-30 7 views
3

그리고 테스트 환경과 프로덕션 환경을 어떻게 동기화합니까?소스 제어에 색인을 넣으시겠습니까?

데이터베이스 테이블의 인덱스에 관해서는 데이터베이스를 쿼리하는 코드 작성에 없어서는 안될 부분입니다. 색인에 대한 영향을 분석하지 않고 새 조회를 도입하거나 조회를 변경할 수는 없습니다.

그래서 내 모든 환경에서 인덱스를 동기화하는 데 최선을 다하고 있지만 솔직히 말해서 나는 이것을 자동화하는 데별로 능숙하지 않습니다. 이것은 일종의 우연한 수동 프로세스입니다.

나는 정기적으로 색인 통계를 검토하고 불필요한 색인을 삭제합니다. 일반적으로 삭제 스크립트를 만들어서 다른 환경으로 복사합니다.

그러나 여기 저기 색인은 정상적인 프로세스 외부에서 생성 및 삭제되며 차이점을 확인하기가 정말 어렵습니다.

나는 t 테이블에 대한 짧은 약어입니다

idx_t_01 
idx_t_02 

같은 정말 간단, 숫자 인덱스 이름으로 이동하는 데 도움이 한 가지를 발견했습니다. 내가 좋아하는, 관련된 모든 열이 영리 할 때 나는

idx_c1_c2_c5_c9_c3_c11_5 

그것은 같은 인덱스를 구별하기가 너무 어렵다, 인덱스 유지 보수가 불가능 찾을 수 있습니다.

누구든지 인덱스 유지 관리를 소스 제어 및 개발주기에 통합하는 정말 좋은 방법이 있습니까?

답변

5

예, DML 또는 DDL 변경 사항은 스크립트로 작성되고 대부분 소스 코드에서 철저한 Active Record 마이그레이션을 통해 체크 인됩니다. 나는 계속해서 레일의 뿔을 깍는 것을 싫어하지만 오랜 세월에 걸쳐 DB 기반 시스템을 구축하면서 내가 사용했거나 구축 한 모든 자생 시스템보다 마이그레이션 경로가 훨씬 뛰어나다는 것을 알게되었습니다.

그러나 모든 인덱스의 이름을 지정합니다 (DBMS가 선택한 모든 미친 이름을 표시하지 마십시오). 접두사를 사용하지 마십시오. sysobjects에 메타 데이터를 입력했거나 다른 데이터베이스에 메타 데이터가 있기 때문에 바보 같습니다.하지만 테이블 이름과 열을 포함해야합니다. tablename_col1_col2.

그런 식으로 sysobjects를 탐색하면 쉽게 특정 테이블에 대한 인덱스를 볼 수 있습니다. 또한 사용 된 일부 dBMS에서 습관의 힘을 다시 얻었습니다. 인덱스 이름은 전체 DB에서 고유 했으므로, 고유 한 이름을 사용하는 유일한 방법입니다).

11

색인은 데이터베이스 스키마의 일부이므로 다른 모든 항목과 함께 소스 제어가되어야합니다. 누구도 정상적인 품질 보증 및 릴리스 프로세스 (특히 성능 테스트)를 거치지 않고 생산에 대한 색인 생성을 계속해야합니다.

스키마 버전 관리에는 다른 많은 스레드가있었습니다.

0

색인을 소스 제어에 넣지 않고 색인 작성 스크립트로 지정합니다.;-)

색인 이름 : 테이블 "고객"의 필드 "이름"에 대한

  • IX_CUSTOMER_NAME
  • 기본 키에 대한
  • PK_CUSTOMER_ID의 GUID 필드에 대한
  • UI_CUSTOMER_GUID, 고유 한 고객 (따라서 "UI"- 고유 색인).
6

데이터베이스의 전체 스키마는 코드 옆의 소스 제어에 있어야합니다. 내가 "전체 스키마"라고 말하면 테이블 정의, 쿼리, 저장 프로 시저, 인덱스, 전체를 의미합니다.

새로 설치할 때 다음을 수행하십시오. - 제품의 버전 X를 확인하십시오. - 계산대의 "database"디렉토리에서 데이터베이스를 생성하기 위해 데이터베이스 스크립트를 실행하십시오. - 체크 아웃의 코드베이스를 사용하여 데이터베이스와 상호 작용합니다.

개발할 때 모든 개발자는 자신의 개인 데이터베이스 인스턴스에 대해 작업해야합니다. 스키마 변경을 수행 할 때 수정 된 코드베이스에 대해 작동하는 새로운 스키마 정의 파일 세트가 체크인됩니다.

이 방법을 사용하면 코드베이스 - 데이터베이스 동기화 문제가 발생하지 않습니다.

0

나는 항상 SQL (DDL, DML 등)을 소스 제어합니다. 그 코드는 다른 것과 같습니다. 좋은 습관.

0

서로 다른 데이터 크기를 가지고 있기 때문에 서로 다른 환경에서 인덱스가 동일해야하는지 확신 할 수 없습니다. 테스트 환경과 프로덕션 환경의 데이터가 똑같은 경우가 아니라면 인덱스가 다를 수 있습니다.

소스 제어에 속하는지 여부는 확실하지 않습니다.

+0

괜찮은 데이터베이스로, 그건 중요하지 않아야한다. 옵티마이 저/플래너가 색인을 사용할지 여부를 결정해야한다. 모든 환경에서 사용 가능해야합니다. 그렇지 않으면 프로덕션 전까지 인덱스 유지 보수로 인한 성능 문제점을 볼 수 없습니다. –

1

인덱스 명명 규칙 및 소스 제어/수명주기에 데이터베이스 변경 사항을 추가하는 두 가지 문제가 있다고 생각합니다. 나는 후자의 문제를 다룰 것이다.

저는 오랫동안 Java 프로그래머 였지만 시스템의 일부에 대한 데이터베이스 액세스를 위해 Ruby on Rails를 사용하는 시스템에 최근 소개되었습니다. 내가 RoR에 대해 좋아하는 한 가지는 "마이그레이션"의 개념입니다. 기본적으로 001_add_foo_table.rb, 002_add_bar_table.rb, 003_add_blah_column_to_foo.rb 등의 파일로 가득 찬 디렉토리가 있습니다.이 루비 소스 파일은 상위 클래스를 확장하여 "위"및 "아래"라는 메소드를 재정의합니다. "up"메소드는 이전 버전의 데이터베이스 스키마를 현재 버전으로 가져 오기 위해 수행해야하는 데이터베이스 변경 세트를 포함합니다. 비슷하게, "down"방법은 변경 사항을 이전 버전으로 되 돌린다. 특정 버전의 스키마를 설정하려는 경우 Rails 마이그레이션 스크립트는 데이터베이스를 검사하여 현재 버전을 확인한 다음 거기에서 원하는 버전으로 (또는 아래로) 이동하는 .rb 파일을 찾습니다.

개발 과정의 일부로 소스 컨트롤과 계절별로 확인할 수 있습니다.

레일스에 관해서 특별히 구체적이거나 특별한 것은 없습니다. 널리 사용 된이 기술을 처음 보았습니다. 아마도 001_UP_add_foo_table.sql 및 001_DOWN_remove_foo_table.sql과 같은 SQL DDL 파일 쌍을 사용할 수도 있습니다. 나머지는 쉘 스크립팅의 작은 문제이며, 독자에게 남겨진 운동입니다.

0

내 현재 프로젝트에서 필자는 빈 데이터베이스의 전체 덤프 (pg_dump -c를 사용하여 테이블과 인덱스를 생성하는 모든 ddl을 가짐)와 데이터베이스를 변경하고 변경/적용/추가를 적용하여 현재 버전으로 가져옵니다. 전자는 새 사이트에 설치할 때 실행되며 QA가 새로운 테스트 라운드를 시작하고 후자는 모든 업그레이드에서 실행됩니다. 데이터베이스를 변경하면 두 파일을 모두 업데이트해야합니다.

0

grails 앱을 사용하면 도메인 객체를 나타내는 파일 내에서 색인 정의를 정의하므로 기본적으로 색인이 소스 제어에 저장됩니다. 단지 'Grails'관점을 FYI로 제공합니다.