`

大字段类型的处理

 
阅读更多
在数据库中,经常需要用到大字段类型,如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){}
分享到:
评论

相关推荐

    fckeditor配置和oracle大字段类型处理

    以上就是关于FCKeditor配置和Oracle大字段类型处理的详细讲解。通过正确的配置和编程,你可以顺利地在Oracle数据库中存储和管理由FCKeditor生成的富文本内容。希望这些信息能帮助到遇到相同问题的朋友们。

    sharepoint 自定义字段类型

    在SharePoint中,自定义字段类型是扩展平台功能的关键手段之一,它允许用户根据特定业务需求创建具有独特行为和展示的字段。自定义字段类型可以为数据存储提供更丰富的语义,提高信息管理的灵活性,并增强用户体验。...

    oracle字段类型转换的处理

    在Oracle数据库中,字段类型转换是一项常见的操作,特别是在数据迁移、数据清洗或处理来自不同数据源的数据时。本文将深入探讨Oracle字段类型的转换方法,并提供一个实用的工具示例。 Oracle数据库支持多种数据类型...

    SQLServer常用字段类型

    ### SQL Server 常用字段类型详解 在数据库设计与管理中,选择合适的字段类型对于数据的存储效率、查询性能以及数据完整性至关重要。SQL Server 提供了丰富的数据类型,覆盖了从基本数值到复杂文本、图像等各类数据...

    利用代码修改数据库字段类型

    "利用代码修改数据库字段类型"是一个高效且灵活的方法,它允许开发者无需通过图形用户界面(GUI)即可实现对数据库表结构的修改。这种方法尤其适用于自动化部署、持续集成/持续交付(CI/CD)流程,以及大规模数据...

    Delphi 在ADO中如何判断字段类型.rar

    // 处理字段类型 ADODataSet1.Next; end; ADODataSet1.Close; ``` 在上述代码中,`sp_columns` 是一个系统存储过程,用于返回指定表的列信息,包括列名(COLUMN_NAME)和数据类型(DATA_TYPE)。遍历Recordset...

    文件上传与大字段处理

    4. **流处理**:在处理大Blob时,可以使用Stream API进行分块处理,避免一次性加载整个Blob到内存,提高性能和内存效率。 5. **转换Blob**:Blob可以转换为其他格式,如Data URL(base64编码的字符串)用于在网页中...

    Mybatis 处理 CLOB、BLOB 类型数据

    Mybatis 处理 CLOB、BLOB 类型数据 MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis ...通过使用 MyBatis 处理 CLOB 和 BLOB 类型数据,可以方便地存储和读取大字段类型的数据,提高应用程序的性能和可扩展性。

    《ETL数据整合与处理(Kettle)》教学教案 —04字段处理.pdf

    《ETL数据整合与处理(Kettle)》教学教案的第4章主要聚焦于字段处理,这是数据清洗和转换的关键步骤,对于大数据技术类专业的学生来说至关重要。本章共计8学时,旨在通过理论与实践结合的方式,使学生掌握基于字段...

    hibernate使用中与各种数据库字段类型对应类型训练

    本训练主要关注在使用Hibernate时如何处理与各种数据库字段类型的映射,这对于理解和优化数据库交互至关重要。 首先,我们要理解Hibernate的核心概念——对象关系映射(ORM)。ORM允许我们将数据库表结构映射到Java...

    mysql和Oracle在对clob和blob字段的处理

    本文将深入探讨这两个数据库系统如何处理`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)字段,这两种字段类型主要用于存储大量文本或二进制数据。 `CLOB`用于存储非结构化的字符数据,如长篇...

    oracle中对blob字段的处理方法

    oracle中对blob字段的处理方法,包括增加,删除,修改,更新等操作。

    jdbc 处理clob类型字段

    当我们在处理大型文本数据时,例如XML文档、长篇文章或者大段代码,数据库通常会提供CLOB(Character Large Object)类型来存储这类数据。本主题主要探讨如何使用JDBC有效地操作Oracle数据库中的CLOB类型字段,包括...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    这种情况下,需要对char类型字段进行特殊处理,以确保查询结果的正确性。 首先,需要了解Oracle数据库中char类型字段的特性。在Oracle中,char类型字段如果内容长度不够,会自动以空格方式补足长度。例如,字段name...

    sql server替换textntext类型字段的值

    因为 text/ntext 类型字段的存储方式与其他数据类型不同,它们需要使用特殊的处理方式来进行值的替换。 在 SQL Server 中,text/ntext 类型字段的存储方式是基于指针的,每个文本字段都对应一个指针,指向文本数据...

    借助Hibernate对sybase的image字段类型的处理,实现保存在image类型字段内图片的保存和在页面的显示

    这里我们关注的是如何使用Java的ORM框架Hibernate来处理Sybase数据库中的特殊字段类型——`image`,以实现图片数据的存储和展示。`image`字段类型在Sybase中用于存储大量的二进制数据,如图片、文档等。 首先,我们...

    oracle数据库的clob大字段在jdbc中的处理方式

    如果数据过大,可以考虑分块读取或使用流式处理,避免一次性加载到内存中。 在实际应用中,还可能涉及CLOB字段的写入操作,这通常可以通过`PreparedStatement`的`setClob()`方法实现,将String转换为`Clob`对象...

    delphi读写BLOB字段

    delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...

    JPA实体映射对时间字段的处理

    例如,在使用`java.util.Date`时,若数据库中的字段类型为`java.sql.Date`,则可能需要调整映射策略: ```java @Temporal(TemporalType.DATE) ``` 改为 ```java @Temporal(TemporalType.TIMESTAMP) ``` 或者直接...

    Oracle LOB字段处理工具

    在数据库操作中,LOB字段的处理往往比常规的行数据更为复杂,因为它涉及到大块的数据读取、写入和管理。"Oracle LOB字段处理工具"就是为了简化这些操作而设计的软件。 这款工具主要针对Oracle数据库中的BLOB...

Global site tag (gtag.js) - Google Analytics