Кассандра: загрузка части производительности столбцов таблицы - PullRequest
0 голосов
/ 16 июня 2019

Давайте рассмотрим эти две таблицы ...

CREATE TABLE IF NOT EXISTS lp_operations.campaign_changed (
  oe text,               // owner email                  
  ud timestamp,          // updated
  PRIMARY KEY((oe))
);

CREATE TABLE IF NOT EXISTS lp_operations.campaign_data (
  oe text,              // owner email
  kp set<text>,         // each text in set is serialized object in JSON
  ud timestamp,         // updated
  PRIMARY KEY((oe))
);

Если мы предположим, что количество строк и содержит "oe", значения "ud" идентичны.Следующие два выбора имеют одинаковый уровень производительности для Cassandra?

Select select1 = select().all().from("lp_operations", "campaign_changed").where(eq("oe", email)).limit(1);
CampaignChanged obj1 = cas.selectOne(select1, CampaignChanged.class);

Select select2 = select().column("oe").column("ud").from("lp_operations", "campaign_data").where(eq("oe", email)).limit(1);
CampaignData obj2 = cas.selectOne(select2, CampaignData.class);

Я хочу знать, не является ли второй выбор более сложным, чем первый.Если нет лишних накладных расходов.Например, если целые строки (все столбцы) были загружены внутри Кассандры и, следовательно, были выбраны нужные столбцы.

1 Ответ

4 голосов
/ 16 июня 2019

Производительность 2-го запроса может быть ниже, чем у первого, но на самом деле это зависит от нескольких факторов:

  • количество записей в set - не рекомендуется хранить более сотен элементов в типах коллекций;
  • размер текстовых записей;
  • сохраняете ли вы данные один раз или периодически обновляете записи в наборе - в этом случае данные для одного и того же раздела могут находиться в нескольких SSTable, которые необходимо прочитать.

Если вы никогда не выполняете частичное обновление данных, вы можете использовать frozen<set<text>> - в этом случае все данные набора будут храниться вместе и считываться одновременно, избегая поиска в нескольких SSTables (хотя он может искать в все SSTable для других полей).

Кроме того, учтите, что если вы постоянно выполняете этот запрос, то лучше не использовать SchemaBuilder , как вы показали, но лучше подготовить запрос один раз, а затем связать переменные в него для выполнения - в этом случае сервер не будет повторно анализировать запрос CQL при каждом запросе.

...