Bonjour
Je suis un simple utilisateur d'une base de donnée qui requête de manière incrémentale, via un traitement périodique, une table particulière contenant plusieurs millions de lignes. Cette table a une séquence qui est également clé primaire, et qui est incrémentée via un trigger à chaque insertion de ligne.
Je fais donc mes requêtes incrémentales de manière assez basique (je ne sais pas s'il y a plus propre), en supposons que la séquence s'appelle ID_SEQ :
- Je stocke le max de la séquence de ma dernière requête incrémentale (ID_SEQ_1).
- Régulièrement je fais un "SELECT max(ID_SEQ) FROM my_table; " (requête qui a l'avantage d'être instantanée) et qui me renvoie donc un ID_SEQ_2.
- Si ID_SEQ_2 > ID_SEQ_1, je lance une requête SELECT avec un certain nombre de critères qui n'ont pas spécialement d'importance pour le pb qui me concerne, sauf celui ci : "ID SEQ > ID_SEQ_1 AND ID SEQ <= ID_SEQ_2" pour ne récupérer que les lignes que je n'ai pas déjà récupérées.
Jusqu'à peu je me disais que tout allait bien, et effectivement je n'avais jamais raté une seule nouvelle entrée. Puis j'ai réalisé en lançant des traitements ingérant chacun un très grand nombre de lignes (de l'ordre du million) que chacun d'entre eux ne faisait le commit qu'à la fin de tous ses insert.
Ainsi dès qu'il y a un lancement de plusieurs traitements en parallèle, il y a un phénomène d'entrelacement des valeurs de la séquence entre chaque traitement, donc rien ne garantit que les valeurs des séquences des nouvelles lignes "commitées" soient supérieures au max de la séquence calculé 1s avant, et donc je peux très bien rater des lignes dans le cas où les séquences s'entrelacent et que je teste le max de la séquence alors qu'un des traitements a commité ses INSERT mais pas les autres.
Alors la solution serait de faire un commit à chaque INSERT, mais j'ai cru comprendre que cela pouvait dégrader les performances et de toute façon je n'ai pas la main sur cette partie du code.
Ainsi ma question est : existe il un moyen sélectionner les nouvelles lignes insérées et comitées dans une table par rapport à un instant précédent dans ce contexte (tout en gardant mes perfos actuelles de quelques ms lorsque j'ai par exemple à récupérer 1000 nouvelles lignes dans ma table de 22M de lignes)?
Merci
Partager