Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1449 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SqlServer] Jointure multi serveurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SqlServer] Jointure multi serveurs

n°1228114
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 15:10:25  profilanswer
 

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 ?

mood
Publicité
Posté le 21-10-2005 à 15:10:25  profilanswer
 

n°1228121
sircam
I Like Trains
Posté le 21-10-2005 à 15:16:46  profilanswer
 

Tu comptes utiliser une table "link" ou "virtuelle" (je ne connais pas la terminologie SQLServer) ?
 
Je pense que tu vas y perdre.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1228126
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 15:21:40  profilanswer
 

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 :jap:

n°1228139
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 15:34:13  profilanswer
 

euh... oublie cette syntaxe pour un dblink :D
 
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 :o


Message édité par Arjuna le 21-10-2005 à 15:34:46
n°1228141
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 15:36:58  profilanswer
 

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 :jap:
 
Tu proposes quoi comme syntaxe ( à part le UNION ALL ) ?

n°1228165
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 15:56:34  profilanswer
 

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 :)

n°1228168
betsamee
Asterisk Zeperyl
Posté le 21-10-2005 à 15:58:34  profilanswer
 

de toutes les facons SQL Server c est de la merde ca rame tout le temps [:petrus75]  
:D

n°1228170
sircam
I Like Trains
Posté le 21-10-2005 à 15:59:20  profilanswer
 

betsamee a écrit :

de toutes les facons SQL Server c est de la merde ca rame tout le temps [:petrus75]  
:D


Rooooh, mais tu sors, toi ! :D


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1228172
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 16:02:25  profilanswer
 

Bon je viens de tester le UNION ALL, verdict : aucun changement :D

n°1228192
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 16:20:51  profilanswer
 

Voici un exemple avec des tables "relaivement volumineuses" sous SQL Server 2000 sur mon portable, et sans aucun index :
 

