Кассандра и надгробия: Создание ряда, Удаление ряда, Воссоздание ряда = Производительность?
Может ли кто-нибудь объяснить, какое влияние на надгробия оказывает следующий процесс:
1.) Создание "строки" с ключом "1" ("Поля": пользователь, пароль, дата)
2.) Удаление строки с ключом "1"
3.) Создание "Строки" с ключом "1" ("Поля": пользователь, пароль, логин)
Последовательность выполняется в одном потоке последовательно (так что это происходит с относительно высокой "скоростью" = без долгих пауз между действиями).
Мои вопросы:
1.) Как это влияет на создание надгробной плиты. После 2.)
надгробие создано / существует. Но что происходит с существующей надгробной плитой, если новая (слегка измененная строка) создается снова под тем же ключом (в процессе Step 3.)
). Может ли Кассандра "реанимировать" надгробия очень эффективно?)
2.) Насколько хуже описанный выше процесс по сравнению с очень целенаправленным удалением date
"поле", а затем создание "logincount
"вместо поля?" (это, скорее всего, будет более производительным. Но, наоборот, гораздо сложнее выяснить, какие поля были удалены, по сравнению с простым удалением всей строки и воссозданием ее с нуля с правильными данными..)
Замечание /Update:
Что я на самом деле хочу сделать, это установить "date"
поле для null
, Но это не работает в Кассандре. Нули не допускаются для значений. Поэтому в случае, если я хочу установить его на ноль, я должен удалить его. Но я боюсь, что этот явный второй запрос на удаление окажет негативное влияние на производительность (по сравнению с просто установкой его на ноль)... И, как описано, я должен сначала выяснить, какие поля имеют нулевое значение и, в первую очередь, имеют значение (я должен сравнить все атрибуты для этого состояния...)
Большое спасибо! Markus
3 ответа
Я хотел бы с некоторым запозданием уточнить некоторые вещи здесь.
Во-первых, относительно ответа Теодора:
1) Все строки для простоты имеют внутреннее поле надгробной плиты, поэтому, когда новая строка объединяется с надгробной плитой, она просто становится "строкой с новыми данными, которая также помнит, что она была однажды удалена во время X". Так что в этом отношении нет реального наказания.
2) Неправильно говорить, что "если вы создаете и удаляете значение столбца достаточно быстро, чтобы в середине не происходило смыва... надгробная плита просто отбрасывается"; Надгробия всегда сохраняются, для правильности. Возможно, ситуация, о которой думал Теодор, была противоположной: если вы удалите, а затем вставите новое значение столбца, тогда новый столбец заменит надгробную плиту (как и любое устаревшее значение). Это отличается от случая строки, поскольку столбец является "атомом" хранилища.
3) Учитывая (2), delete-row-and-insert-new-one, вероятно, будет более производительным, если со временем будет удалено много столбцов. Но для одного столбца разница незначительна.
Наконец, что касается ответа Тайлера, по моему мнению, более просто идиоматично просто удалить рассматриваемый столбец, чем изменить его значение на пустую строку [байта].
1). Если вы удалите всю строку, то надгробная плита все еще сохраняется и не реанимируется при последующей вставке на шаге 3. Это потому, что, возможно, вставка для строки была сделана давно (например, шаг 0: клавиша "1", поле "имя"). Строка "1" с ключом "name" должна оставаться удаленной, а строка "1" с ключом "user" реанимируется.
2). Если вы создаете и удаляете значение столбца достаточно быстро, чтобы в середине не происходило очищение, это не повлияет на производительность. Столбец будет обновлен на месте в Memtable, а надгробие просто сброшено. Только одно значение будет постоянно записываться в SSTable.
Однако, если Memtable записывается на диск между шагами 2 и 3, надгробная плита будет записана в результирующий SSTable. Последующий сброс запишет новое значение в следующий SSTable. Это замедлит последующее чтение, поскольку теперь столбец нужно читать как из SSTable, так и согласовывать. (Аналогично, если между шагами 1 и 2 происходит сброс).
Просто установите в столбце "дата" пустую строку. Это то, что обычно используется вместо нуля.
Если вы хотите удалить столбец, просто удалите столбец явно вместо удаления всей строки. Эффект производительности подобен написанию пустой строки для значения столбца.