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] 并更改服务器节点的数量。在这种情况下,结果集将始终通过网络发送,您将看到不同数量的服务器在性能上的真正差异。
我定义了以下 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] 并更改服务器节点的数量。在这种情况下,结果集将始终通过网络发送,您将看到不同数量的服务器在性能上的真正差异。