2016-02-18 37 views
1

根據Question regarding Tombstone,爲什麼沒有upserts創建墓碑? 根據datastax文檔,每個upsert的How is data updated ?,cassandra認爲是刪除,然後插入,因爲插入的新時間戳會覆蓋舊的時間戳。舊時間戳數據必須標記爲與墓碑相關的刪除。爲什麼不用upsert在Cassandra中創建墓碑?

爲什麼我們有矛盾的說法?否則我在這裏錯過了什麼?

USECASE: 數據插入與卡桑德拉唯一鍵(UUID)和一些在這個數據列的不斷更新頻繁。你推薦哪種方法?

  1. 在 插入查詢中插入與新列值相同的數據。
  2. 使用更新查詢中的新列值更新基於給定的uuid 的現有記錄。

哪種方法做或不做墓碑?以及Cassandra如何處理這兩個查詢?

+0

[Cassandra and Tombstones:Creating a Row,Deleting the Row,Recreating the Row = Performance?]的可能重複(http://stackoverflow.com/questions/7293973/cassandra-and-tombstones-creating-a-row -deleting最行再創造最行) – RussS

回答

3

正如Russ指出的那樣,您可能需要閱讀關於此主題的其他類似問題。但是,upsert/overwrite只是另一個單元格,帶有一個名稱,一個時間戳和一個值。

墓碑就像一個覆蓋,除了它得到一個額外的字段,表明它已被刪除,所以它不會作爲有效的輸出返回。墓碑往往是有害的是,即使人們認爲數據已經消失,它們也可能積累在糟糕的數據模型中 - 跳過它們以獲取實時數據實際上需要內存。

當您按照您所描述的方式更新/插入時,您創建SHADOWS的單元格(廢棄)先前的單元格,這些單元格在壓縮時將被刪除。之前的單元格不是墓碑,即使它不再是實時/活動的 - 只要壓縮允許,它將被壓縮並完全替換爲新的實時最高時間戳值。

要記住的最重要的事情是:墓碑不一定是通過壓縮去除的 - 它們保持(持續/重寫)至少gc_grace_seconds,如果需要遮蔽/覆蓋其他sstables中的單元格尚未壓縮。正因爲如此,墓碑在很長一段時間內保留下來,但是一旦它們所處的狀態被壓縮,就會立即覆蓋陰影/被覆蓋的單元格。