最近做了个项目,实现对存在千万条记录的库表进行插入、查询操作。原以为对数据库的插入、查询是件很容易的事,可不知当数据达到百万甚至千万条级别的时候,这一切似乎变得相当困难。几经折腾,总算完成了任务。
1、 避免使用Hibernate框架
Hibernate用起来虽然方便,但对于海量数据的操作显得力不从心。
关于插入:
试过用Hibernate一次性进行5万条左右数据的插入,若ID使用sequence 方式生成,Hibernate将分5万次从数据库取得5万个sequence,构造成相应对象后,再分五万次将数据保存到数据库。花了我十分钟时间。主要的时间不是花在插入上,而是花在5万次从数据库取sequence上,弄得我相当郁闷。虽然后来把ID生成方式改成increase解决了问题,但还是对那十分钟的等待心有余悸。
关于查询:
Hibernate对数据库查询的主要思想还是面向对象的,这将使许多我们不需要查询的数据占用了大量的系统资源(包括数据库资源和本地资源)。由于对Hibernate的偏爱,本着不抛弃、不放弃的作风,做了包括配SQL,改进SQL等等的相当多的尝试,可都以失败告终,不得不忍痛割爱了。
2、 写查询语句时,要把查询的字段一一列出
查询时不要使用类似select * from x_table的语句,要尽量使用select id,name from x_table,以避免查询出不需要的数据浪费资源。对于海量数据而言,一个字段所占用的资源和查询时间是相当可观的。
3、 减少不必要的查询条件
当我们在做查询时,常常是前台提交一个查询表单到后台,后台解析这个表单,而后进行查询操作。在我们解析表单时,为了方便起见,常常喜欢将一些不需要查询的条件用永真的条件来代替(如:select count(id) from x_table where name like ‘%’),其实这样的SQL对资源的浪费是相当可怕的。我试过对于同样的近一千万条记录的查询来说,使用select count(id) from x_table 进行表查询需要11秒,而使用select count(id) from x_table where name like ‘%’却花了33秒。
4、 避免在查询时使用表连接
在做海量数据查询时,应尽量避免表连接(特别是左、右连接),万不得已要进行表连接时,被连接的另一张表数据量一定不能太大,若连接的另一张表也是数万条的话,那估计可以考虑重新设计库表了,因为那需要等待的时间决不是正常用户所能忍受的。
5、 嵌套查询时,尽可能地在第一次select就把查询范围缩到最小
在有多个select嵌套查询的时候,应尽量在最内层就把所要查询的范围缩到最小,能分页的先分页。很多时候,就是这样简单地把分页放到内层查询里,对查询效率来说能形成质的变化。
分享到:
相关推荐
本文将详细介绍如何在Oracle数据库中插入、查询和管理图片。 首先,我们需要创建一个包含BLOB列的表来存储图片。以下是一个创建该表的SQL语句示例: ```sql CREATE TABLE images ( id NUMBER PRIMARY KEY, image...
- 考虑到性能和效率,对于大量数据的插入或更新操作,可以采用批处理方式,一次执行多条记录的操作,减少数据库交互次数,提高整体性能。 总之,向Oracle数据库插入或更新Clob大段文本是一个涉及SQL语句构建、参数...
### Oracle插入随机数 在Oracle数据库管理中,有时我们需要向数据库表中插入大量的随机数据来进行测试、演示或者数据模拟分析等工作。本篇文章将详细介绍如何利用自定义的Oracle函数来实现这一功能。 #### 自定义...
### 一个选查询后插入到一个临时表的Oracle函数 #### 概述 在Oracle数据库环境中,函数是一种非常有用的数据库对象,它允许开发者封装复杂的逻辑并返回特定的结果。本文将详细解析一个特定的Oracle函数——`NS_...
若要查找所有不包括`rowid`最小记录的重复项,只需保持与第4点相同的查询部分: ```sql select * from vitae a where (a.peopleId, a.seq) in (select peopleId, seq from vitae group by peopleId, seq having...
标题中的“通过.bat文件连接Oracle 插入数据库记录”指的是使用批处理(.bat)脚本来操作Oracle数据库,实现数据的插入功能。Oracle是全球知名的关系型数据库管理系统,而批处理脚本则是在Windows操作系统中运行的一...
### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...
3. 分页查询:Oracle提供ROWNUM伪列,可以配合WHERE子句实现分页查询,例如 `SELECT * FROM (SELECT * FROM table_name WHERE ROWNUM ) WHERE ROWNUM > 5` 获取表的第6到第10条记录。 三、在SQL中向Oracle插入数据 ...
综上所述,针对Oracle数据库中大量数据的插入操作,通过选择高性能的存储设备、巧妙运用SQL Hint、合理控制日志记录以及利用EXP/IMP工具,可以显著提升数据处理的效率和系统的响应速度。这些策略不仅适用于日常的...
Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于在Oracle数据库管理系统中操作和管理数据。在Oracle中,插入数据到表中的主要语句是`INSERT INTO`,它允许你将新记录添加到已存在的表中。下面我们将深入探讨...
在插入新记录前,该触发器会自动为每一行的新记录的`id`字段赋值为序列的下一个值。这种方式更加灵活且无需在每个插入语句中显式指定序列值。 #### 获取刚插入的ID 在Oracle中,如果需要获取刚插入的数据的ID值,...
### Oracle数据库中的XML数据查询与处理 在Oracle数据库中,对于存储在数据库中的XML文件进行查询和处理是一项非常实用的功能。这种能力可以帮助我们更高效地管理数据,并且能够灵活地应对那些半结构化数据(例如...
### Oracle ODP.NET 批量插入或更新技术详解 #### 一、背景介绍 在数据库操作中,批量处理数据是一项非常重要的技术。特别是在处理大量数据时,如何高效地执行批量插入或更新操作对于提高应用程序性能至关重要。...
随后,使用`FORALL`循环将这些记录插入到另一个表`emp_table_his`中。这种方式大大减少了数据库服务器上的网络通信次数。 #### 二、游标与引用游标:`REF CURSOR` 在Oracle中,游标(Cursor)是一种用于检索数据库...
总的来说,理解并熟练掌握Oracle中多表关联的批量插入、更新和删除操作,能够有效优化数据库性能,提高开发效率,并且减少因频繁的单条操作导致的错误可能性。在设计数据库方案时,应充分利用这些特性,为应用程序...
它允许用户直接在Excel环境中执行对Oracle数据库的操作,如查询、更新、删除和插入数据,而无需编写复杂的SQL语句或借助其他数据库管理软件。这种直观的方式极大地提高了工作效率,特别是对于需要频繁进行数据导入...
开发者可以通过oci_env_create创建环境句柄,oci_connection_create建立连接,oci_statement_create创建语句句柄,oci_bind_array_by_name进行数组绑定,oci_execute执行SQL等步骤来实现与Oracle数据库的交互。...
插入新记录是使用 Oracle 的一个基本操作,使用以下语句可以插入新记录: insert into tablename values('值1','值2'); 十四、查询记录 查询记录是使用 Oracle 的一个基本操作,使用以下语句可以查询记录: ...
### Oracle查询重复数据与删除重复记录方法 #### 一、查询重复数据 ##### 1. 使用ROWID方法 ROWID是Oracle中一个特殊的数据类型,它代表了表中每一条记录在物理存储上的唯一地址。利用ROWID可以非常高效地查询和...
### Oracle中如何删除重复的记录 在Oracle数据库中,数据的完整性是非常重要的。有时,由于各种原因(如数据导入错误、系统故障等),数据库表中可能会出现重复的记录,这不仅浪费存储空间,还可能导致查询结果不...