Jointure multi serveurs [SqlServer] - SQL/NoSQL - Programmation
Marsh Posté le 21-10-2005 à 15:16:46
Tu comptes utiliser une table "link" ou "virtuelle" (je ne connais pas la terminologie SQLServer) ? 
 
Je pense que tu vas y perdre.
Marsh Posté le 21-10-2005 à 15:21:40
En gros, je compte utiliser çà : 
 
SELECT 
* 
FROM 
( 
 SELECT * FROM [NomTable] 
 UNION 
 SELECT * FROM [NomServeur2].[NomBase].[dbo].[NomTable] 
) _Union 
 
Je viens de faire un p'tit test pour la syntaxe, çà fonctionne 
Marsh Posté le 21-10-2005 à 15:34:13
euh... oublie cette syntaxe pour un dblink  
 
 
sinon, t'entends quoi comme "monstrueux" ? 
 
vire-moi tout ce suite de putain de UNION et met "UNION ALL", si tes tables sont grosses, tu vas déjà gagner 80% du temps de traîtement 
Marsh Posté le 21-10-2005 à 15:36:58
Donées en cours environ 20 000 000 de lignes 
Données archivées environ 120 000 000 de lignes 
Et sur les disques çà prend pas mal de gigas  
 
 
UNION ALL !?! je vais regader ds la doc ce que çà fait  
 
 
Tu proposes quoi comme syntaxe ( à part le UNION ALL ) ?
Marsh Posté le 21-10-2005 à 15:56:34
UNION, ça fait un distinct. 
 
UNION ALL, ça fait pas de distinct 
 
Et un distinct sur des millions de lignes, même avec un index unique, ben ça ramme tout ce que ça peut 
Marsh Posté le 21-10-2005 à 15:58:34
ReplyMarsh Posté le 21-10-2005 à 15:59:20
| betsamee a écrit : de toutes les facons SQL Server c est de la merde ca rame tout le temps  | 
 
Rooooh, mais tu sors, toi ! 
Marsh Posté le 21-10-2005 à 16:02:25
Bon je viens de tester le UNION ALL, verdict : aucun changement 
Marsh Posté le 21-10-2005 à 16:20:51
Voici un exemple avec des tables "relaivement volumineuses" sous SQL Server 2000 sur mon portable, et sans aucun index : 
 
| Code : 
 | 
Marsh Posté le 21-10-2005 à 16:30:09
T'es un p'tit joueur là ... 
 
SELECT COUNT(*), SUM ( Price ) 
FROM 
( 
 SELECT * FROM Ticket 
 UNION ALL 
 SELECT * FROM [NomServeur].dbo.ticket 
) _union 
 
Moi çà prend 5mn avec ou sans ALL 
 
100 484 796 de lignes au total ... 
Marsh Posté le 21-10-2005 à 16:54:34
je t'ai dis : 
-> portable (donc disque dur pourri et que 512 Mo de RAM) 
-> aucun index sur la table 
 
attends que je mette des index, tu va pleurer 
Marsh Posté le 21-10-2005 à 16:59:13
ceci dit, le coup du pareil avec ou sans all, ça vient du fait que t'as deux serveurs... une grande partie des 5 minutes est dûe au transfert des données sur le réseau. 
 
refait avec tout dans la même base. 
je met ma main à couper que le union all est 3 à 4 fois plus rapide 
Marsh Posté le 21-10-2005 à 17:00:58
Je viens de refaire le test en utilisant la même table ( comme ton exemple ) et çà ne change rien, même tps d'éxécution. 
 
Tu m'envoies ta main par La Poste ?  
 
Marsh Posté le 21-10-2005 à 17:03:10
 
 
 
