Apache Ignite 中的分布式 SQL 查询性能

Distributed SQL query performance in Apache Ignite

我定义了以下 2 类 Person(with PersonKey) 和 Company() with companyId 作为键。 PersonKey 与 companyId 相关联。现在我正在尝试 SQL 分布式连接 (Person.companyId = Company.companyId) on 2 nodes connected在网格中。我只用 单个节点 重复了相同的连接。通过在 2 个节点中进行分布式连接,我应该获得 2 倍的性能提升,但与单个节点相比,它的性能最差。为什么会这样?两个节点都没有参与计算(此处 select 查询)部分吗?

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] https://apacheignite.readme.io/docs/clients-vs-servers