2016-10-05 6 views
1

Ich habe folgende 2 Klassen Person (mit PersonKey) und Company() mit CompanyId als Schlüssel definiert. PersonKey ist Affinität mit CompanyId zusammengelegt. Jetzt versuche ich zu tun SQL Distributed Join (Person.CompanyId = Company.companyId) auf 2 Knoten in Grid verbunden. Ich wiederholte die gleiche Verbindung mit nur einzigen Knoten. Mit verteilten Join in 2 Knoten sollte ich 2x Performance-Verbesserung, aber es ist am schlechtesten im Vergleich zu einzelnen Knoten. Warum passiert dies? Sind beide Knoten nicht am Berechnungsteil beteiligt (hier Abfrage auswählen)?Verteilte SQL-Abfrage Leistung in Apache Ignite

class PersonKey 
{ 
    // Person ID used to identify a person. 
    private int personId; 

    // Company ID which will be used for affinity. 
    @AffinityKeyMapped 
    private String companyId; 

    public PersonKey(int personId, String companyId) 
    { 
     this.personId = personId; 
     this.companyId = companyId; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
      + ((companyId == null) ? 0 : companyId.hashCode()); 
     result = prime * result + personId; 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     PersonKey other = (PersonKey) obj; 
     if (companyId == null) { 
      if (other.companyId != null) 
       return false; 
     } else if (!companyId.equals(other.companyId)) 
      return false; 
     if (personId != other.personId) 
      return false; 
     return true; 
    } 

} 




class Person 
{ 
    @QuerySqlField(index = true) 
    int personId; 

    @QuerySqlField(index = true) 
    String companyId; 

    public Person(int personId, String companyId) 
    { 
     this.personId = personId; 
     this.companyId = companyId; 
    } 

    private PersonKey key; 
    public PersonKey key() 
    { 
     if(key == null) 
      key = new PersonKey(personId, companyId); 

     return key; 
    } 
} 



class Company 
{ 
    @QuerySqlField(index = true) 
    String companyId; 

    String company_name; 

    public Company(String CompanyId, String company_name) 
    { 
     this.companyId = CompanyId; 
     this.company_name = company_name; 
    } 

    public String key() 
    { 
     return companyId; 
    } 
} 

Antwort

1

Das Hinzufügen eines zweiten Knotens bedeutet nicht automatisch, dass die Abfrage zweimal schneller wird. Darüber hinaus kann es leicht langsamer werden, da ein Netzwerk hinzugefügt wird, während bei einer Bereitstellung mit einem Knoten alle Daten lokal sind.

Um den Test fairer zu gestalten, können Sie eine Abfrage von einem Clientknoten [1] ausführen und die Anzahl der Serverknoten ändern. In diesem Fall wird die Ergebnismenge immer über das Netzwerk gesendet und Sie sehen den tatsächlichen Leistungsunterschied mit einer unterschiedlichen Anzahl von Servern.

[1] https://apacheignite.readme.io/docs/clients-vs-servers

+0

Jetzt habe ich Client-Knoten, wie Sie vorgeschlagen, aber immer noch Leistungsabfrage auf einzelnen Server-Knoten läuft, ist fast gleich wie 2 Servern in Netz angeschlossen. Die Abfrage, die ich implementiert habe, ist ** SELECT c_discount, c_last, c_credit, w_tax FROM Kunde, Lager WHERE w_id =? UND c_w_id = w_id UND c_d_id =? UND c_id =? ** mit 150000 Einträgen in der Kundentabelle und 5 Einträgen in der Warehouse-Tabelle. Ist die Abfrage nicht so rechenintensiv? oder fehlen mir einige Leistungseinstellungen? (Für Distributed Join habe ich auch Affinität Kollokation berücksichtigt) – rishi007bansod

+0

Ich habe auch ** deaktiviert Indexierung ** in Tabellen, um den Suchvorgang ** compute intensive **, aber immer noch Gitter mit 1 Server-Knoten geben bessere Ausgabe als Grid mit 2 Servern. – rishi007bansod

+0

Wenn Sie ein kleines Projekt haben, das das Problem reproduziert, dann werde ich in der Lage sein, einen Blick darauf zu werfen. Im Allgemeinen kann das Hinzufügen von Knoten jedoch nur helfen, wenn während der Ausführung viele Scans durchgeführt werden. –