SynSql permet d'exécuter des requêtes sur différents types d'objets. Par ordre alphabétique : broker, cluster, tables et utilisateurs.
- Toutes celles qui ne concernent pas les tables sont analysées et exécutées par le synsql broker qui les reçoit. Pratiquement toutes impliquent des lectures ou des écriture dans les master brokers. Ces requêtes ne posent pas de difficulté : Elles rapporternt le résultat attendu. Par exemple, la requête "show datacenters" rapportera exactement la liste des datacenters définis dans le cluster.
- Certaines de celles qui concernent les tables ont des particularités qui sont l'objet de ce chapitre.
Cette instruction permet d'ajouter une rangée dans une table. Le synsql broker qui la reçoit examine la valeur qui est fournie pour la clef de hachage. Il calcule le hachage de la clef et fait exécuter la requête d'insertion par les data brokers concernés.
L'option as select n'est pas supportée.
Il n'est pas possible non plus d'insérer plusieurs rangées dans une même instruction d'insertion.
Le synsql broker qui reçoit la requête provoque son exécution sur chacune des partitions de la table. Pour chaque partition, il exclut les segment désynchronisés et ceux qui sont portés par des serveurs hors ligne. S'il ne parvient pas à se connecter à un data broker, il interroge l'homologue suivant. Il se charge des clauses de tri.
Le synsql broker ne fait rien d'autre que d'interroger les data brokers et retourner les différente rangées qu'il reçoit. En conséquence, les fonction d'agrégat et de groupement ne sont pas correctement supportées:
- L' ordre select count(*) from ... retourne autant de valeurs que la table ne possède de partitions. Chaque valeur indiquant le nombre de rangées contenu dans chacune d'entre-elles. L'utilisation de fonctions telles que moyenne, écart-type, variance, min, max, etc. conduit à des résultats similaires.
- Toute clause group by sera prise en compte par chacun des data brokers qui va la recevoir, mais le synsql broker qui va provoquer leur exécution ne sait pas regrouper les lignes et aggréger les données.
A réception d'une jointure ou d'un produit cartésien, le synsql broker extrait la première table qui suit le mot clef from. Il provoque ensuite l'exécution de la requête sur chacune des partitions de la table exactement comme si la requête ne concernait que cette table. Il se charge du tri des rangée si besoin.
La cohérence globale des données retournées ne peut être garantie. Chaque data broker ne peut exécuter la requête qu'il reçoit que sur les données qu'il possède.
Prenons à titre d'exemple deux tables stockées chacune en un seul exemplaire: une table de commandes et une autre de lignes de commandes. Chacune utilise comme clef de hachage un identifiant de commande. Si la table des commandes est stockée sur une seule partition et si celle des ligne l'est sur deux partitions alors une requête de jointures entre ces deux tables sur l'identifiant de commande:
- Ne retournera aucune ligne si les deux tables n'ont pas un data broker commun.
- Retournera une ~moitié des rangées si les deux tables ont un data broker commun.
- Ne retournera jamais les données attendues par l'utilisateur, quoi qu'il arrive.
La solution pour l'exemple ci dessus est de forcer les deux tables à posséder le même nombre de partitions et faire en sorte que chacune de leurs partitions soit, à clef égale, stockée par le même data broker. Ce qui correspond au modèle en étoile, présenté au chapitre suivant.
Les instructions update et delete fonctionnent normalement si elles ne comportent pas de clause where.
Si elles comportent une clause where qui porte exactement sur les colonnes de la table, elles produisent le résultat attendu.
Dans les cas plus complexes, elles ne produisent le résultat attendu qu'à la condition que chaque data broker en charge de leur exécution possèdent les données nécessaires. En reprenant l'exemple du paragraphe précédent, un ordre de mise à jour de lignes de commande relatives aux commandes d'un client particulier aura un effet partiel ou nul. Le modèle en étoile présenté au chapitre suivant peut être une solution. Sinon il faut utiliser des moyens programatiques.
| 15 Jan 2026 07:15:06 | English version |