adsas 数据库是用于广告买量数据分析;在17年由 Oracle 迁移到 PostgreSQL。现把之前的迁移笔记整理下。本次迁移表91个;存储过程21个;数据库大小2G。

1. 准备PostgreSQL数据库

  安装PostgreSQL数据库 参考PostgreSQL简单安装手册 ;

在安装PostgreSQL数据库之前;首先要对数据库硬件要做基准评测;会影响是否能取代Oracle服务器。安装完成之后;需要创建同名 数据库/用户/schema。

2. 配置Ora2Pg迁移工具

  Ora2Pg是一个免费的工具,用于将Oracle数据库迁移到PostgreSQL兼容的模式。它连接您的Oracle数据库,自动扫描并提取它的结构或数据,然后生成可以装载到PostgreSQL数据库的SQL脚本。Ora2Pg可以从逆向工程Oracle数据库到大型企业数据库迁移,或者简单地将一些Oracle数据复制到PostgreSQL数据库中。它非常容易使用,并且不需要任何Oracle数据库知识,而不需要提供连接到Oracle数据库所需的参数。

  安装配置文档

3. 利用Ora2Pg导出数据并导入PostgreSQL

  在上一篇成功安装 Ora2Pg 工具;接下来我们利用Ora2Pg导出数据。

3.1 配置Oracle客户端连接配置文件

[postgres@oracle166 config]$ tnsping ora165

TNS Ping Utility for Linux: Version 11.2.0.4. - Production on -OCT- ::

Copyright (c) , , Oracle.  All rights reserved.

Used parameter files:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ******)(PORT = ))) (CONNECT_DATA = (SERVICE_NAME = orcl)))
OK ( msec)

  当然该步骤也可以省略。在接下来配置ora2pg.conf文件有讲解

3.2 配置ora2pg.conf

ORACLE_DSN  dbi:Oracle:ora165
ORACLE_USER adsas
ORACLE_PWD easouadsas166
LOGFILE /home/postgres/log/Ora2Pg.log
SCHEMA adsas
TYPE TABLE SEQUENCE COPY
PG_NUMERIC_TYPE
PG_INTEGER_TYPE
DEFAULT_NUMERIC float
SKIP fkeys pkeys ukeys indexes checks
NLS_LANG AMERICAN_AMERICA.UTF8
OUTPUT adsas.sql

  只导出 TABLE,SEQUENCE。存储过程,函数,DBLINK,视图等需要改写;

参数配置查考

3.3 导出数据

[postgres@oracle166 config]$ ora2pg -c ora2pg.conf

3.4 导入PostgreSQL

[postgres@oracle166 ]$ psql adsas adsas
psql (9.6.)
Type "help" for help. adsas=> \i /home/postgres/config/adsas.sql

  表数据跟序列已成功导入;接下来的开始改写存储过程和函数。

4. PostgreSQL创建oracle兼容函数(Orafce)

  在改写存储过程/函数之前;先安装Oracle兼容函数(Orafce);它会让你觉得PostgreSQL跟Oracle写法没什么区别;PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包,默认PostgreSQL是没有的,需要安装orafce包来实现这些兼容性。

  安装文档

  现在orafce已经包含了如下内容。

. 类型 date, varchar2 and nvarchar2
. 函数 concat, nvl, nvl2, lnnvl, decode, bitand, nanvl, sinh, cosh, tanh and oracle.substr
. dual 表
. package :
dbms_output
utl_file
dbms_pipe
dbms_alert
PLVdate
PLVstr and PLVchr
PLVsubst
DBMS_utility
PLVlex
DBMS_ASSERT
PLUnit
DBMS_random

5. 安装PostgreSQL中调试工具plpgsql存储过程

  这个我感觉没多大用;可以忽略!

  安装文档

6. 存储过程/函数改写过程

  A/G

7. Oracle迁移PG代码优化

  经存储过程/函数改写完成;代码要跟Oracle等同;执行时长跟Oracle上面的时长是否差不多;发现在Oracle上面执行 12s;而改写的代码需要 256s;相差21倍之多。这差距不是一般的大。同样的代码可能在Oracle执行效果要好;这跟数据库底层代码有关。

7.1 insert ... on conflict 妙用

  经核查;其中有条SQL花了将近240s的时间。

 INSERT INTO TBL_AD_CLICK_LOG
SELECT *
FROM TMP_AD_CLICK_LOG
WHERE (ES_APP_ID, IDFA_SUM) NOT IN
(SELECT ES_APP_ID, IDFA_SUM FROM TBL_AD_CLICK_LOG);

  表TBL_AD_CLICK_LOG: 存放所有已排重的点击数;数据量有40万条。
  表TMP_AD_CLICK_LOG: 存放当天已排重点击数;
该SQL目的就是避免重复的 idfa_sum 在插入表 TBL_AD_CLICK_LOG;以达到去重的效果。该SQL在Oracle上运行时长1s左右。然而在PG上运行时长将近240s。效率差。与这SQL等价且高效的SQL。

INSERT INTO TBL_AD_CLICK_LOG
SELECT *
FROM TMP_AD_CLICK_LOG on conflict (ES_APP_ID, IDFA_SUM) do nothing;

  使用该SQL之前需创建唯一索引;

CREATE UNIQUE INDEX IND_AD_CLICK_IDFA ON TBL_AD_CLICK_LOG(ES_APP_ID, IDFA_SUM);

  优化后;在PostgreSQL执行一次调度不到5s;相比Oracle的执行一次调度需要12s还短。

