2017-02-17 5 views
0

Java 응용 프로그램에서 Cassandra에 액세스하면 초 당 500 rows을 삽입 할 수 있지만 50 rows (실제로 업데이트 된 행은 존재하지 않음) 만 업데이트 할 수 있습니다.Insert는 Cassandra의 Update보다 10 배 빠릅니다. 정상입니까?

백개 필드를 업데이트하는 것은 한 필드를 업데이트하는 것만큼 빠릅니다.

난 그냥 CQL statements Java 응용 프로그램에서 사용하십시오.

이 상황이 정상입니까? 신청서를 어떻게 개선 할 수 있습니까?

public void InsertSome(List<Data> data) { 

     String insertQuery = "INSERT INTO Data (E,D,A,S,C,......) values(?,?,?,?,?,.............); "; 
     if (prepared == null) 
      prepared = getSession().prepare(insertQuery); 

     count += data.size(); 
     for (int i = 0; i < data.size(); i++) { 

      List<Object> objs = getFiledValues(data.get(i)); 
      BoundStatement bs = prepared.bind(objs.toArray()); 
      getSession().execute(bs); 
     } 
    } 

    public void UpdateOneField(Data data) { 
     String updateQuery = "UPDATE Data set C=? where E=? and D=? and A=? and S=?; "; 

     if (prepared == null) 
      prepared = getSession().prepare(updateQuery); 

     BoundStatement bs = prepared.bind(data.getC(), data.getE(), 
       data.getD(), data.getA(), data.getS()); 
     getSession().execute(bs); 

    } 

    public void UpdateOne(Data data) { 
     String updateQuery = "UPDATE Data set C=?,U=?,F........where E=? and D=? and A=? and S=? and D=?; "; 

     if (prepared == null) 
      prepared = getSession().prepare(updateQuery); 

     ...... 
     BoundStatement bs = prepared.bind(objs2.toArray()); 
     getSession().execute(bs); 

    } 

스키마 :

Create Table Data (
    E, 
    D, 
    A, 
    S, 
    D, 
    C, 
    U, 
    S, 
    ... 
    PRIMARY KEY ((E 
    D), 
    A, 
    S) 
) WITH compression = { 'sstable_compression' : 'DeflateCompressor', 'chunk_length_kb' : 64 } 
    AND compaction = { 'class' : 'LeveledCompactionStrategy' }; 

또 다른 시나리오 :

내가 다른 카산드라 클러스터를 액세스하기 위해 동일한 응용 프로그램을 사용했다. 그 결과는 달랐다. UPDATE는 INSERT만큼 빠릅니다. 하지만 초당 5 개의 행만 INSERT/UPDATE합니다. 이 카산드라 클러스터는 GCE에서 실행되는 DataStax Enterprise입니다 (Google Cloud Launcher에서 기본 DataStax Enterprise를 사용했습니다). 그래서 일부 구성이 이유라고 생각합니다. 그러나 나는 그들이 무엇인지 모른다.

+0

여기 테이블의 스키마도 게시 할 수 있습니까? – markc

답변

-1

카산드라는 온 - 디스크 형식의 로그 구조 병합 트리를 사용합니다. 즉, 모든 쓰기가 순차적으로 수행됩니다 (데이터베이스는 추가 전용 로그입니다). 즉, 쓰기 대기 시간이 짧아집니다.

클러스터 레벨에서 카산드라는 각 시스템이 키의 일부만을 담당하도록 키 공간을 분할하여 쓰기 확장 성을 향상시킬 수도 있습니다. 이것은 더 많은 쓰기가 병렬로 수행 될 수 있기 때문에 쓰기 처리량이 더 높다는 것을 의미합니다.

2

개념적으로 UPDATE와 INSERT가 동일하므로 비슷한 성능이 기대됩니다. UPDATE는 데이터가 이미 존재하는지 확인하지 않습니다 (가벼운 트랜잭션을 IF EXISTS으로 수행하지 않는 한).

null이 아닌 경우 각 메소드가 명령문을 준비하는 것으로 나타났습니다. 진술이 매번 재연 될 수 있습니까? 이는 모든 메소드 호출에 대한 왕복을 추가합니다. 또한 InsertSome은 호출 당 여러 개의 삽입을 수행하며 여기서 UpdateOne/UpdateOneField은 하나의 명령문을 실행합니다. 따라서 명령문이 매번 준비되면 업데이트 당 호출이되며, 목록의 삽입 당 한 번만 수행됩니다.

+0

다른 카산드라 클러스터에 액세스 할 때 동일한 애플리케이션을 사용했습니다. 그 결과는 달랐다. UPDATE는 INSERT만큼 빠릅니다. 하지만 초당 5 개의 행만 INSERT/UPDATE합니다. 이 카산드라 클러스터는 GCE에서 실행되는 DataStax Enterprise입니다 (Google Cloud Launcher에서 기본 DataStax Enterprise를 사용했습니다) – niaomingjian

관련 문제