2017-04-24 10 views
0

Considérons que nous avons tableau ci-dessous, en réalité, laisse supposer ce tableau a plus de 40 colonnesmise à jour Cassandra CQL vs update objet Mapper, ce qui aura un impact sur les performances de lecture

CREATE TABLE IF NOT EXISTS employee_by_id (
    employee_id text, 
    first_name text, 
    middle_name text, 
    last_name text, 
    date_of_birth date, 
    joining_date date, 
    role_id text, 
    role_name text, 
    dept_id text, 
    dept_name text, 
    reporting_manager_id text, 
    reporting_manager_name text, 
    created_on timestamp, 
    created_by text, 
    updated_on timestamp, 
    updated_by text, 
    status text 
    PRIMARY KEY (employee_id) 
); 

Il y a un scénario pour mettre à jour les détails du service, les colonnes dept_id et dept_name.

Il y a 2 façons cette mise à jour peut être fait,

1. Cassandra Objet Mapper

En supposant que le mappeur objet fonctionne sur l'objet entier, il met à jour toutes les colonnes, y compris la ceux qui n'ont pas été modifiés dans le scénario ci-dessus.

2. CQL mise à jour requête

UPDATE employee_by_id set 
    dept_id = 'A100', 
    dept_name = 'General Accounts', 
    updated_on = '2017-04-24T00:00:00.000Z', 
    updated_by = 'arun' 
WHERE 
    employee_id = 'E04500'; 

Comprendre:

  1. Après la mise à jour, lorsque l'enregistrement est lu Cassandra, le contrôle de l'opération de lecture chacun et tous les colonne pour savoir quelle est la dernière en fonction de l'horodatage de ces colonnes. Si la table employee_by_number mentionnée ci-dessus est mise à jour à l'aide du mappeur d'objet, alors Cassandra doit vérifier/comparer les 17 colonnes pour trouver la dernière de toutes ces dernières.

  2. Dans l'autre cas de mettre à jour seulement 4 colonnes en utilisant la mise à jour CQL , cassandra doit vérifier/comparer seulement ces 4 colonnes pour trouver la dernière de celles-ci.

Question:

  1. Est-ce que je comprends bien?

  2. Quelle est la méthode préférée de mise à jour, en utilisant la mise à jour CQL pour définir 4 champs ou mettre à jour toutes les colonnes en utilisant object mapper même si seulement 4 champs sont en cours de modification?

  3. Si les deux mises à jour sont bonnes et n'affectent pas les performances, y a-t-il un scénario dans lequel nous ne devrions pas utiliser le mappeur d'objet pour les mises à jour?

  4. Mise à jour de CQL par rapport à la mise à jour d'Object Mapper, ce qui aura un impact sur les performances de lecture lorsque les mises à jour sont effectuées uniquement sur quelques colonnes.

Répondre

0

En utilisant CQL Recherche

Si vous pouvez insérer/mettre à jour en utilisant la requête CQL, il est préférable. Mais vous devez écrire manuellement le code de requête pour chaque combinaison de mise à jour.

utilisant l'objet Mapper

Vous ne devez pas écrire la requête pour chaque combinaison d'insertion/mise à jour. Le mappeur d'objet prend automatiquement soin de cela.

Mais rappelez-vous

lors de l'enregistrement des données à Cassandra, Par défaut Cassandra Objet Mapper sauver tout le champ déclaré dans l'entité de table.

Si vous n'avez pas défini de valeur de champ, la valeur par défaut est null, à l'exception du champ primitif. Ainsi la valeur nulle sera insérée dans Cassandra avec Object Mapper, la pierre tombale sera générée. Tombstone prend de la place et peut augmenter considérablement la quantité de stockage dont vous avez besoin. Poser des tables avec un grand nombre de pierres tombales provoque des problèmes de performance et provoque une pression de latence et de tas.

En savoir plus sur Tombstone: https://opencredo.com/cassandra-tombstones-common-issues/

Par ailleurs, vous pouvez changer la valeur par défaut de l'option Mapper enregistrer:

mapper.setDefaultSaveOption(saveNullFields(false)); 

qui va ignorer le champ de valeur nulle lors de l'insertion.

Un autre problème avec Object Mapper, Supposons que vous avez déclaré un champ avec un type primitif. Si vous n'avez pas défini ce champ, la valeur par défaut 0 sera utilisée (la valeur par défaut du type primitif est 0).

Maintenant, pour la première fois que vous avez défini ces valeurs, disons plus de 0. Alors Object Mapper enregistre ces valeurs. Après que vous n'avez pas spécifié ces valeurs, votre valeur sera remplacée par la valeur par défaut 0.

+0

Mes questions ne concernent pas la définition de valeurs nulles, mais plutôt le stockage ou la définition de la même valeur dans une colonne. En d'autres termes, il s'agit de mettre à jour des champs avec la même valeur et l'impact. Pouvez-vous s'il vous plaît lire la question et mettre à jour votre réponse de manière appropriée? –

+0

@ArunBC La requête CQL est préférable à utiliser, mais si vous utilisez Object Mapper, comment le mappeur d'objet suppose-t-il savoir quel champ a été mis à jour ou non? Je viens de montrer que –

+0

Pouvez-vous répondre à mes 4 questions au bas de mon message? Il s'agit de lire les performances lors d'une mise à jour partielle en utilisant CQL vs mise à jour complète en utilisant le mappeur d'objet. Si vous pensez que vous avez déjà répondu pas de soucis –