[SqlServer] Jointure multi serveurs

Jointure multi serveurs [SqlServer] - SQL/NoSQL - Programmation

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 ?

Reply

Marsh Posté le 21-10-2005 à 15:10:25   

Reply

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.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

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

Reply

Marsh Posté le 21-10-2005 à 15:34:13    

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
Reply

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

Reply

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

Reply

Marsh Posté le 21-10-2005 à 15:58:34    

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

Reply

Marsh 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 [:petrus75]  
:D


Rooooh, mais tu sors, toi ! :D


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 21-10-2005 à 16:02:25    

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

Reply

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

Reply

Marsh Posté le 21-10-2005 à 16:20:51   

Reply

Marsh Posté le 21-10-2005 à 16:22:08    

t pas doué :p

Reply

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

Reply

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

Reply

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

Reply

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

Reply

Marsh Posté le 21-10-2005 à 17:03:10    

: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

Reply

Marsh Posté le 21-10-2005 à 17:05:04    

100 balles sur Arju. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 21-10-2005 à 17:05:17    

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:

Reply

Marsh Posté le 21-10-2005 à 17:05:57    

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

Reply

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

Reply

Marsh Posté le 21-10-2005 à 17:10:16    

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


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 21-10-2005 à 18:15:30    

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]

Reply

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

Reply

Marsh Posté le 22-10-2005 à 16:02:07    

:heink: c'est quoi ce truc

Reply

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

Reply

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 ?

Reply

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

Reply

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 !

Reply

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 ?

Reply

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

Reply

Marsh Posté le 26-10-2005 à 16:50:44    

Merci bien monsieur :jap:

Reply

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

Reply

Marsh Posté le 15-11-2005 à 10:32:35    

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 ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed