Кассандра и надгробия: Создание ряда, Удаление ряда, Воссоздание ряда = Производительность? - PullRequest
7 голосов
/ 03 сентября 2011

Может кто-нибудь объяснить, какое влияние на надгробия оказывает следующий процесс:

1.) Создание «строки» с ключом «1» («Поля»: пользователь, пароль, дата)

2.) Удаление строки с помощью ключа «1»

3.) Создание «строки» с ключом «1» («Поля»: user, password, logincount)

Последовательность выполняется в одном потоке последовательно (поэтому это происходит с относительно высокой «скоростью» = без долгих пауз между действиями).

Мои вопросы:

1.) Как это влияет на создание надгробной плиты. После 2.) надгробие создано / существует. Но что произойдет с существующей надгробной плитой, если новая (слегка измененная строка) будет создана снова под тем же ключом (в процессе Step 3.)). Может ли Кассандра «реанимировать» надгробия очень эффективно?)

2.) Насколько хуже описанный выше процесс по сравнению с очень целенаправленным удалением date «поля» и последующим созданием поля «logincount»? (Скорее всего, он будет более производительным. Но, наоборот, гораздо сложнее выяснить, какие поля были удалены по сравнению с простым удалением всей строки и воссоздать ее с нуля с правильными данными ...)

Примечание / Update:

Что я на самом деле хочу сделать, так это установить для поля "date" значение null. Но это не работает в Кассандре. Нули не допускаются для значений. Поэтому в случае, если я хочу установить его на ноль, я должен удалить его. Но я боюсь, что этот явный второй запрос на удаление окажет негативное влияние на производительность (по сравнению с просто установкой его на ноль) ... И, как описано, я должен сначала выяснить, какие поля имеют нулевое значение и в первую очередь имеют значение (я должен сравнить все атрибуты для этого состояния ...)

Большое спасибо! Markus

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

Я бы с некоторым опозданием уточнил кое-что здесь.

Во-первых, относительно ответа Теодора:

1) Для простоты все строки имеют внутреннюю область надгробий, поэтому, когда новая строка объединяется с надгробной плитой, она просто становится «строкой с новыми данными, которая также помнит, что она была однажды удалена в момент X». Так что в этом отношении нет реального наказания.

2) Неправильно говорить, что «если вы создаете и удаляете значение столбца достаточно быстро, чтобы в середине не происходило смыва ... надгробная плита просто отбрасывается»; Надгробия всегда сохраняются, для правильности. Возможно, ситуация, о которой думал Теодор, была наоборот: если вы удалите, а затем вставите новое значение столбца, тогда новый столбец заменит надгробную плиту (как и любое устаревшее значение). Это отличается от случая строки, поскольку столбец является «атомом» хранилища.

3) Учитывая (2), delete-row-and-insert-new-one, вероятно, будет более производительным, если со временем будет удалено много столбцов. Но для одного столбца разница незначительна.

Наконец, что касается ответа Тайлера, по моему мнению, более идиоматично просто удалять рассматриваемый столбец, чем изменять его значение на пустую строку [байта].

4 голосов
/ 05 сентября 2011

1). Если вы удалите всю строку , надгробная плита все еще сохраняется и не реанимируется при последующей вставке в шаге 3. Это потому, что, возможно, вставка для строки была сделана давно (например, шаг 0 : клавиша "1", поле "имя"). Строка «1» с ключом «name» должна оставаться удаленной, а строка «1» с ключом «user» реанимируется.

2). Если вы создаете и удаляете значение столбца достаточно быстро, чтобы в середине не происходило очистки, это не повлияет на производительность. Столбец будет обновлен на месте в Memtable, а надгробие просто сброшено. Только одно значение будет постоянно записываться в SSTable.

Однако, если Memtable записывается на диск между шагами 2 и 3, надгробная плита будет записана в результирующий SSTable. Последующий сброс запишет новое значение в следующий SSTable. Это замедлит последующее чтение, поскольку теперь столбец нужно читать как из SSTable, так и согласовывать. (Аналогично, если между шагами 1 и 2 происходит сброс).

1 голос
/ 04 сентября 2011

Просто установите в столбце «дата» пустую строку.Это то, что обычно используется вместо нуля.

Если вы хотите удалить столбец, просто удалите столбец явно вместо удаления всей строки.Эффект производительности подобен написанию пустой строки для значения столбца.

...