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.
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
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é ?
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 ?