一个简单的两表关联,SQL跑了差不多一天一夜,这两个表都非常巨大,每个表都有几十个G,数据量每个表有20多亿,表的字段也特别多。

相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G的数据,这就会导致消耗大量temp tablespace,SQL慢就是慢在temp来回来回来回...的读写数据。

先创建2个测试表 t1,t2 数据来自dba_objects

create table t1 as select * from dba_objects;

create table t2 as select * from dba_objects;

我们假设 t1 和 t2 就是 两个超级大表, 要运行的 SQL:   select * from t1,t2 where t1.object_id=t2.object_id;

假设t1 t2 都是几十个GB 或者更大, 那么你懂的,上面的SQL基本上是跑不出结果的。

有些人在想,开个并行不就得了,用并行 hash hash 算法跑SQL,其实是不可以的,原因不多说了。

我们可以利用MPP数据库架构(Greenplum/Teradata/vertica)思想,或者是利用HADOOP的思想来对上面的SQL进行优化。

MPP架构/HADOOP架构的很重要的思想就是把数据切割,把大的数据切割为很多份小的数据,然后再对小的进行关联,那速度自然就快了。

在Oracle里面怎么把大数据切成小数据呢,有两个办法,一个是分区,另外一个是分表。我这里选择的是分区,当然了看了这篇文章你也可以分表。

创建一个表P1,在T1的表结构基础上多加一个字段HASH_VALUE,并且根据HASH_VALUE进行LIST分区

CREATE TABLE P1(
HASH_VALUE NUMBER,
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE,
LAST_DDL_TIME DATE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1),
NAMESPACE NUMBER,
EDITION_NAME VARCHAR2(30)
)  
   PARTITION BY  list(HASH_VALUE)
(
partition p0 values (0),
partition p1 values (1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4)
)

同样的,在T2的表结构基础上多加一个字段HASH_VALUE,并且根据HASH_VALUE进行LIST分区

CREATE TABLE P2(
HASH_VALUE NUMBER,
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE,
LAST_DDL_TIME DATE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1),
NAMESPACE NUMBER,
EDITION_NAME VARCHAR2(30)
)  
   PARTITION BY  list(HASH_VALUE)
(
partition p0 values (0),
partition p1 values (1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4)
)

注意:P1和P2表的分区必须一模一样

delete t1 where object_id is null;

commit;

delete t1 where object_id is null;

commit;

insert into p1
select ora_hash(object_id,4), a.*  from t1 a;  ---工作中用append parallel并行插入

commit;

insert into p2
select ora_hash(object_id,4), a.*  from t2 a;  ---工作中用append parallel并行插入

commit;

这样就把 T1 和 T2的表的数据转移到 P1 和 P2 表中了

那么之前运行的 select * from t1,t2 where t1.object_id=t2.object_id  其实就等价于下面5个SQL了

select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=0 and p2.hash_value=0;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=1 and p2.hash_value=1;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=2 and p2.hash_value=2;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=3 and p2.hash_value=3;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=4 and p2.hash_value=4;

工作中,大表拆分为多少个分区,请自己判断。另外一个需要注意的就是ORA_HASH函数

oracle中的hash分区就是利用的ora_hash函数

partition by hash(object_id) 等价于 ora_hash(object_id,4294967295)

ora_hash(列,hash桶) hash桶默认是4294967295 可以设置0到4294967295

ora_hash(object_id,4) 会把object_id的值进行hash运算,然后放到 0,1,2,3,4 这些桶里面,也就是说 ora_hash(object_id,4) 只会产生 0 1 2 3 4

转载于:https://www.cnblogs.com/javaGoGo/p/10447499.html

两张超级大表join优化相关推荐

  1. postgresql大表join优化

    postgresql大表join优化 一.背景 1.数据量: 表名 数据量 f_invoice 87346130 f_invoice_item 97535867 2.索引: 表:f_invoice_i ...

  2. Hive SQL 小表与大表Join 原理与实操

    一.案例演示 1)没有使用map join -- a 表是大表,数据量是百万级别 -- b 表是小表,数据量在百级别 select a.field1 as field1,b.field2 as fie ...

  3. mysql两张大表join优化,MySQL系列6 - join语句的优化

    当被驱动表是一张非常大的冷表,且没有命中索引时.我们该如何做优化呢? 表t2的c2字段是没有索引的,且t2表是一张超级大的冷表,join语句如下: select * from t1 straight_ ...

  4. spark sql优化:小表大表关联优化 union替换or broadcast join

    ----原语句(运行18min) SELECTbb.ipFROM(SELECTip ,sum(click) click_num,round(sum(click) / sum(imp), 4) user ...

  5. 【hive】数据倾斜-大表小表join优化mapjoin

    真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类    真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...

  6. 数据库大表如何优化?

    数据库大表如何优化? 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 1. 限定数据的范围 务必禁止不带任何限制数据范围条件的查询语句.比如:我们当用户在查询订 ...

  7. Spark调优、DataFrame API使用、大表Join、动态分区

    Spark DataFrame [scala版] 实践小结 Spark DataFrame 使用注意事项 下面介绍的是使用Dataframe时 api 文档中没有写,但是需要注意的坑. DataFra ...

  8. 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优

    侯亚南 数据技术处 支宸啸 数据技术处 在大数据计算中,我们可能会遇到一个很棘手的问题--数据倾斜,此时spark任务的性能会比预期要差很多:绝大多数task都很快执行完成,但个别task执行极慢或者 ...

  9. pg9.4 VS pg12大表join

    pg9.4 VS pg12大表join 1.环境 1.从ECM生产财务库.TC库分别同步数据到pg9.4和pg12版本,保证表数据量一致. 2.数据库配置比较 数据库版本 CPU核数 内存 最大IOP ...

最新文章

  1. latex 中文_【小白向】LaTeX 中文入门
  2. oracle递归查询(查询条件ID下得所有子集)
  3. Android 高级Drawable资源---复合Drawable----级别列表Drawabled
  4. linux命令画圣诞树图片,以 Linux 的方式庆祝圣诞节
  5. 树言树语:AIR的 应用方向在哪里?
  6. 机器学习基础(十二)—— 数学基本理论拾遗
  7. 哈尔滨冰景:映衬时代主题
  8. JAVA美发门店管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  9. AlphaBlend失败,错误码87
  10. 计算机房等电位接地规范,一个实例全面讲解机房如何做防雷接地?
  11. Java温习——SUN公司和Java平台
  12. 将小写字母转换成大写字母C/C++(指针)
  13. 南通java行业,南通java技术培训中心
  14. 如何在面试中回答 “你最大的缺点是什么?”
  15. Roson的Qt之旅 #114 QML Repeater(重复器)
  16. 老师怎么制作网上查分系统?
  17. 彩色日志,教你配置颜色分明的日志输出。
  18. windows兼容模式
  19. 10倍于以往的传输速度带宽,Bluetooth(蓝牙)4.2标准发布
  20. Web开发技术十年发展历程

热门文章

  1. vsftpd设置与使用总结
  2. alteon ad3 配置
  3. Python Pyc文件
  4. 【工具类】JDBCUtils,数据库连接池
  5. Android子线程中更新UI的4种方法
  6. PAT 1057. 数零壹
  7. 虚幻4 远处的贴图模糊处理
  8. Android Toolbar Padding
  9. hdu 5095 Linearization of the kernel functions in SVM(模拟,分类清楚就行)
  10. Lightingcolorfilter 滤镜