- 浏览: 914653 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (445)
- 备忘 (0)
- java基础 (28)
- jsp (15)
- css (4)
- javascript (30)
- struts (7)
- servlet (2)
- struts2 (7)
- jdbc (16)
- hibernate (22)
- ibatis (0)
- jpa (1)
- spring (17)
- spring定时任务 (8)
- 整合开发 (12)
- JavaArticle (0)
- php (6)
- velocity (2)
- mysql (19)
- sqlserver (52)
- oracle (23)
- lucene (49)
- ajax (13)
- dwr (5)
- JFreeChart (1)
- service (14)
- tools (18)
- c#基础 (20)
- 程序安全 (0)
- 学习网站 (1)
- 社会需求 (2)
- flash (1)
- 流媒体 (1)
- java_code (1)
- htmlparser (1)
- 速动画教程 (5)
- 设计模式 (1)
- xml操作 (2)
- uml操作 (4)
- 测试 (1)
- linux (8)
- 版本控制 (4)
- 服务器 (12)
- 安全 (6)
- 美工 (2)
最新评论
-
Zhang_amao:
我想问一下, 你用的lucene版本和highligher的版 ...
使用Lucene的Highlighter实现文件摘要的自动提取 -
wangmengfanwangzhi:
博主,你的QQ是什么啊?有关于lucene的问题想要请教啊~~ ...
Lucene下载及测试 -
cutesunshineriver:
讲得很好,理解起来很顺,对个人学习的帮助性很大,谢谢博主。
velocity入门一 -
libin2722:
我这里有一个任务调度,在晚上3点时候会自动将数据库中某表的数据 ...
Lucene-2.2.0 源代码阅读学习(16) -
greatwqs:
java -cp $JVM_ARGS $classpath ...
java的cp命令
在数据库中,经常需要用到大字段类型,如oracle中long/blob/clob,sqlserver中text/image,mysql中的text/longtext/clob/blob。
存储的信息大概主要是两类,一类是长文本,如大段的文字,普通的varchar最长只能存储4000个汉字,已经不能满足要求;另一类是存储二进制信息,如上传的文件等。
那么假如现在有一个表,记录某人发布的文档信息,字段包括:发布人,发布时间,文档标题,文档内容(实际中还会有其它字段),一般建表如下(sqlserver):
create table document(
id int identity(1,1) not null,
createuser_id int,
document_title varchar(255),
document_context text);
这张表的结构,表面上看起来,从数据库设计角度和对应的JAVA类的设计来讲,都是没有问题的。
但实际上,这里面隐藏着两个比较严重的问题!
一、不能完全跨数据库
why?问题出在需要查重(distinct)的时候。
在需要查重时,采用纯jdbc技术,则可以自定义要查重的字段,如select distinct id,createuser_id,document_title from document。而当采用hibernate时,若不想自已创建若干个新的Pojo或者使用Object[]方式来处理数据,则只能使用select distinct d from document as d这样的语句,而hibernate会将其解析为类似:select distinct id,createuser_id,document_title,document_context from document。
问题就出在这个document_context字段上!
对于mysql来讲,hibernate生成的sql是可以执行的。但对于sqlserver来讲,是不允许在text/image列上进行distinct查询的!oracle中同样不可以对clob/blob进行distinct查询。
因此系统在sqlserver/oracle上部署时,当需要查重时则会出错。当然如果你用不到查重语句,是一点不受影响的。
二、严重影响列表显示和统计的效率
影响一张表的查询速度的,除了行数,还包括表所占的物理空间的大小。此表在数据量较小时,在查询方面感觉不到明显的差异。但是如果document_context字段所存储的数据都是大段文本或较大的文件时,会导致表的物理空间迅速变大,该字段所占用的空间有可能达到整表所占空间的90%以上。在此基础上,如果行数再增加到数十万、上百万级时,整个表所占的空间将达到一个惊人的数字。
保守估计,一条记录占用的空间平均为10K的话,一万条记录将占用100M的空间,一百万条记录将占用10G!在此表上的CRUD操作,亦将变慢,查询的速度亦会受到非常大的影响 。当然通过提高服务器本身的硬件性能和优化索引,可以提高查询速度,但面对无法预知的巨大洪水,单纯加固堤坝是不保险的。
解决的方式?
曾经处理过公司内的一个老系统,表的行数达到十万左右,由于采用上面的设计方式,虽然已经尽可能优化了索引,但查询分页时,仍然需要十秒左右。我单独建了一个新表,将document_context这个字段移到新表中,在原表中加一个对应的外键列,经过处理后,分页显示响应时间降到毫秒级以内。(二进制数据的转移是无法使用普通 的数据导入导出方式的,我的方法是复制该表,然后再修改复制后的表结构)
因为这个大字段,在最常用的列表显示中是根本不需要关心的,仅当用户需要查看某一记录的具体信息时,才需要调入该字段信息。因此分表后,显著提高了分页性能。
在我现在开发的所有的系统中,我都采用了上述的方式,这样做属于未雨绸缪,一旦系统部署后再修改,可能就来不及了。
补充:近日公司的另一套CMS系统,已经出现 了上述问题。clob字段直接置于业务表中,现业务表记录已达20余万,查询的速度非常缓慢,被迫采用各种方式来解决。如果当初设计时就考虑到这方面就不会有这样的问题了。
PS:解决方案之一是,可以在Pojo中加入构造函数,参数中包含除clob字段外的所有其它字段,通过select new Pojo(field1,field2,.....) from Pojo的方式来处理。但要注意,fieldx不能为集合类型,只能为基本数据类型或Po类型。如public Pojo(Long id,String name,User usr,Date createDate){}
发表评论
-
传递中文参数
2012-07-27 11:12 925传递: URLEncoder.encode(&q ... -
java的cp命令
2010-07-27 11:21 5459-cp 参数后面是类路径,是指定给解释器到哪里找到你的.cla ... -
java.util.ConcurrentModificationException 解决办法
2010-07-12 15:01 978今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足 ... -
java多线程之 wait(),notify(),notifyAll()
2009-11-10 20:53 1339wait(),notify(),notifyAll()不属于T ... -
什么是XFire
2009-10-08 14:16 1217XFire 是 codeHaus 组织提供的一个开源框架,它构 ... -
jbpm是什么
2009-10-08 14:15 2099jBPM是一种基于J2EE的轻量级工作流管理系统,是JBoss ... -
java.util.Date和java.sql.Date的区别及应用
2009-09-30 20:08 1932java.util.Date 就是在除了SQL语句的情况下面 ... -
JAVA排序汇总
2009-09-14 22:16 860package com.softeem.jbs.lesson4 ... -
java随机数
2009-07-12 19:04 4615java.util.Random类来产生一 ... -
使用sunjce加密解密问题解决
2009-07-01 11:16 3281最近在做开发的时候遇到要对用户输入进行加密,上网搜索了一下ja ... -
加密处理问题
2009-07-01 10:50 820/** * VDSP自己的一个摘要算法 * @para ... -
Log4j最简入门
2009-07-01 09:40 935Log4j实在是很熟悉,几乎所有的Java项目都用它啊。但是我 ... -
Logger.getLogger和 LogFactory.getLog
2009-07-01 08:56 2573Logger来自log4j自己的包 ... -
关于权限设计
2009-06-15 17:12 1424权限设计通常包括数据 ... -
java读取配置文件的几种方法
2009-06-10 10:15 792在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选 ... -
java错误
2009-06-02 21:47 1080错误警告: 2008-9-27 10:55:26 org.a ... -
判断一个字符是否是汉字
2009-05-10 15:03 1743String str = "中国chin受到腐蚀的 ... -
标准规范--方法注释
2009-03-04 14:24 1479/** * Created by IntelliJ IDEA. ... -
IDE下载地址
2009-03-03 23:13 1197Netbeans6.0beta2下载地址:http://dlc ... -
jdk配置的错误
2009-02-02 10:09 1049今天在配置jdk的时候, CLASSPATH的值末尾出现少了逗 ...
相关推荐
新中大 se 结构表 有点老的 全称:SE表结构说明与注意事项新中大银色快车SE9 0培训辅导教程
最近遇到的一个问题,需要在一张将近1000万数据量的表中添加加一个字段,但是直接添加会导致mysql 奔溃,所以需要利用其他的方法进行添加,这篇文章主要给大家介绍了MySQL中大数据表增加字段的实现思路,需要的朋友...
版本有些旧,大概是NG6.1的。但是比没有好。能有不小的参考作用。 word格式的,
移动网络数据中大数据处理的关键技术探索.pdf
移动网络数据中大数据处理的关键技术探索
新中大备份数据格式解压缩工具,方便对新中大的数据进行处理
当电脑系统崩溃,需重装操作系统,或更换电脑,或新中大银色快车财务软件系统损坏,不能正常运行,而此时又没有备份数据,怎么办?不用急,本文教你如何将新中大银色快车SE财务软件的数据移植到另一台电脑或重装系统...
高中数学课堂中大数据处理的实践研究.pdf
基于PSO的云计算环境中大数据优化聚类算法.pdf
#资源达人分享计划#
#资源达人分享计划#
论物联网技术中大数据的应用.pdf
简单的源代码,针对大数据中的数据 对数据进行的排序。 mapreduce
云计算中大数据的MapReduce处理方法简析.pdf
疫情防控体系中大数据作用路径探析.pdf
领导者预测决策中大数据应用问题要略.pdf
高中数学课堂中大数据处理的实践研究
移动通信网络中大数据处理的关键技术分析.pdf
智慧校园中大数据及云计算技术的应用研究.pdf