oracle动态表数据分页查询

讨论了如何通过采用缓存、多线程、分区表、索引优化、统计表等技术来提高大数据查询效率,同时提出了改进数据结构设计的策略,包括分页查询优化、使用存储过程、避免使用 UNION 语句等方法。强调了通过合理设计和应用现代数据库技术,可以显著提升数据处理速度和用户体验。
 
0 0

先做个物化试图。不行在分区。

2013年8月05日 16:00
 
0 0

同样提议改成分区表,保持逻辑不变的话,使用函数分区。 

PARTITION BY TO_CHAR(CreateTime, 'YYYYMM') 

效果和你现在手工分区一样。 

然后在检索条件的列上建个global index。这个数据量,不可能会有问题。 

再说使用分区表,程序里会更简单。 

话说你们都买了Oracle,还手工分区?!! 

2013年4月21日 17:11
 
0 0

改用分区表吧

2013年4月12日 11:58
 
0 0

1:从你的表字段来看,单张表50万数据应该10m左右,也就是说一年的数据应该在在120m左右,所以做120m的缓存还是可行的(当然你的数据可能不仅是来源一张表,或是查询跨度很大,数据量很大,缓存需要就很大,这样可能会需要一些额外的投入了) 
2:从你的查询条件来看,跨越了3张表,数据量应该在100万的样子,或许你用了一条sql去查,但是我觉得1分多钟,实在让人难以忍受。 
  a:如果查询条件是时间段,考虑在时间字段上建索引(我看你查询条件是精确到日的,可以考虑对,对日期进行函数处理后,做该字段的 函数索引) 
  b:是否存在非必要的order by, 
  c:如果是union ,要在每个union 加上时间过滤 
  d:可以根据业务将数据进行合并,例如只允许查询最近5个月的数据,可以将最近五个月数据insert select 到一个表空间中。下次查询判断时间是否在临时表内,如果在,就直接查询,如果不在,就将不在范围的数据insert select 到临时表中。 
3:看看表空间利用情况吧,如果该数据库实例数据很大,表空间利用率很高(分表的数据文件可以放到不同的磁盘)

2013年4月12日 11:12
 
0 0

50万条记录,一页10条,他不翻的吐血了。 
如果不需要总页数的话,不需要count可以提高性能。 
比如可以先搜索一天的数据作分页,当翻到最后的时候,自动搜索下一天的数据,继续翻页.[最好把一天的数据cache到缓存,可以减少与数据库的交互].

2013年4月11日 16:35
 
0 0

建议用缓存+多线程,第一次查询的时候多起几个线程分别查询这几张表,将查询的几个大记录合并发送至缓存服务器,翻页的时候直接从缓存中取对应的开始序号到结束序号,我公司的系统(用户表有30张)就是这么搞的。

2013年4月11日 16:13
 
0 0

1、分页查数据 每次记录最后的PKID  
2、下次查询时 加上 pkid > 上次最大的id 
这样可缩小数据范围 而且每次取第一页 


40w不是很多  你执行下explain看下有没有走索引

2013年4月11日 15:52
 
0 0

你可以尝试使用存储过程,在里面根据条件查询出几张表共有多少条符合条件, 
每次去查询的时候不一定要查询几张表,而是根据条件去查询一张单独的表,要是有涉及到两张表以上的情况,则说明分页的数据可能跨越2张表或者是三张表,总之尽量查询一张表,只有查询的数据介于两张表之间,才去关联,这里面的存储过程应该比较复杂。

2013年4月11日 15:47
 
0 0

避免用union all/union这样的语句join后再套一层select和rownum之类的做分页 
如果除了时间外没有其他查询条件了,你可以建一些统计表,比如2月份多少条,3月份多少条,这样,然后看你要查第几页,直接定位到那张表 
如果有其他查询条件就很麻烦了,要统计各种查询条件下每张表有几条记录这样,当然如果条件可能性太多了,可能这个方法就不太方便了

2013年4月11日 15:43
 
 
### ORACLE JOIN 分页查询 示例 在 Oracle 数据库中,多关联查询结合分页的实现可以通过使用 `ROWNUM` 或者分析函数 `ROW_NUMBER()` 来完成。以下是具体的实现方法和示例代码。 #### 使用 ROWNUM 实现分页 `ROWNUM` 是 Oracle 中的一个伪列,用于限制返回的行数。通过嵌套查询的方式,可以实现分页功能。以下是一个多 JOIN 并结合分页的示例: ```sql SELECT * FROM ( SELECT a.*, ROWNUM AS rn FROM ( SELECT e.employee_id, e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id ORDER BY e.employee_id ) a WHERE ROWNUM <= 20 -- 获取前20条记录 ) b WHERE b.rn > 10; -- 从第11条记录开始 ``` 上述查询中,外部查询通过 `ROWNUM` 和子查询的条件限制了返回的行数[^1]。内层查询实现了多 JOIN,并按照 `employee_id` 排序以确保分页结果的一致性。 #### 使用 ROW_NUMBER() 实现分页 `ROW_NUMBER()` 是一种更灵活的分页方式,尤其适用于需要复杂排序规则的场景。以下是基于 `ROW_NUMBER()` 的分页查询示例: ```sql SELECT employee_id, first_name, last_name, department_name FROM ( SELECT e.employee_id, e.first_name, e.last_name, d.department_name, ROW_NUMBER() OVER (ORDER BY e.employee_id) AS rn FROM employees e JOIN departments d ON e.department_id = d.department_id ) WHERE rn BETWEEN 11 AND 20; -- 获取第11到第20条记录 ``` 此查询中,`ROW_NUMBER()` 函数为每一行分配了一个唯一的行号,外层查询通过 `BETWEEN` 语句筛选出指定范围内的记录[^1]。 #### 注意事项 - 在分页查询中,确保内层查询包含明确的排序规则(如 `ORDER BY`),否则可能导致分页结果不稳定。 - 如果数据量较大,建议结合索引优化查询性能,避免全扫描。 ### 结合 MyBatisPlus 的多 JOIN 分页 如果使用 MyBatisPlus 框架,可以直接通过传递 `Page` 对象实现分页查询。以下是一个多 JOIN 的分页查询示例: ```java Page<CustomResult> page = new Page<>(currentPage, pageSize); LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Employee::getDepartmentId, departmentId); Page<CustomResult> result = employeeMapper.selectPage(page, queryWrapper); ``` 对应的 SQL 映射文件如下: ```xml <select id="selectPage" resultType="CustomResult"> SELECT e.employee_id, e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id <where> <if test="departmentId != null"> AND e.department_id = #{departmentId} </if> </where> </select> ``` 此方式利用 MyBatisPlus 的分页插件自动处理分页逻辑[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值