- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Apache Geode 作为缓存解决方案。我需要将数据存储在两个不同的区域中,并通过简单的联接查询检索它们。
我尝试了复制区域和分区区域,但发现查询需要很长时间才能返回结果。我也在这两个区域添加了索引,这提高了性能,但仍然不够快。有人可以帮助解决如何提高此查询的性能吗?
这是我尝试过的
示例 1 - 分区区域
从缓存中检索约 7300 条记录所需的时间为 36 秒
cache.xml中的配置
<region name="Department">
<region-attributes>
<partition-attributes redundant-copies="1">
</partition-attributes>
</region-attributes>
<index name="deptIndex" from-clause="/Department" expression="deptId"/>
</region>
<region name="Employee">
<region-attributes>
<partition-attributes redundant-copies="1" colocated-with="Department">
</partition-attributes>
</region-attributes>
<index name="empIndex" from-clause="/Employee" expression="deptId"/>
</region>
查询函数
@Override
public void execute(FunctionContext context) {
// TODO Auto-generated method stub
Cache cache = CacheFactory.getAnyInstance();
QueryService queryService = cache.getQueryService();
ArrayList arguments = (ArrayList)context.getArguments();
String queryStr = (String)arguments.get(0);
Query query = queryService.newQuery(queryStr);
try {
SelectResults result = (SelectResults)query.execute((RegionFunctionContext)context);
ArrayList arrayResult = (ArrayList)result.asList();
context.getResultSender().sendResult(arrayResult);
context.getResultSender().lastResult(null);
} catch (FunctionDomainException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TypeMismatchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NameResolutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QueryInvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
执行函数
Function function = new QueryFunction();
String queryStr = "SELECT * FROM /Department d, /Employee e WHERE d.deptId=e.deptId";
ArrayList argList = new ArrayList();
argList.add(queryStr);
Object result = FunctionService.onRegion(CacheFactory.getAnyInstance().getRegion("Department")).withArgs(argList).execute(function).getResult();
ArrayList resultList = (ArrayList)result;
ArrayList<StructImpl> finalList = (ArrayList)resultList.get(0);
示例 2 - 复制区域
从缓存中检索约 7300 条记录所需的时间为 29 秒
cache.xml中的配置
<region name="Department">
<region-attributes refid="REPLICATE">
</region-attributes>
<index name="deptIndex" from-clause="/Department" expression="deptId"/>
</region>
<region name="Employee">
<region-attributes refid="REPLICATE">
</region-attributes>
<index name="empIndex" from-clause="/Employee" expression="deptId"/>
</region>
查询
@Override
public SelectResults fetchJoinedDataForIndex() {
QueryService queryService = getClientcache().getQueryService();
Query query = queryService.newQuery("SELECT * FROM /Department d, /Employee e WHERE d.deptId=e.deptId");
SelectResults result = null;
try {
result = (SelectResults)query.execute();
System.out.println(result.size());
} catch (FunctionDomainException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TypeMismatchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NameResolutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QueryInvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
最佳答案
您能描述一下您的域对象吗?员工和部门区域中的键和值是什么?您使用 PDX 吗?
一种简单的方法可能是将 deptId
作为部门区域的键。然后在您的函数中,您只需迭代 Employee
区域并对 Department
区域执行 get(deptId)
即可。为了进一步减少延迟,您可以将大量结果发送回客户端,同时服务器继续运行该函数。由于您提到结果中有超过 7000 个条目,因此您可以从服务器一次批量处理 500 个条目。像这样的事情:
@Override
public void execute(FunctionContext context) {
RegionFunctionContext rfc = (RegionFunctionContext) context;
Region<EmpId, PDXInstance> employee = PartitionRegionHelper.getLocalPrimaryData(rfc.getDataSet());
Region<DeptId, PDXInstance> department = PartitionRegionHelper.getLocalPrimaryData(rfc.getDataSet());
int count = 0;
Map<PdxInstance, PdxInstance> results = new HashMap<>();
for (Region.Entry<EmpId, PDXInstance> e : employee.entrySet()) {
PdxInstance dept = department.get(e.getValue().get("deptId"));
results.put(e.getValue(), dept);
if (count == 500) {
context.getResultSender().sendResult(results);
results.clear();
count = 0;
}
}
context.getResultSender().lastResult(results);
}
然后在客户端上您可以使用自定义 result collector当结果从服务器到达时,它将能够逐 block 处理结果。
关于java - Apache Geode - 连接查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38075666/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!