c'est pas possible, t'as clairement un problème. il est rigoureusement impossible qu'un union all ne mette pas moins de temps qu'un union tout court
Marsh Posté le 21-10-2005 à 17:05:04
100 balles sur Arju. ![[:pingouino] [:pingouino]](https://forum-images.hardware.fr/images/perso/pingouino.gif)
Marsh Posté le 21-10-2005 à 17:05:17
merde, avec tes conneries, je suis en train de pourrir le serveur oracle de prod  
 
 
la base qui est sur mon Pc est un import dans sql server de cette base (donc même volumétrie) mais j'ai oublié que si le serveur est prod est bien plus gros, y'a plein de monde connectés dessus  
 
 
y'a tout qui ramme 
Marsh Posté le 21-10-2005 à 17:05:57
oracle c'est vraiment d'la merde  
 
 
c'est plus lent que mon portable sans index 
Marsh Posté le 21-10-2005 à 17:06:59
ah... j'y pense... un gus doit être en train de modifier ou saisir une commande, ça fait des lock sur les lignes... alors ma requête doit attendre pour les compter 
Marsh Posté le 21-10-2005 à 17:10:16
 
 
 
Zy va sur le serveur de prod... Ce gars est un dangereux.
Marsh Posté le 21-10-2005 à 18:15:30
ben y'a pas de serveur de test  
 
 
c'est marrant, en fait ma requete a été lockée par une transaction initiée par un utilisateur... qui s'est retrouvée bloquée par ma requete  
 
 
elle a perdu les 92 lignes de sa commande, elle était verte  
 
 
(c'est pas moi j'ai rien fait, mon toad n'était même pas ouvert ![[:ddr555] [:ddr555]](https://forum-images.hardware.fr/images/perso/ddr555.gif)
Marsh Posté le 22-10-2005 à 14:05:30
moi, perso pour faire ca, j'utilise la version pro de rammoir qui permet de booster ta mémoire vive
Marsh Posté le 24-10-2005 à 12:13:32
Voilà ce que je viens de tester de ma machine sur le serveur de dév : 
 
| Code : 
 | 
 
 
T'es sûr que le pb viens pas de ton côté ?  ![[:airforceone] [:airforceone]](https://forum-images.hardware.fr/images/perso/airforceone.gif) 
 
Marsh Posté le 24-10-2005 à 13:42:12
Entre "0" secondes et "1" seconde, je vois une différence notable moi. 
 
Ensuite, que ce soit 0 ou 1 seconde, il est où le problème ? C'est bien assez rapide non ?
Marsh Posté le 24-10-2005 à 13:43:04
PS: et comme j'ai dit, n'utilise pas de DBLink pour faire une requête de type UNION, sinon dans tous les cas, le contenu entier d'une des deux tables sera transmi via le réseau, tu auras donc dans tous les cas des perfs pourries
Marsh Posté le 24-10-2005 à 14:17:30
Là mon exemple sert juste à montrer qu'en utilisant EXACTEMENT la même syntaxe que toi, je n'arrive pas à avoir un écart significatif entre UNION et UNION ALL contrairement à ce que toi tu as !
Marsh Posté le 24-10-2005 à 14:19:31
Pour en revenir à ma jointure de base, la requête va être traitée séquentiellement ou en parallèle sur chaque serveur ? 
Marsh Posté le 24-10-2005 à 14:32:13
c'est pas une jointure, c'est un union 
pour cette raison, elle sera traîtée séquenciellement 
 
d'ailleurs, je pense qu'avec une jointure aussi : là t'es pas en mode load balancing, tu fais juste référence à une table distante, y'a qu'un seul serveur qui travaille
Marsh Posté le 28-10-2005 à 09:35:22
Marrant, je viens de retester le ALL ds une de mes requêtes, et là c'est bénéfique : 
| Code : 
 | 
 
 
et là je suis passé de 50~55s à 35~40s ( base de Prod, donc chuis pas le seul dessus ), juste en ajoutant le ALL après chaque UNION, sur cette requête bidon : 
| Code : 
 | 
 
 
( résultat : 17 702 845 de lignes ) 
Marsh Posté le 15-11-2005 à 10:32:35
Bon je reviens sur le topic  
 
 
Ma requête précédente est intégrée ds une vue TicketList. 
 
Cette requête 
     SELECT ... FROM TicketList WHERE ... ORDER BY BeginDate 
génére une "erreur réseau générale" !?! 
 
En virant le "ORDER BY BeginDate", çà marche !?! 
 
J'ai repassé les 4 "UNION ALL" en "UNION", et là le "ORDER BY BeginDate" fonctionne !?! 
 
Ube idée ?
Marsh Posté le 21-10-2005 à 15:10:25
J'ai une table 'données en cours' et une table 'données archivées' sur un serveur.
Les 2 tables sont monstreuses en volume.
Une jointure sur ces 2 tables fait mouliner le serveur.
Si je passe ma table 'données archivées' sur un 2ème serveur ( les 2 serveurs sont de même puissance et connectés en lan 1000Mb/s ) et que je fais une jointure entre mes 2 serveurs, la charge se trouve donc répartie sur 2 machines.
Je vais y gagner / perdre qqchose en durée de traitment ?