7.2 高效删除重复数据

  在前例中;需要创建唯一索引;但是表TBL_AD_CLICK_LOG存在重复记录;由于与媒体对接测试的数据为清理。删除表中重复数据;想都不用想用rowid;在PG中;ctid跟rowid对应。所以SQL自然而然就出来了。放到PostgreSQL上执行;执行了 396s 还在执行中。我终止SQL执行。

DELETE FROM TBL_AD_CLICK_LOG
WHERE ctid NOT IN (SELECT MIN(ctid)
FROM TBL_AD_CLICK_LOG
GROUP BY ES_APP_ID, IDFA_SUM);

优化的目的:用最小的时间达到相同效果。

  所以先在Oracle去执行;在用ora2pg工具迁移到PostgreSQL;我没意见;比较相比前面花的时间要少。在PostgreSQL有没有更高效的SQL呢?答案是有的

 delete from tbl_ad_click_log
where ctid = any(array(select citd
from (select "row_number"() over(partition by es_app_id, idfa_sum order by id) as rn,ctid
from tbl_ad_click_log) as ad
where ad.rn > 1));

  先别吐槽SQL更复杂;但效率真的很棒;执行只花8s就搞定

adsas数据库去O记的更多相关文章

  1. MySql单表最大8000W+ 之数据库遇瓶颈记

    前言 昨晚救火到两三点,早上七点多醒来,朦胧中醒来发现电脑还开着,赶紧爬起来看昨晚执行的SQL命令结果.由于昨晚升级了阿里云的RDS,等了将近两个小时 还在 升降级中,早上阿里云那边回复升级过程中出现 ...

  2. 数据库实战案例—————记一次TempDB暴增的问题排查

    前言 很多时候数据库的TempDB.日志等文件的暴增可能导致磁盘空间被占满,如果日常配置不到位,往往会导致数据库故障,业务被迫中断. 这种文件暴增很难排查,经验不足的一些运维人员可能更是无法排查具体原 ...

  3. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

  4. CentOS上oracle 11g R2数据库安装折腾记

    1.虚拟机上centos镜像的获取.这里推荐网易镜像站中的CentOS7版本(其他开源镜像站亦可).这里给出链接: http://mirrors.163.com/centos/7.3.1611/iso ...

  5. pgsql数据库备份还原记

    今天又搞了一个pgsql 的备份还原,差一点没有成功,以前总是想当然的用,没认真想背后的东西,也没对过程中的疑问做记录,所以后面也没什么印象,常见常新,这次既然又遇到就总结一下. 之前操作pgsql数 ...

  6. oracle 数据库去重复数据

    delete from 表名 a where rowid !=(select max(rowid) from 表名 b where a.ORDER_ID=b.ORDER_ID) 例:如果重复的数据表是 ...

  7. 数据库去空格 去table 去回车符号 去重

    1 update bd_prod_cate c set c.cate_name = replace(c.cate_name,chr(9),'')//去掉tab符号的 2 update bd_prod_ ...

  8. Django去操作已经存在的数据库

    你有没有遇到过这种情况? 数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头 ...

  9. 通过自研数据库画像工具支持“去O”评估

    “去O”,是近些年来一直很火的一个话题,随之也产生了各种疑惑,包括现有数据库评估.技术选型等.去O是项系统工程,需要做好充分的评估.本文通过自研工具,生成数据库画像,为去O评估提供一手数据,希望给大家 ...

随机推荐

  1. Python并发编程-线程

    Python作为一种解释型语言,由于使用了全局解释锁(GIL)的原因,其代码不能同时在多核CPU上并发的运行.这也导致在Python中使用多线程编程并不能实现并发,我们得使用其他的方法在Python中 ...

  2. MD5+Salt值

    生成Salt值 package util; import java.util.Random; public class Salt { public String getSalt() { Random ...

  3. 【倍增】Tak and Hotels II @ABC044&ARC060/upcexam6463

    6463: Tak and Hotels II 时间限制: 1 Sec  内存限制: 128 MB 题目描述 N hotels are located on a straight line. The ...

  4. 【模拟】[NOIP2014]螺旋矩阵[c++]

    题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...

  5. 基于spring boot 2.x的websocket示例

    spring boot 2/spring 5自带了websocket,下面是最基本的示例(包括java服务端.java客户端以及js客户端) 一.pom依赖 <dependencies> ...

  6. Java知识回顾 (9) 同步、异步IO

    一.基本概念 同步和异步: 同步和异步是针对应用程序和内核的交互而言的. 同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪: 而异步是指用户进程触发IO 操作以后便开始做自己的 ...

  7. IE中的console.log

    部分情况下,IE中如果控制台没有开启,打印console.log可能会报错,一下为兼容方案: if(window.console && console.log) { console.l ...

  8. C# SemaphoreSlim 实现

    当多个任务或线程并行运行时,难以避免的对某些有限的资源进行并发的访问.可以考虑使用信号量来进行这方面的控制(System.Threading.Semaphore)是表示一个Windows内核的信号量对 ...

  9. 微信小程序生成海报分享:canvas绘制文字溢出如何换行

    主要思路: 1.先分割为字符串数组,然后一个字一个字绘图,利用ctx.measureText(string) 方法,获取绘制后的宽度,判断宽度在多少内就另起一行,再将各行拼成一个字符串 2.计算另起的 ...

  10. SSE图像算法优化系列二十一:基于DCT变换图像去噪算法的进一步优化(100W像素30ms)。

    在优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码) 一文中,我们曾经优化过基于DCT变换的图像去噪算法,在那文所提供的Demo中,处理一副1000*1000左右的灰度噪音图像耗时 ...