`

性能提升--意见收集贴(数据超过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
...

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    她从20世纪90年代初就开始使用Oracle,从事 Oracle的教学工作也已经超过10年的时间。她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java毕业设计-基于jspm开发的课堂教学效果实时评价系统--论文-附源代码和说明文档.rar

    学生可以通过系统对教师的授课内容、教学方法、课堂氛围等多个维度进行评价,系统能够实时收集这些评价数据,并进行统计分析,为教师提供直观的反馈报告。 在论文部分,详细阐述了系统的设计思路、实现过程以及技术...

    Java毕业设计-基于jspm开发的面向社区健康服务医疗平台--论文-附源代码和说明文档.rar

    本资源是一个基于SSM(Spring+SpringMVC+MyBatis)框架开发的Java汽车客运站管理系统,旨在通过现代化技术手段提升客运站的管理效率和服务水平。该系统采用B/S架构,前端使用JSP进行页面展示,后端则依托SSM框架实现...

    2019数据运营思维导图

    数据运营 作用&意义 知错能改,善莫大焉 —错在哪里,数据分析告诉你 运筹帷幄,决胜千里 —怎么做好“运筹”,数据分析告诉你 以往鉴来,未卜先知 —怎么发现历史的规律以预测未来,数据分析告诉你 工作思维 对业务...

    数据运营思维导图

    数据运营 作用&意义 知错能改,善莫大焉 —错在哪里,数据分析告诉你 运筹帷幄,决胜千里 —怎么做好“运筹”,数据分析告诉你 以往鉴来,未卜先知 —怎么发现历史的规律以预测未来,数据分析告诉你 工作...

    java开源包10

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    E语言1000模块

    PC6.com 为您收集整理,小编找的不容易,大家多多支持啊。。 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位转...2005-08-15 09:49 8584 2916 易语言模块大全\代码...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    (Garbage Collection)扫描版——part1

    书围绕着动态内存自动回收的话题,介绍了垃圾收集机制,详细分析了各种算法和相关技术。  本书共12章。第1章首先介绍计算机存储器管理的演化和自动内存回收的需求,并引入了本书所使用的术语和记法。第2章介绍了3...

    Learn-Data-Structures-and-Algorithms-with-Golang:Packt出版的《使用Golang学习数据结构和算法》

    提升您的Go编程技能,以开发更快,更高效的代码 这本书是关于什么的? Golang是软件行业中增长最快的编程语言之一。 它的速度,简单性和可靠性使其成为构建强大应用程序的理想选择。 这就需要使用Go建立扎实的数据...

    Java毕业设计-基于ssm框架开发的Java的汽车客运站管理系统的设计与实现+jsp-毕业论文(附源代码).rar

    本资源是一个基于SSM(Spring+SpringMVC+MyBatis)框架开发的Java汽车客运站管理系统,旨在通过现代化技术手段提升客运站的管理效率和服务水平。该系统采用B/S架构,前端使用JSP进行页面展示,后端则依托SSM框架实现...

    数据库参考教程-数据库设计规范4net.xlsx

    ,S003,,,,, D004,数据字典,数据字典分为面向前台业务和面向后台系统状态的,并且有的字典数据无法在设计时就收集齐全。充分收集字典数据可以用于更好的向开发者阐明系统的数据状态变化逻辑。,开发者对字典数据理解...

    Discuz! X2.5 正式版 繁体中文 UTF-8 20130222

    性能负载能力和稳定性大幅优化针对大访问量情况下,收集到各类性能瓶颈点,新版进行了集中优化和改进,其中包括:采用全新的帖子查看数更新机制,解决大访问量情况下,因瞬间大批量更新主题表造成的MySQL死锁的问题;...

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part2

    书围绕着动态内存自动回收的话题,介绍了垃圾收集机制,详细分析了各种算法和相关技术。  本书共12章。第1章首先介绍计算机存储器管理的演化和自动内存回收的需求,并引入了本书所使用的术语和记法。第2章介绍了3...

    java开源包1

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    super-jacoco

    简介Super-Jacoco是基于Jacoco,git二次开发打造的一站式JAVA代码全量/ diff覆盖率收集平台,能够解决,无侵入的收集代码覆盖率数据。Super-Jacoco除支持JVM运行时间段的覆盖外率收集外;还能够和环境无缝对接,收集...

    数据实时分析平台Heron.zip

    Twitter开源了数据实时分析平台Heron。Twitter使用Storm实时分析海量数据已经有好几年了,并在2011年将其开源。该项目稍后开始在Apache基金会孵化,并在2015年秋天成为顶级项目。Storm以季度为发布周期,并且向着...

Global site tag (gtag.js) - Google Analytics