cassandra ttl - 카산드라에서 UPDATE와 INSERT의 차이점은 무엇입니까?




tombstone create (5)

미묘한 차이가 있습니다. 키가 아닌 모든 필드를 null로 설정하면 INSERT를 통해 삽입 된 레코드가 유지됩니다. 키가 아닌 모든 필드를 null로 설정하면 UPDATE를 통해 삽입 된 레코드가 사라집니다.

이 시도:

CREATE TABLE T (
  pk int,
  f1 int,
  PRIMARY KEY (pk)
);

INSERT INTO T (pk, f1) VALUES (1, 1);
UPDATE T SET f1=2 where pk=2;
SELECT * FROM T;

보고:

 pk | f1
----+----
  1 |  1
  2 |  2

이제 각 행 설정 f1을 null로 업데이트하십시오.

UPDATE T SET f1 = null WHERE pk = 1;
UPDATE T SET f1 = null WHERE pk = 2;
SELECT * FROM T;

행 1은 유지되고 행 2는 제거됩니다.

 pk | f1
----+------
  1 | null

Cassandra-cli를 사용하여 이들을 보면, 행이 추가되는 방식이 다른 것을 볼 수 있습니다.

나는 그것이 설계 상 또는 버그인지를 확인하고이 행동이 문서화되어 있음을 알고 싶을 것이다.

Cassandra에 대해 CQL을 실행할 때 UPDATEINSERT 의 차이점은 무엇입니까?

아무런 차이가 없었던 것처럼 보였지만 지금은 documentationUPDATE 가 수행하는 동안 INSERT 가 카운터를 지원하지 않는다고 말합니다.

"선호하는"방법을 사용할 수 있습니까? 또는 하나를 다른 것 위에 사용해야하는 경우가 있습니까?

정말 고마워!


또 다른 미묘한 차이 (나는 cql이 cassandra에 대한 끔찍한 인터페이스라고 생각하기 시작했습니다. 유사한 SQL 구문을 사용하지만 약간 다른 의미로 인해 미묘한 점과주의 사항이 가득합니다)은 기존 데이터에 TTL을 설정하는 것입니다. UPDATE 를 사용하면 새 실제 값이 이전 값과 같더라도 키의 TTL을 업데이트 할 수 없습니다. 해결 방법은 새로운 TTL을 이미 설정 한 상태에서 새 행을 INSERT하는 것입니다.


billbaird가 강조한 미묘한 차이점 (해당 게시물에 직접 언급 할 수 없음)과 관련하여 키 필드가 아닌 모든 필드가 null 인 경우 업데이트 작업으로 만들어진 행이 삭제됩니다.

이는 예상되는 동작이며 issues.apache.org/jira/browse/CASSANDRA-11805 ( "문제가 아닙니다"로 마감)의 버그 보고서를 기반으로 한 버그가 아닙니다.

처음으로 스프링 데이터를 사용할 때 나는이 문제에 스스로 빠졌다. 저장소의 save(T entity) 메소드를 사용했지만 행이 작성되지 않았습니다. 그것은 Spring 데이터가 객체가 'new'가 아니라는 것을 확인했기 때문에 UPDATE 사용하는 것으로 판명되었습니다. ( 'isNew'에 대한 테스트가 여기에 맞는지 확신 할 수 없습니다.) 키 필드가 설정된 엔티티 만 테스트 할 수있었습니다. .

이 Spring 데이터 케이스의 경우, Cassandra 고유의 ​​저장소 인터페이스는 해당 동작이 필요할 경우 INSERT 를 계속 사용하는 insert 메소드를 제공합니다 (Spring의 설명서에는 이러한 세부 사항이 충분히 설명되어 있지 않지만).


Cassandra의 카운터 열은 임의의 값으로 설정할 수 없습니다. 임의의 값으로 만 증가 또는 감소시킬 수 있습니다.

따라서 카운터 열에 값을 "삽입"할 수 없으므로 INSERT 는 카운터 열을 지원하지 않습니다. 당신은 그것들만을 (증가 또는 감소) 어떤 값으로 UPDATE 할 수 있습니다. 카운터 열을 업데이트하는 방법은 다음과 같습니다.

    UPDATE ... SET name1 = name1 + <value> 

너는 물었다 :

"선호하는"방법을 사용할 수 있습니까? 또는 하나를 다른 것 위에 사용해야하는 경우가 있습니까?

예. 값을 데이터베이스에 삽입하는 경우 INSERT 를 사용할 수 있습니다. 열이 없으면 열이 생성됩니다. 그렇지 않으면 INSERT 의 효과는 UPDATE 와 유사합니다. INSERT 는 미리 설계된 스키마가없는 경우에 유용합니다 (동적 열 패밀리, 즉 아무 때나 삽입). 스키마를 손으로 설계하고 (RDMS와 비슷한 정적 컬럼 패밀리) 각 열을 알고 있으면 UPDATE 를 사용할 수 있습니다.


나는 이러한 솔루션의 대부분을 시도하고 최고의 hector를 찾으십시오. 어떤 문제가 있어도 freenode의 #cassandra에 hector를 작성한 사람들에게 언제나 접근 할 수 있습니다. 코드는 제가 우려하는 한 더 성숙합니다. 카산드라 클라이언트에서 가장 중요한 부분은 연결 풀링 관리입니다 (모든 클라이언트는 절약 작업을 통해 거의 동일한 작업을 수행하지만 연결 풀링은 높은 수준의 클라이언트 역할을 수행하기 때문에). 이 경우 1 년 넘게 생산 과정에서 문제가 발생하지 않았기 때문에 hector에 투표 할 것입니다. (문제가 발견되면 즉시 수정하여 문제에 대한 이메일을 보냅니다.)

나는 여전히 카산드라 0.6을 사용하고 있습니다.





cassandra cql cql3