oracle处理1亿条记录group by

win7 双核cpu 8G内存 普通硬盘
C:\Users\Admin>systeminfo
OS 名称:          Microsoft Windows 7 专业版 
OS 版本:          6.1.7601 Service Pack 1 Build 7601
系统类型:         x64-based PC
处理器:           安装了 1 个处理器。
                  [01]: Intel64 Family 6 Model 94 Stepping 3 GenuineIntel ~3201 Mhz
物理内存总量:     8,081 MB
可用的物理内存:   3,256 MB
C:\Users\Admin>wmic diskdrive get Caption,Index,InterfaceType,Manufacturer,Model
Caption                                 Index  InterfaceType  Manufacturer      Model                                   
ST1000DM003-1SB102 ATA Device           0      IDE            (标准磁盘驱动器)  ST1000DM003-1SB102 ATA Device           
NVMe SAMSUNG MZVLW128 SCSI Disk Device  1      SCSI           (标准磁盘驱动器)  NVMe SAMSUNG MZVLW128 SCSI Disk Device  

某列3千万个左右的分组,直接group by里count,是出不来数的,以下处理步骤:

1、为省份列建位图索引分省处理
create bitmap index ix_biz_data_sheng on biz_data (sheng);
2、创建没有主键没有索引的nologging表存储group by对应的列值和count数
3、插入时加append hint,每个省提交一次,在服务器上使用sqlplus执行
begin
  for cur in (select distinct sheng from biz_data) loop
    insert /*+ APPEND */ into t_cols nologging
      select user, count(1) cnt
        from biz_data
       where sheng = cur.sheng
       group by user;
    commit;
  end loop;
end;


1、nologging
alter table biz_xxx nologging
2、去掉主键、索引
3、分批处理及时commit,比如年份、省份
insert /*+ append */ into biz_xxx nologging

转载于:https://my.oschina.net/h2do/blog/1555489

### Oracle 大表查询性能优化的最佳实践 对于包含数亿条记录的大规模表格,在Oracle数据库中的查询效率至关重要。为了提高这类大表的查询性能,可以采取多种策略和技术。 #### 1. 合理设置字符列长度 适当调整字符类型的宽度有助于节省存储空间并提升索引访问速度[^1]。这不仅减少了磁盘占用量,还能够加快数据检索过程。 #### 2. 使用合适的命名约定 采用有意义且一致性的字段名可以帮助开发人员更好地理解业务逻辑,并减少混淆的可能性。例如`MAX_STOCK_COUNT`是一个更清晰的选择,而像`MAX_COUNT`这样的名称则可能引起误解[^2]。 #### 3. 创建有效的索引结构 针对频繁使用的查询条件创建B树或位图索引能显著改善读取操作的速度。特别是当涉及到多列组合时,复合索引往往表现更好。此外,分区技术也值得考虑——通过水平分割大型表来分散负载压力。 ```sql CREATE INDEX idx_large_table ON large_table(column_name); ``` #### 4. 利用物化视图加速复杂计算 如果某些聚合函数经常被调用,则可以通过预先计算并将结果保存到物化视图中实现快速响应。这种方式特别适用于那些基于历史数据分析的应用场景。 ```sql CREATE MATERIALIZED VIEW mv_sales_summary AS SELECT region, SUM(sales_amount) FROM sales GROUP BY region; ``` #### 5. 实施批量处理机制 分批加载和更新大批量的数据集可有效降低锁竞争现象的发生概率,从而保障系统的稳定性和并发能力。同时也要注意控制每次提交事务的影响范围以免造成不必要的开销。 ```sql BEGIN FOR i IN (SELECT * FROM large_table WHERE MOD(id, 1000) = 0) LOOP -- 执行具体的操作... COMMIT; -- 定期提交更改以释放资源 END LOOP; END; / ``` #### 6. 调整SQL语句编写方式 遵循ANSI标准编写的SQL通常具有更好的移植性和维护性;另外还可以尝试利用提示(Hint)指导执行计划生成器做出最优决策路径。 ```sql /*+ PARALLEL(8) */ SELECT /*+ FULL(t) */ COUNT(*) FROM very_large_table t; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值