2010-07-15 3 views
0

현재 성능 문제를 해결하기 위해 노력하고 있습니다. 데이터를 검색하고 페이지 매김 방식으로 제시하는 데는 약 2-3 분이 걸립니다.거대한 데이터베이스 테이블을 빠르게 복제하는 방법

추가 조사 (그리고 여러 SQL 튜닝 후)에서는 데이터 양이 너무 많아서 검색 속도가 느린 것으로 보입니다.

내가 현재 조사하고있는 가능한 해결책은 검색 가능한 캐시에 데이터를 복제하는 것입니다. 이제이 캐시는 데이터베이스 (즉, 구체화 된 뷰)에있을 수도 있고 db 외부에있을 수도 있습니다 (nosql 방식). 그러나, 나는 캐시를 수평으로 확장 가능하게하고 싶기 때문에 데이터베이스 외부로 캐싱하기를 기대합니다.

개념 증명을 만들었으며 실제로 캐시에서 검색하는 것이 db보다 빠릅니다. 그러나 초기 전체 복제는 완료하는 데 시간이 오래 걸립니다. 전체 복제는 한 번 발생하지만 후속 복제는 마지막 복제 이후 변경된 복제에 대해 점진적으로 증가하지만 초기 전체 복제의 속도를 높일 수 있다면 여전히 좋습니다.

그러나 전체 복제 중에 쿼리 실행 속도가 느린 것을 제외하고 네트워크 대기 시간에도 맞서야합니다. 사실, 느린 쿼리 실행 시간을 처리 할 수 ​​있습니다. 그러나 네트워크 지연으로 인해 실제로 복제 속도가 느려집니다.

그럼 내 질문에 이르게됩니다. 어떻게 복제 속도를 높일 수 있습니까? 각 스레드마다 여러 개의 스레드를 생성해야합니까? 스크롤 할 수 있어야합니까? 객체 또는 데이터 구조

  • +0

    실시간 데이터인가요, 아니면 사실보고 후입니까? nosql 솔루션이이 특정 쿼리 (예 : –

    +0

    )에서 작동하는지 확인하려고 할 수 있습니다. 우리의 RDBM (또는 어쨌든 테이블의 일부)을 nosql 저장소에 복제 할 것입니다. –

    답변

    0
    1. SELECT * FROM YOUR_TABLE
    2. 지도 결과는 역할을하는의 WeakHashMap으로 각 개체 또는 데이터 구조
    3. 로드 키와 객체 또는 데이터 구조에 대한 고유 키를 할당하여 은닉처.

    캐시가 O (1) 시간의 고유 키 값을 액세스해야하기 때문에 정렬이 필요한 이유가 표시되지 않습니다. 당신을 어떻게 분류하고 있습니까?

    스레드 안전성에 대해 생각해보십시오.

    저는 이것이 읽기 전용 캐시라고 가정하고, 네트워크 대기 시간이 일정하지 않게하기 위해이 작업을 수행하고 있습니다. 또한 시작할 때 한 번해볼 것이라고 가정합니다.

    레코드 당 얼마나 많은 데이터가 있습니까? 1 레코드 당 1KB의 12M 레코드는 캐시를 보관하기 위해 12GB의 RAM이 필요하다는 것을 의미합니다.

    +0

    은 12M 레코드가 아니며 실제로 DBMS에 많은 레코드가 아닙니다. 인덱싱과 다른 트릭을 사용하는 것을 의미합니다 ... – hvgotcodes

    +0

    나는 왜 우리 페이지와 데이터베이스를 캐시 외부로 복제 할 것인지를 나타내는 SQL 페이지 매김 및 정렬에 대해서만 언급했습니다. 혼란을 드려 죄송합니다. 또한,'select * from your_table' 접근 방식은 너무 느립니다. 나는 그것을 끝내기 위해 몇 시간을 기다리는 대신 개발을 쉽게하기 위해 속도를 높이기를 바라고있다. –

    +0

    사실, 문제는 다른 테이블과 조인하고 페이지 매김을 정렬 할 때 발생합니다. 우리의 DBA는 이미 최적화 할 수있는 모든 것을 최적화했지만, (페이지 매김을 위해) 정렬 할 데이터의 양은 너무 커서 쿼리 당 2 ~ 3 분이 걸립니다. –

    0

    캐시에서 데이터를 복제하는 것은 데이터베이스의 기능을 복제하는 것처럼 보입니다.

    다른 의견을 읽으면 네트워크 라운드 트립을 피하기 위해이 작업을 수행하지 않지만 비용이 많이 드는 조인 때문에 발생합니다. 많은 DBMS에서는 임시 테이블을 만들 수 있습니다 -이 같은 :

    CREATE TEMPORARY TABLE abTable AS SELECT * FROM a , b ; 
    

    a와 b가 큰 (상대적으로 영구적 인) 테이블이있는 경우에, 당신은 임시 테이블을 만들 2-3 분 일회성 비용이됩니다 .당신이 많은 쿼리 abTable를 사용하는 경우, 다음 후속 당 쿼리 비용은

    SELECT name, city, ... , FROM a , b ; 
    

    다른 데이터베이스 시스템보다 훨씬 작은 것이

    CREATE VIEW abView AS SELECT * FROM a , b ; 
    

    변경과 같은 작업을 수행 할 수 있습니다 뷰 개념이 기본 a 및 b 테이블에서 abView에 반영됩니다.

    네트워크 왕복 문제가 정말로 염려되는 경우 로컬 컴퓨터에서 데이터베이스의 일부를 복제 할 수 있습니다.

    좋은 데이터베이스 관리 시스템이 데이터 요구 사항을 처리 할 수 ​​있어야합니다. 그렇다면 왜 바퀴를 다시 만들어야합니까?

    +0

    다시 혼란을 용서해주십시오. 캐시 솔루션이나 검색 솔루션을 재발 명하지 않습니다. 데이터베이스에서 데이터를 충분히 읽고 캐시에 저장하고 검색 솔루션에 색인을 생성하면됩니다. 또한, 비록 내가 데이터베이스에서 캐싱을 할 수 있지만, 내가 사용하는 모든 캐시가 수평 적으로 확장 가능합니다 (캐싱을 위해 RDBM을 피하려고하는 이유입니다) 것이 바람직 할 것입니다. –

    +0

    또한 내가 잘못 본 것이 아니라면, VIEW (Materialized VIEW와는 다름)는 뷰에 연결된 쿼리가 여전히 실행된다는 것을 의미하는 쿼리의 바로 가기와 같습니다. 물론 메모리 내 캐싱과 디스크 적중률이 더 빠르기 때문에 더 빠를 수도 있지만 일관성있는 빠른 쿼리를 사용하는 데 의존 할 수는 없다고 생각합니다. –

    관련 문제