2017-11-02 1 views
0

우리는 8 백만 행이있는 테이블의 UUID 유형 열에 색인을 추가하기 위해 Postgres와 함께 Ruby on Rails 마이그레이션을 사용하고 있습니다.8 천만 행 테이블에 대한 색인 생성

concurrently 패턴을 따르고 disable_ddl_transaction!입니다. 그러나 배포 직후 마이 그 레이션 도중 심각한 속도 저하를 감지하고 결국 테이블이 응답을 중지했습니다. 중간에 마이그레이션을 취소했으나 테이블이 마침내 복구되었지만 테이블이 응답을 멈추게 한 원인을 아직 알 수 없습니다.

우리는 AWS RDS를 사용하고 있으며 모든 통계를 확인했으며 CPU 나 I/O가 초과 된 것처럼 보이지 않았습니다.

내 질문에이 마이그레이션 중에 우리가 감속/가동 중지 시간을 초래할 수있는 다른 고려 사항이 있습니까?

다른 테이블이 응답했지만 응용 프로그램이로드되고 있었지만이 테이블 하나가 막혔습니다. 여기

마이그레이션입니다 :

class AddIndexToPublicId < ActiveRecord::Migration 
    disable_ddl_transaction! 

    def up 
    change_column :table1, :public_id, :uuid, null: false 
    change_column :table2, :public_id, :uuid, null: false 
    change_column :table3, :public_id, :uuid, null: false 
    add_index :table1, :public_id, unique: true, algorithm: :concurrently 
    add_index :table2, :public_id, unique: true, algorithm: :concurrently 
    add_index :table3, :public_id, unique: true, algorithm: :concurrently 
    end 

    def down 
    remove_index :table1, :public_id 
    remove_index :table2, :public_id 
    remove_index :table3, :public_id 
    change_column :table1, :public_id, :uuid, null: true 
    change_column :table2, :public_id, :uuid, null: true 
    change_column :table3, :public_id, :uuid, null: true 
    end 
end 

마이그레이션의 change_column 부분은 잘 작동하는 듯하지만, 우리 schema.rb하지 않는 경우 인덱싱은 지금 우리가 이상한 상태에있어 너무 완료되지 않았습니다 우리의 db와 일치해라.

답변

2

한 번에 여러 개의 인덱스를 동시에 추가하기 때문에 속도가 느려집니다. Postgres document이 옵션을 사용

에 따르면, PostgreSQL는 테이블의 두 스캔을 수행해야합니다, 또한 잠재적으로 수정하거나 종료 인덱스를 사용할 수있는 기존의 모든 트랜잭션을 기다려야합니다.

동시에 색인을 추가 할 경우 Postgres는 표를 두 번 스캔해야합니다.

시도는 마이그레이션을 분해합니다 : change_column에 대한

  • 한 마이그레이션.
  • 각 1 회 이전 add_index.

그리고 한 번에 하나씩 만 실행하십시오.

+0

그래서 우리는 조금 더 배웠습니다. 우리는 실제로'null : false' 부분을 지나치지 않았습니다. 우리는 이전을 다시하고 마침내 그 일을 지나쳤습니다. 그런 다음 마이그레이션을 완료하고 table1에 인덱스를 추가하면 더 많은 가동 중지/느려짐이 발생했습니다. 우리는 IO/CPU를 살펴 보았고 스파이크가 발생하지 않았습니다. –

관련 문제