2016-10-05 65 views
1

我已经用companyId作为关键字定义了以下两个类Person(带PersonKey)和Company()。 PersonKey与公司Id亲缘搭配。现在我正在试图做SQL分布式连接(Person.companyId = Company.companyId) on 2个节点连接成网格。我只重复了与单节点相同的连接。使用2个节点的分布式连接,我应该获得2倍的性能提升,但与单个节点相比,它表现得最差。这是为什么发生?两个节点都不参与计算(这里选择查询)部分?Apache Ignite中的分布式SQL查询性能

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,仓库WHERE w_id =? AND c_w_id = w_id AND c_d_id =? AND c_id =?**,客户表中有150000个条目,仓库表中有5个条目。这是由于查询不是那么多计算密集型?或者我是否缺少一些性能设置?(对于分布式连接,我也考虑过亲和性搭配) – rishi007bansod

+0

我也**禁用了表中的索引**以使搜索进程**计算密集型**,但仍然有1个服务器节点的网格正在给出比2台服务器的网格更好的输出。 – rishi007bansod

+0

如果您有一个能够重现问题的小型项目,那么我将能够看一看。但通常情况下,只有在执行过程中进行大量扫描时,添加节点才能提供帮助。 –