Code :
  1. select count(*) from evp
  2. => 410184 lignes
  3. => 15 secondes
  4. select count(*)
  5. from
  6. (
  7. select *
  8. from evp
  9. where codsoc = 2
  10. ) tmp
  11. => 406802 lignes
  12. => 15 secondes
  13. select count(*)
  14. from
  15. (
  16. select *
  17. from evp
  18. where codsoc = 3
  19. ) tmp
  20. => 1878 lignes
  21. => 17 secondes
  22. select count(*)
  23. from
  24. (
  25. select *
  26. from evp
  27. where codsoc = 2
  28. union
  29. select *
  30. from evp
  31. where codsoc = 3
  32. ) tmp
  33. => 408680 lignes
  34. => 157 secondes (il s'est mis à swapper comme un porc à partir de 90 secondes)
  35. select count(*)
  36. from
  37. (
  38. select *
  39. from evp
  40. where codsoc = 2
  41. union all
  42. select *
  43. from evp
  44. where codsoc = 3
  45. ) tmp
  46. => 408680 lignes
  47. => 32 secondes (pour le même résultat !)

mood
Publicité
Posté le 21-10-2005 à 16:20:51  profilanswer
 

n°1228193
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 16:22:08  profilanswer
 

t pas doué :p

n°1228209
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 16:30:09  profilanswer
 

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

n°1228236
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 16:54:34  profilanswer
 

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 :p

n°1228239
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 16:59:13  profilanswer
 

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 :o

n°1228241
WhyMe
HFR ? Nan, connais pas ...
Posté le 21-10-2005 à 17:00:58  profilanswer
 

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 ? :D

n°1228245
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 17:03:10  profilanswer
 

:heink:
 
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

n°1228248
sircam
I Like Trains
Posté le 21-10-2005 à 17:05:04  profilanswer
 

100 balles sur Arju. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1228249
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 17:05:17  profilanswer
 

merde, avec tes conneries, je suis en train de pourrir le serveur oracle de prod :D
 
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 :D
 
y'a tout qui ramme :whistle:

n°1228251
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 17:05:57  profilanswer
 

oracle c'est vraiment d'la merde :D
 
c'est plus lent que mon portable sans index :D

n°1228252
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 17:06:59  profilanswer
 

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 :D

n°1228257
sircam
I Like Trains
Posté le 21-10-2005 à 17:10:16  profilanswer
 

:ouch:
 
Zy va sur le serveur de prod... Ce gars est un dangereux.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1228342
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-10-2005 à 18:15:30  profilanswer
 

ben y'a pas de serveur de test :o
 
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 :D
 
elle a perdu les 92 lignes de sa commande, elle était verte :D
 
(c'est pas moi j'ai rien fait, mon toad n'était même pas ouvert [:ddr555]

n°1228714
nini_404
Posté le 22-10-2005 à 14:05:30  profilanswer
 

moi, perso pour faire ca, j'utilise la version pro de rammoir qui permet de booster ta mémoire vive

n°1228737
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-10-2005 à 16:02:07  profilanswer
 

:heink: c'est quoi ce truc

n°1229533
WhyMe
HFR ? Nan, connais pas ...
Posté le 24-10-2005 à 12:13:32  profilanswer
 

Voilà ce que je viens de tester de ma machine sur le serveur de dév :
 

Code :
  1. select count(*) from invoiceline
  2. => 1219688 lignes
  3. => 0 secondes
  4. select count(*)
  5. from
  6. (
  7. select *
  8. from invoiceline
  9. where ID_InvoiceLineType = 1
  10. ) tmp
  11. => 578295 lignes
  12. => 11 secondes
  13. select count(*)
  14. from
  15. (
  16. select *
  17. from invoiceline
  18. where ID_InvoiceLineType = 2
  19. ) tmp
  20. => 101077 lignes
  21. => 0 secondes
  22. select count(*)
  23. from
  24. (
  25. select *
  26. from invoiceline
  27. where ID_InvoiceLineType = 1
  28. union
  29. select *
  30. from invoiceline
  31. where ID_InvoiceLineType = 2
  32. ) tmp
  33. => 679372 lignes
  34. => 1 secondes
  35. select count(*)
  36. from
  37. (
  38. select *
  39. from invoiceline
  40. where ID_InvoiceLineType = 1
  41. union all
  42. select *
  43. from invoiceline
  44. where ID_InvoiceLineType = 2
  45. ) tmp
  46. => 679372 lignes
  47. => 0 secondes


 
T'es sûr que le pb viens pas de ton côté ?  [:airforceone]

n°1229601
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-10-2005 à 13:42:12  profilanswer
 

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 ?

n°1229603
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-10-2005 à 13:43:04  profilanswer
 

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

n°1229630
WhyMe
HFR ? Nan, connais pas ...
Posté le 24-10-2005 à 14:17:30  profilanswer
 

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 !

n°1229633
WhyMe
HFR ? Nan, connais pas ...
Posté le 24-10-2005 à 14:19:31  profilanswer
 

Pour en revenir à ma jointure de base, la requête va être traitée séquentiellement ou en parallèle sur chaque serveur ?

n°1229646
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-10-2005 à 14:32:13  profilanswer
 

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

n°1231691
WhyMe
HFR ? Nan, connais pas ...
Posté le 26-10-2005 à 16:50:44  profilanswer
 

Merci bien monsieur :jap:

n°1233174
WhyMe
HFR ? Nan, connais pas ...
Posté le 28-10-2005 à 09:35:22  profilanswer
 

Marrant, je viens de retester le ALL ds une de mes requêtes, et là c'est bénéfique :

Code :
  1. SELECT
  2. TicketsUnion.*,
  3. NationalCallType.ID_NationalCallType AS ID_NationalCallType,
  4. NationalCallType.Description AS NationalCallType,
  5. InternationalCallType.Name AS InternationalCallType,
  6. PeriodType.ID_PeriodType AS ID_PeriodType,
  7. PeriodType.Description AS PeriodCallType,
  8. dbo.ConvertDuration ( duration ) AS FormattedDuration,
  9. ContractList.ID_Customer AS ID_Customer,
  10. ContractList.ID_Contract
  11. FROM
  12. (
  13. SELECT * FROM Ticket
  14. UNION ALL
  15. SELECT * FROM ProdInvoiced_200401_200406.dbo.ticket
  16. UNION ALL
  17. SELECT * FROM ProdInvoiced_200407_200412.dbo.ticket
  18. UNION ALL
  19. SELECT * FROM ProdInvoiced_200501_200506.dbo.ticket
  20. UNION ALL
  21. SELECT * FROM ProdInvoiced_200507_200512.dbo.ticket
  22. ) TicketsUnion
  23. INNER JOIN PhoneLine ON PhoneLine.ID_PhoneLineVoiceInfo = TicketsUnion.ID_PhoneLineVoiceInfo
  24. INNER JOIN ContractList ON ContractList.ID_Contract = PhoneLine.ID_Contract
  25. LEFT JOIN NationalTariff ON NationalTariff.ID_NationalTariff = TicketsUnion.ID_NationalTariff
  26. LEFT JOIN NationalCallType ON NationalCallType.ID_NationalCallType = NationalTariff.ID_NationalCallType
  27. LEFT JOIN InternationalTariff ON InternationalTariff.ID_InternationalTariff = TicketsUnion.ID_InternationalTariff
  28. LEFT JOIN InternationalCallType ON InternationalCallType.ID_InternationalCallType = InternationalTariff.ID_InternationalCallType
  29. LEFT JOIN PeriodType ON PeriodType.ID_PeriodType = NationalTariff.ID_PeriodType


 
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 :
  1. select count(*) from ticketlist where id_invoice <= 250000


 
( résultat : 17 702 845 de lignes )

n°1245834
WhyMe
HFR ? Nan, connais pas ...
Posté le 15-11-2005 à 10:32:35  profilanswer
 

Bon je reviens sur le topic :D
 
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 ?

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SqlServer] Jointure multi serveurs

 

Sujets relatifs
delete avec jointureMySQL jointure directement dans MySQLAdmin
SQLSERVERTransfert auto entre deux serveurs :)
Requete sql appelant deux serveurs differents??Appli multi sgbd
faire un update avec une jointure oracleTri multi tableaux
[SQLServer]Erreur OleDBinclude, parametre, deux serveurs
Plus de sujets relatifs à : [SqlServer] Jointure multi serveurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR