Chuis en train de patater le serveur de prod SQL Server - SQL/NoSQL - Programmation
Marsh Posté le 02-08-2005 à 10:17:34
Ca fait quand même 20 minutes qu'il pédale dans la semoule... Et pourtant je tape que dans deux table.
Ca inspire le respect non ?
Marsh Posté le 02-08-2005 à 10:47:31
non, tu tapes une fois dans asset et 5 fois dans assethist
et puis je vois pas trop pourquoi tu tapes autant de fois dans assethist, tu pourrais grouper quelques unes des sous-requêtes, non ?
Par exemple :
Code :
|
Marsh Posté le 02-08-2005 à 11:02:37
j'avais pas envie
Ca fait une heure que ça tourne
Je vais tester ta requête pour voir
Marsh Posté le 02-08-2005 à 11:46:34
Et d'ailleurs je comprends pas trop la jointure sur assethist (ah), le *= est une jointure externe ?
Que vient faire le not exists ???
Et pourquoi sélectionner isnull(a.assetid, ah.assetid) quand on fait un group by a.assetid, ah.assetid ?
Un peu étrange ta requête quand même
Marsh Posté le 02-08-2005 à 12:27:10
le exists vient faire une jointure *=* c'est à dire une "full join" que SQL Server ne supporte pas.
En fait, je peux avoir des données dans "assethist" qui ne sont pas dans "asset", tout comme je peux avoir des données dans "asset" qui ne sont pas dans "assethist".
Et moi, je veux l'état de la table Asset d'il y a 14 jours
Il y a un trigger sur Asset qui recopie les valeurs initiales dans AssetHist à chaque fois qu'on modifie une ligne d'Asset.
Ensuite, lorsqu'on supprime un Asset, il est physiquement supprimé de cette table, mais un champ "deletedDate" est rempli dans la table AssetHist pour la ligne où on a recopié la ligne supprimée.
Ensuite, pour une raison inconnue (certainement des modifications de la table via Access) il peut y avoir pour la même milli-seconde près une dizaine de lignes... avec un flag "active" différent dans la table AssetHist.
Evidement, dès qu'on trouve un I (inactif, il faut écarter l'asset).
Enfin... C'est un peu le bordel.
Ta requête est aussi lente que la mienne et elle est fausse (à cause de cette histoire de flags différents à deux heures identiques)
Là, le dev qui s'occupe de ça s'amuse à rechercher tous les assets qui datent de plus de 14 jours dans une table temporaire, et les vire à coup de delete en fonction des cas spécifiques. C'est un peu le bordel, mais c'est bien plus rapide, j'ai l'impression que c'est la seule solution sans pourrir le serveur (il est en dessous des 2 minutes)
Marsh Posté le 02-08-2005 à 12:28:09
sinon, le group by sous SQL Server peut ne porter que sur les champs qui participent aux lignes retournées, pas besoin de recopier les expression comme dans Oracle, MySQL ou PostGre (petite simplification maison chez Microsoft)
Marsh Posté le 02-08-2005 à 12:29:30
Ah nan, il a abandonné la table temporaire, il a juste un truc qui fait 20 pages de long. M'enfin ça tourne en 10 secondes, c'est pas mal
Marsh Posté le 02-08-2005 à 13:51:41
Je squatte ton post pour demander si quelqu'un sait comment faire un *= en MySQL
Merci
P.S : Avec ma table avec des milions de lignes je patate mon serveur beaucoup plus violemment
Marsh Posté le 02-08-2005 à 13:57:51
C'est toujours pour le bench Arjuna?
(Dsl ca fait une semaine que je suis déco)
Marsh Posté le 02-08-2005 à 14:57:29
Nope, c'est juste une requête que dois faire un collègue pour une appli
Code :
|
Sinon, un *= c'est un "left outer join".
Marsh Posté le 02-08-2005 à 15:49:06
V'là le bouquet final :
Ca ressemble presque à de l'ASCII-art
Code :
|
Marsh Posté le 02-08-2005 à 10:16:02
Entre les sous-select à gogo sur une table de 800 000 lignes et l'émulation du "FULL JOIN", il n'a pas l'air d'apprécier des masses