2016-10-05 5 views
1

Я определил следующие 2 класса Person (с PersonKey) и Company() с ключом companyId. PersonKey - сродство, связанное с companyId. Теперь я пытаюсь сделать SQL распределенное соединение (Person.companyId = Company.companyId) на 2 узла подключен в сетке. Я повторил одно и то же соединение только с единственным узлом. При распределенном объединении в 2-х узлах я должен получить повышение производительности в 2 раза, но он хуже всего сравнивается с единственным узлом. Почему это происходит? Оба узла не участвуют в вычислении (здесь select query)?Производительность распределенного SQL-запроса в 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; 
    } 
} 

ответ

1

Добавление второго узла автоматически не означает, что запрос станет в два раза быстрее. Более того, он может стать медленнее, поскольку сеть добавляется, а при развертывании одного узла все данные являются локальными.

Чтобы сделать тест более справедливым, вы можете запустить запрос с клиентского узла [1] и изменить количество узлов сервера. В этом случае результирующий набор будет всегда отправляться по сети, и вы увидите реальную разницу в производительности с различным количеством серверов.

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

+0

Теперь я добавил клиентский узел, как Вы предложили, но до сих пор производительность запуска запроса на одном узле сервера почти так же, как 2-серверов в сети. Запрос, который я выполнил, - ** SELECT c_discount, c_last, c_credit, w_tax FROM customer, store WHERE w_id =? И c_w_id = w_id И c_d_id =? И c_id =? ** с 150000 записей в таблице клиентов и 5 записей в таблице хранилища. Это связано с тем, что запрос не так интенсивен? или у меня отсутствуют некоторые параметры производительности? (Для распределенного соединения я также рассмотрел аффинное коллокацию) – rishi007bansod

+0

У меня также ** отключена индексация ** в таблицах, чтобы сделать процесс поиска ** вычисляться интенсивным **, но все же сетка с 1 серверным узлом дает лучше, чем сетка с 2 серверами. – rishi007bansod

+0

Если у вас есть небольшой проект, который воспроизводит проблему, тогда я смогу взглянуть. Но, как правило, добавление узлов может помочь только при большом количестве сканирований во время выполнения. –