Question

Je voudrais connaître la différence de performance dans la mise à jour d'une table en utilisant la méthode suivante:

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;

ou comme ceci:

UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;

Quelqu'un at-il testé ceci ou savoir comment les mises à jour en utilisant le travail des curseurs afin qu'ils puissent commenter?

EDIT: J'ai maintenant benchmarkée cela et constaté qu'il est enfait environ un tiers plus rapide de faire le dernier exemple. J'ai couru chacune des requêtes 100000 fois et chronométré la différence. Je psycopg2 à l'aide des curseurs côté serveur pour communiquer avec Postgres. Je vais étudier plus pour voir si je peux trouver que ce n'est pas toujours le cas.

Était-ce utile?

La solution

Je ne suis pas familier avec PostgreSQL, donc je ne peux vous donner une réponse générique.

Tout d'abord, si indexed_int_column n'est pas unique, la deuxième déclaration mettra à jour plusieurs lignes, alors que le premier ne met à jour la ligne actuellement sous le c_films du curseur. Ainsi, les déclarations ne sont pas identiques.

En supposant l'unicité et les c_films du curseur étant à une ligne où indexed_int_column = 3000, puis mise à jour devrait être très rapide une fois que le curseur est placé sous une certaine ligne, que le curseur contient les informations pour accéder directement à l'emplacement physique de cette ligne. La deuxième déclaration devra toutefois chercher d'abord l'index, rechercher la valeur 3000 et alors seulement il connaître l'emplacement physique de la ligne mise à jour. Cela dit, cette opération recherche devait être fait pour le curseur à un point à (si nous ne l'avons pas itérer sur toute la table qui est). Donc, en général, il ne paie que hors d'utiliser le curseur, lorsque vous devez lire d'abord les données de toute façon, et que vous souhaitez ensuite mettre à jour la même ligne que vous venez de lire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top