`
together
  • 浏览: 220101 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

对数据表中大字段的处理方式

    博客分类:
  • java
阅读更多
  在数据库中,经常需要用到大字段类型,如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){}
分享到:
评论
20 楼 javadev 2007-04-29  
上面怎么只列举了Oracle和MySql,DB2是否也存在这种问题。
19 楼 maxima 2007-03-23  
试过hibernate 的话大字段的属性都设lazy=true,能提高查询速度。具体能提高多少不知道了
18 楼 zaife 2006-12-21  
能不能说说INDEX表的具体做法。
17 楼 myreligion 2006-12-07  

我觉得放到文件系统的优势是对于可以公开访问的大数据,如个人头像的图片,帖子的正文等可以外部访问的东西,可以通过Apache直接读取,完全不用经过App和DB层,这对性能优化是非常有用的。


cookoo 写道
放在数据库里可以直接利用数据库的安全性,完整性,备份,集群,远程可访问性。当然设计不好的话对性能会有影响。

如果放在文件系统,数据库里只保留一个path的话,虽然本地访问直观,但是同步检查(检查path所指文件是否真的存在),加上上述各种数据库特性就都需要自己来处理了。
16 楼 geradle 2006-12-07  
能不能说说INDEX表的具体做法。
15 楼 fight_bird 2006-12-04  
大数据量下的LOB处理没有捷径,目前唯一合理的方法是:
专用文件服务器+基于数据库的目录管理

希望改个Pojo细节,躲开LOB字段的映射就能解决问题是不现实的,问题的瓶颈就是数据库本身。
14 楼 oboaix 2006-11-17  
需要高手支持,需要反复考察验证方可定论,支持讨论...
13 楼 糖人GG 2006-11-16  
好贴子
12 楼 JackTree365 2006-11-09  
向高手学习
11 楼 cryolite 2006-11-09  
zelsa 写道
我公司的有一套系统,近1年的附件已达到70+G,如果放到库里那只有找死。所以还要具体问题具体分析,附件数据量小的,可以考虑入库。


如果这些附件都放在一个单独的表里,通过外键关联到其他表,这样又不影响其他表,怎么会是找死?
难道70G的文件系统就不是找死?
10 楼 zelsa 2006-11-01  
我公司的有一套系统,近1年的附件已达到70+G,如果放到库里那只有找死。所以还要具体问题具体分析,附件数据量小的,可以考虑入库。
9 楼 jsszwangwei 2006-11-01  
这样也好,毕竟是“深度论坛”,呵呵
8 楼 cxd110 2006-10-25  
这里似乎对总结性的帖子很关照,只要是做一点总结的都是精华了,而如果谁问一些具体程序的,比如一个算法什么的,大多数被隐藏掉的。
7 楼 eason007 2006-10-23  
叶子 写道
文本存text尚可接受

image存2进制文件觉得蛮那个的...几千张图片存下,就很恐怖了.


恩,如果是考虑防盗链的话,可以通过其他服务器端技术解决。
6 楼 叶子 2006-10-23  
文本存text尚可接受

image存2进制文件觉得蛮那个的...几千张图片存下,就很恐怖了.
5 楼 darkjune 2006-10-22  
没有特殊要求,还是只放一个URL比较好
4 楼 cookoo 2006-10-22  
放在数据库里可以直接利用数据库的安全性,完整性,备份,集群,远程可访问性。当然设计不好的话对性能会有影响。

如果放在文件系统,数据库里只保留一个path的话,虽然本地访问直观,但是同步检查(检查path所指文件是否真的存在),加上上述各种数据库特性就都需要自己来处理了。
3 楼 myronyxl 2006-10-22  
干吗一定要把大字段放在数据库,我个人认为把文本和图像等之类需要用大字段处理的东东放在应用服务器上用文件保存,而在数据库里只放个路径就可以了,这样还可以省去应用服务器到数据库服务器的时间,更不会有类似楼上的事情发生了。
2 楼 eric_chan 2006-10-21  
问题一
引用
不能完全跨数据库
在oracle上也存在问题,我现在一般都这样写
select distinct d.id from document as d
1 楼 robbin 2006-10-16  
好贴!

相关推荐

    MySQL中大数据表增加字段的实现思路

    在MySQL数据库管理中,对大型数据表添加字段是一项需要谨慎处理的任务,因为直接使用`ALTER TABLE`语句可能会导致长时间的锁表,进而影响服务的稳定性。本文将探讨几种适用于大数据表的字段添加策略,以避免系统崩溃...

    新中大SE 数据字典

    此数据字典涵盖了多个业务模块,如账务处理、报表处理、销售管理等,对于理解各个模块的数据存储方式、字段含义以及特定表的使用方法具有重要意义。 #### 二、重要概念 - **数据字典**:是一种用来存储数据库中所有...

    MS SQL Server中大数据量表的查询优化

    在MS SQL Server环境中如何有效处理记录条数超过2000万且每日增加20万条的数据表,这是许多开发人员面临的挑战。本文将通过实际案例来探讨这个问题,并提供一种解决方案,同时也讨论了该方案可能带来的问题及适用...

    oracle中大文件处理方式2gb.or.not.2gb.rar

    在Oracle数据库系统中,处理超过2GB的大文件是一项重要的任务,因为默认的Oracle数据块大小有限制,可能会遇到存储大型对象(LOB)或大数据表时的挑战。"2gb.or.not.2gb.rar"这个压缩包文件包含了关于如何在Oracle...

    DSO 数据岛例子 DSO 数据岛例子 DSO 数据岛例子 DSO 数据岛例子

    DSO(Data Store Object)是SAP HANA平台上的一个重要组件,主要用于...通过对数据进行分区、并行处理和有效的生命周期管理,DSO数据岛能够提供高效、灵活的数据存储解决方案,支持现代企业对实时分析和决策的需求。

    浅谈融媒体中心建设中大数据技术的应用.docx

    【摘要】:本文探讨了大数据技术在融媒体中心建设中的应用,强调了大数据技术对提升融媒体中心信息处理能力和传播效率的重要性。随着传媒行业对大数据和新媒体技术的广泛应用,建设融合媒体中心成为媒体机构的重要...

    java大字段转换

    以上就是处理Java中大字段的一些常见策略和技术,实际应用中需要根据具体情况选择合适的方法。博客文章可能详细介绍了这些技术的实现细节和优缺点,帮助开发者更好地理解和解决大字段带来的问题。

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    2021计网期中大作业:用UDP实现可靠传输

    4. **重传策略**:当确认未收到时,发送方需对数据进行重传。可以采用ARQ(Automatic Repeat-reQuest)协议,如停等ARQ、Go-Back-N或选择重传ARQ等策略。 5. **流量控制**:为了防止接收方被大量数据淹没,需要实施...

    数据库及其应用补考复习资料(一).docx

    【数据库及其应用补考复习资料】主要涵盖了数据库的基础知识,包括实体关系、数据类型、主键与外键、数据冗余、字段定义、查询类型、查询准则、表间关系、生成表查询、窗体创建以及控件应用等内容。以下是详细的知识...

    在VB中利用OO4O技术操作Oracle中大对象.pdf

    在VB中利用OO4O技术操作Oracle中大对象,是一种高效的方法,适用于处理存储在Oracle数据库中的大型数据,如图形、声音文件和格式化的文本文件等。这些大对象在Oracle中以两种形式存储:二进制流(如Long Row,BLOB)...

    Java对db2中大对象的操作

    在Java编程环境中,DB2数据库的大对象(LOB)操作是一个重要的主题,特别是对于那些处理大量非结构化数据,如图片、视频或者大型文本文件的开发者。大对象包括BLOB(Binary Large Object)和CLOB(Character Large ...

    本科毕业设计:中大闲置app.zip

    开发者需要创建商品表、用户表、交易表等,合理规划数据字段,如商品名、价格、图片、用户ID、交易状态等。为了优化查询性能,可能还会涉及索引的创建和维护。 至于用户交互逻辑,比如购买流程,通常包括选择商品、...

    【计算机专业VB-毕业设计100套之】VB中大迅通合同统计系统(论文+源代码)

    在这个系统中,可能包含了数据录入模块,用于输入合同的基本信息,如合同编号、合同双方、签订日期、合同金额、合同期限等关键字段。同时,系统可能还具备查询、统计、分类和导出功能,帮助用户快速查找特定合同,...

    大凭证导入

    用户可以在Excel中预处理凭证数据,如设置字段格式,然后通过VB程序导入到新中大软件。 标签中的"vb exce导入"进一步强调了这两个工具的结合使用。在实际操作中,以下步骤可能涉及: 1. **创建Excel模板**:设定...

    关于oracle中大对象处理的一些方法和实例.txt

    - 对于非常大的LOB数据,考虑使用分块处理或异步处理技术以提高效率。 总之,Oracle中的LOB提供了强大的功能来存储和管理大数据量,通过使用`DBMS_LOB`包中的工具和技术,开发人员能够高效地进行数据操作。了解这些...

    Oracle大对象数据在C builder中的存入技术.pdf

    通过这种方式,开发者可以在C++ Builder中实现对Oracle数据库中大对象数据的高效存取,满足多媒体文件和其他大数据量数据的存储需求。 此外,需要注意的是,由于LOB数据的大小可能非常大,因此在处理过程中可能需要...

    A3-V1200新中大报表仓库应用手册.docx

    报表设计部分可能涵盖了报表布局、数据字段选择、计算公式设定、图表制作等具体步骤,还可能包含自定义模板、数据过滤和动态参数等功能的使用指南。 4. **其他章节** 手册后续可能还包括数据抽取与加载(ETL)的...

    金蝶kis转用友T3工具

    1. 数据结构解析:工具需要能够理解金蝶KIS和用友T3两种系统内部的数据结构,包括数据库表的设计、字段含义等,以便正确地进行数据转换。 2. 数据映射与转换:不同软件的数据格式和存储方式可能存在差异,工具需要...

Global site tag (gtag.js) - Google Analytics