[FIREBIRD] améliorer UPDATE ... WHERE VAR IN(SELECT...)

RV2931 Messages postés 185 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 16 juillet 2016 - 12 déc. 2011 à 16:15
RV2931 Messages postés 185 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 16 juillet 2016 - 13 déc. 2011 à 14:29
Bonjour,

J'effectue actuellement des requêtes imbriquées sous la forme

UPDATE T1
SET T1.F1 = 'FOO'
WHERE T1.ID IN
(
SELECT T1.ID
FROM T1
WHERE T1.F2 = 'FIGHTERS'
)


Mon problème c'est que ça fonctionne, mais que sous Firebird 2.1, ça met juste 15 minutes pour faire ce genre de requête. Genre je mets juste 10 fois moins de temps à faire le SELECT à la main, exporter la liste d'ID et les mettre entre virgules, puis faire l'UPDATE avec un truc du genre :

UPDATE T1
SET T1.F1 = 'FOO'
WHERE T1.ID IN
(
1002,1402,4531,4153,45632,756,7565,789
)

Ce qui pour le coup va tout de même déjà 8 fois plus vite en mettant une liste plutôt qu'un SELECT.
J'ai l'impression que pour la forme UPDATE + SELECT imbriqué, le moteur réexécute le SELECT à chaque ligne du résultat. Ainsi si le select à 1000 records, il executera 1000 fois le SELECT.
Je ne vois que ça pour expliquer le temps qu'il met pour faire des choses aussi simples.

Comment puis-je faire pour faire la même chose mais de façon plus optimisée.
On m'a parlé de HAVING, mais FIREBIRD ne semble pas accepter le HAVING pour UPDATE... :o/

Merci d'avance à la personne qui me donnera la solution
Hervé

L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
A voir également:

2 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
13 déc. 2011 à 10:15
Bonjour ,

tu as essayé simplement ?

UPDATE T1
SET F1 = 'FOO'
WHERE F2 = 'FIGHTERS'


Bonne journée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
RV2931 Messages postés 185 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 16 juillet 2016
13 déc. 2011 à 14:29
L'exemple donné était un exemple peut-être un peu trop léger je l'accorde
Il est évident que la "sous-requête" est généralement bien plus complexe et sur plusieurs tables.
A priori, Firebird, en version 2.1, n'accepte pas les UPDATE utilisant plusieurs tables, d'où cette méthode de faire une sous requête pour répertorier les lignes à changer, et filer cette liste, résultat d'une requête assez complexe, à un un simple UPDATE.

Pour faire ce que je veux faire finalement, je pense que la méthode d'utiliser les BLOC et PROCEDURE ne seraient pas plus mal, par contre j'ai beaucoup de mal à trouver de bons tutoriaux là dessus appliqué à Firebird qui connait tout de même quelques limitations à priori...
Cela consisterait à executer le SELECT, stocker le resultat dans un tableau et réaliser l'UPDATE sur chacun de ses resultats.
Je crois qu'avec une procedure, ce serait assez simple, mais comme je l'ai dit, je nage un peu dans l'inconnu. :o/


L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
0
Rejoignez-nous