`

性能提升--意见收集贴(数据超过4000条,就明显慢了),代码已贴出

阅读更多
简单说明下:用hibernate查询数据,OuterTask表记录越来越多(超4000条),感觉查询速度越来越慢.

已经用hibernate分页机制了,为什么还这么慢哦,恼火!
各位走过路过,一定要给点意见啊,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢啦~

实际效果可见http://www.ctask.cn/项目,别的menu一点就来,就它慢,个NN的。[再加个:数据库是mysql5.0]

package com.affectu.dao.pagination;

import java.util.List;
import org.hibernate.Session;
import com.affectu.category.Category;
import com.affectu.common.util.Helper;
import com.affectu.task.InnerTask;
import com.affectu.task.Task;

/**
 * Oct 13, 2008
 * 
 * @author daniel nathan
 */
public class CategoryTaskDataModel extends BaseDataModel<Task, Long> {

	private Session em = Helper.getInstance().getSession();
	// not use view for optimizing performance
	private String sql = "select t1.* from OuterTask t1 where  t1.tag regexp :tags union all select t2.* from InnerTask t2 where  t2.tag regexp :tags order by publishDate desc  ";

	private String sqlCount = "select count(t.id) from ("
			+ " select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags ) t";

	private Category category;

	public CategoryTaskDataModel(Category category) {
		this.category = category;
	}

	@Override
	public Task findById(Long id) {
		return (Task) em.get(Task.class, id);
	}

	@Override
	public Long getCount() {
		// TODO Auto-generated method stub
		Long count;
		count = Long.valueOf(em.createSQLQuery(sqlCount).setParameter("tags",
				this.getTags()).uniqueResult().toString());
		return count;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Task> getList(Integer firstRow, Integer maxResults) {
		// TODO Auto-generated method stub
		return em.createSQLQuery(sql).addEntity("t", InnerTask.class)
				.setParameter("tags", this.getTags()).setFirstResult(firstRow)
				.setMaxResults(maxResults).list();
	}

	private String getTags() {
		List<Category> children = category.getChildren();
		String tags = "";
		for (int i = 0; i < children.size(); i++) {
			tags += "." + children.get(i).getName() + ".|";
		}
		tags += "." + category.getName() + ".";
		tags = tags.replaceAll("[+]*", "");
		return tags;
	}

	public void finalize() {
		em.close();
	}

	public void destroy() {
		em.close();
	}
}


对应的entiy
package com.affectu.task;

import java.io.Serializable;
import javax.persistence.Entity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.search.annotations.Indexed;
import org.jboss.seam.annotations.Name;
/*
 * 2008-8-15 
 * @author daniel nathan
 */
@Entity
@Name("outerTask")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Indexed
public class OuterTask extends Task implements Serializable {

}


/*
 * 2008-8-15 
 * @author daniel nathan
 */
//@Entity
@Name("task")
@MappedSuperclass()
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Task extends EntityBase implements Serializable {
	@Field(name = "tag", index = Index.TOKENIZED, analyzer = @Analyzer(impl = ChineseAnalyzer.class))
	private String tag;
	private int budget;
	private int bidDay;
	private int finishDay;
	@Temporal(value = TemporalType.TIMESTAMP)
	private Date publishDate;
	private String attachName;
	private String url;
	private Type type;
	public enum Type {
		INNER, OUTER
	}
分享到:
评论
15 楼 wuyuwentian 2009-06-25  
不能用like 要用搜索引擎来实现,除非你只是想玩玩
14 楼 jmzwcn 2009-06-25  
whaosoft 写道
是不是你语句的事ne !~


有优化方法么?
# private String sql = "select t1.* from OuterTask t1 where  t1.tag regexp :tags union all select t2.* from InnerTask t2 where  t2.tag regexp :tags order by publishDate desc  ";  
#   
#     private String sqlCount = "select count(t.id) from ("  
#             + " select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags ) t";  
#   
13 楼 whaosoft 2009-06-25  
是不是你语句的事ne !~
12 楼 jmzwcn 2009-06-25  
asklxf 写道
你用了like,永远都快不了,因为索引无效

必须用lucene之类的全文搜索引擎


就一个简单的匹配,只不过数据量稍大点,就非搜索引擎不可了?[另:没用like,用的是regularExpress]
11 楼 king911 2009-06-25  
union all 效率最低了
10 楼 asklxf 2009-06-25  
你用了like,永远都快不了,因为索引无效

必须用lucene之类的全文搜索引擎
9 楼 jmzwcn 2009-06-25  
spyker 写道
jmzwcn 写道
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合

按照你说的你的sql写的有问题哦...
其实就是
select t1.id
   from
     OuterTask ,innertask
   where OuterTask.t1 = innertask.t1  
     and t1 like ‘%紫竹%’

其实就是两张表关联 前后模糊查询
end



rs:OuterTask和InnerTask彼此独立,用OuterTask.t1 = innertask.t1 用意何在?


分两步看,第一部:各查各的,分别得到各自的resultSet,第二步,把两个resultSet合并
8 楼 spyker 2009-06-25  
jmzwcn 写道
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合

按照你说的你的sql写的有问题哦...
其实就是
select t1.id
   from
     OuterTask ,innertask
   where OuterTask.t1 = innertask.t1  
     and t1 like ‘%紫竹%’

其实就是两张表关联 前后模糊查询
end
7 楼 jmzwcn 2009-06-25  
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合
6 楼 spyker 2009-06-25  
没有关联?
说说你sql的作用是什么?
5 楼 spyker 2009-06-25  
你直接在这里回复吧
4 楼 spyker 2009-06-25  
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql
3 楼 spyker 2009-06-25  
用jdk1.5+ 麻烦用用自动转型吧
2 楼 spyker 2009-06-25  
select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags


你这个语句是不是
outertask表通过tag字段和innertask表的tag字段关联的
为什要用union all呢,直接用字段关联不久可以了么
我觉的你sql这么写会慢
你两个sql都这么写的
...

select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags

改为这个吧
select t1.id from OuterTask ,innertask where OuterTask.t1 = innertask.t1 

另一个也做类似修改
1 楼 spyker 2009-06-25  
推荐换jdbc or ibatis
...

相关推荐

    Web性能测试--基础概念.pdf

    - 依据测试需求选择合适的工具,如JMeter、LoadRunner、 Gatling等,它们可以模拟用户负载并收集性能数据。 5. **编写测试计划** - 定义测试场景、负载模型、执行策略和预期结果。 6. **环境搭建** - 创建与...

    变量在PLC数据结构的代码表

    ### 变量在PLC数据结构的代码表详解 #### 一、概述 本文将详细介绍在可编程逻辑控制器(PLC)中使用的数据结构代码表,主要包括数据类型代码表、模块类型代码表以及区域类型代码表等内容。这些表格是理解和操作PLC...

    Excel-VBA宏编程实例源代码-数据的导入导出-将数据导入到Access.zip

    以上就是关于“Excel-VBA宏编程实例源代码-数据的导入导出-将数据导入到Access.zip”压缩包文件所涉及的知识点,通过学习和理解这些内容,你可以掌握如何利用VBA自动化数据导入到Access的过程,提升办公效率。

    Super-jacoco应用统计代码覆盖率及问题处理

    JaCoCo通过字节码注入技术,动态地收集运行时的执行信息,从而计算出代码覆盖率。 “Super-jacoco”是JaCoCo的一个增强版本,它不仅包含JaCoCo的基本功能,还可能添加了一些特定的优化或扩展,例如更好的报告格式、...

    工作小计-性能优化-gperftools/tcmalloc/pprof

    在IT行业中,性能优化是提升系统效率的关键环节,特别是在大规模应用和服务中,每一分性能的提升都可能带来显著的效益。"gperftools"、"tcmalloc"和"pprof"是Google开发的一套强大的性能分析工具,它们在优化C++应用...

    Agrona-Java和C高性能的数据结构和实用方法

    《Agrona——Java与C的高性能数据结构与实用方法》是面向开发人员的一本重要参考资料,特别是对于那些关注性能优化的Java开发者来说。Agrona项目由Real Logic公司维护,它提供了一系列精心设计的数据结构和实用工具...

    Python网络爬虫技术-源代码和实验数据.rar

    Python网络爬虫技术是开发和收集互联网数据的重要工具,它允许程序员通过自动化的方式获取网页信息。这个"Python网络爬虫技术-源代码和实验数据.rar"压缩包包含了一系列的源代码示例和实验数据,旨在帮助学习者深入...

    AIX 5L 性能优化-重点介绍中央处理器 (CPU) 性能和监视的各个方面

    ### AIX 5L 性能优化:中央处理器 (CPU) 性能和监视的关键知识点 #### 一、概述 AIX 5L 是 IBM 的一款高性能 UNIX 操作系统,广泛应用于企业级服务器环境中。CPU 性能优化是确保 AIX 5L 系统高效运行的关键环节之...

    NS-2 协议仿真 dvmrp 和pim 性能分析 tcl代码

    在这些脚本中,你可以看到如何设置网络拓扑、配置路由器参数、启动多播流并收集性能统计数据。 性能分析在网络设计和优化中至关重要。丢包率是衡量网络可靠性的关键指标,它反映了数据包在传输过程中未能到达目的地...

    vue面试题目-vue经典面试题目-vue-Vue框架的核心概念-常用的功能和特性-性能优化-面试题目-面经

    - 依赖收集和劫持数据变化,通过setter触发视图更新。 21. **组件间通信**: - 使用props向下传递数据,event bus或Vuex进行父子组件间或非父子组件间的通信。 22. **单文件组件(SFC)**: - 将模板、脚本和...

    性能测试从零开始LoadRunner入门与提升pdf

    3. **Analysis**:分析器,用于收集和分析测试结果数据,帮助测试人员找出性能瓶颈。 #### 三、LoadRunner入门指南 ##### 3.1 安装与配置 - **安装准备**:确保目标计算机满足LoadRunner的系统要求,包括操作系统...

    2021 泰迪杯数据、题目和代码.zip

    "2021 泰迪杯数据、题目和代码.zip" 这个压缩包文件包含了参与"泰迪杯数据分析技能赛"所需的重要资料。泰迪杯数据分析技能赛是一场旨在提升参赛者数据处理、分析和解读能力的比赛。通过参加此类比赛,参赛者可以锻炼...

    hibernate性能测试代码

    5. **结果分析**:收集测试数据,使用图形工具(如JProfiler或VisualVM)进行内存分析,或者使用像JMeter的报告功能来可视化性能指标。 在测试过程中,我们可能关注以下几个关键指标: - **查询速度**:包括单个...

    《软件性能测试、分析与调优实践之路-第二版》ppt 课件总结

    ### 《软件性能测试、分析与调优实践之路-第二版》PPT课件总结 #### 一、软件性能测试的重要性及目标 1. **理解系统性能指标**: - **并发访问量**:评估系统在高并发环境下的承载能力。 - **平均响应时间**:...

    MNIST-联邦学习代码-FedAvg-master.rar

    在“MNIST-联邦学习代码-FedAvg-master.rar”这个压缩包中,我们主要关注的是FedAvg算法,这是一种联邦学习中的常用聚合策略。FedAvg由Google的研究人员在2016年提出,全称为"Federated Averaging",即联邦平均。它...

    fifa-18-demo-player-dataset_数据集足球运动员_

    在现代体育数据分析的浪潮中,足球作为全球最受欢迎的运动,其数据的收集、分析与应用日益受到重视。"fifa-18-demo-player-dataset"提供了一个独特的机会,让我们能够深入了解足球运动员的各项性能指标,以及他们在...

    人工智能大作业-报告-数据-代码-结果.zip

    这个压缩包“人工智能大作业-报告-数据-代码-结果.zip”正是一个集大成者,涵盖了从数据收集、模型训练到结果展示的完整流程,对于学习和理解人工智能,尤其是对于正在进行人工智能大作业、毕业设计或课程设计的学生...

    java程序性能优化-pdf+源码

    《Java程序性能优化》这本书是Java开发者不可或缺的参考资料,它深入浅出地讲解了如何提升Java应用程序的效率和稳定性。本书结合理论与实践,既包含了基础的性能优化原则,也探讨了高级的优化技巧,适合从初级到中级...

    第 1 节 数据采集--日志生成代码.zip

    总结来说,日志生成是数据采集的基础,通过对各种日志数据的模拟和收集,我们可以深入了解用户行为、系统性能以及业务运行状况。"第 1 节 数据采集--日志生成代码.zip"提供了学习和实践这一过程的宝贵资源,对于提升...

Global site tag (gtag.js) - Google Analytics