oracle 分页、截断查询
需求:从车管所的备案库中(oracle)取出数据,放到车综大数据平台(http方式)
现场情况:oracle中有三张表,CZRKXX(常住人口信息),ZDRYXX(重点人员信息),ZPXX(照片信息)
这三张表,字段超级多,没有主键,只选取了需要展示的字段,以 CZRKXX 表做左连接查询,大约是 500W 条数据,每次取500条
实现方式:多进程,多线程,增量获取
由于没有自增ID,数据的生成时间 和 更新时间,没有任何字段能够作为依次的查询依据,所以用到分页、截断
增量的实现:每次读取后,将索引变量增加一定区间大小,然后存储到文件中(数据库也行),为的是在下一次读取时(程序挂掉也不会影响),再次开启可以继续从中断的地方开始读取
单核 CPU 保持在 20 线程左右
连接查询SQL:{} 中填充数据的索引值
例如:ROWNUM <= 500, ... UA.RN > 0, 取到的是索引为 1 ~ 500 的记录,RN 是记录的索引值
query_sql = """SELECT * FROM (SELECT ROWNUM RN, Z.ZDRKBH, Z.ZDRYLBDM, Z.XM, Z.XMHYPY, Z.CSRQ, Z.HJDZ_JYQK, Z.HJDZ_XZQHDM, Z.XZZ_XZQHDM, Z.XZZ_DZMC, Z.SC_XXRKSJ, Z.DXBH, Z.LADWJGDM, Z.ZJLASJ, Z.ZDRYLBXL, Z.ZDRYYXXDM, Z.JLXZSJ, Z.JLBGSJ, Z.CJSJ, Z.SJCQSJ, Z.DM_ID, Z.SJRKSJ, Z.SJGXSJ, C.GMSFHM, C.RYBH, C.XBDM, C.SG, C.XXDM, C.MZDM, C.ZJXYDM, C.HYZKDM, C.BYZKDM, C.ZYLBDM, C.ZY, C.JG_GJHDQDM, C.JG_XZQHDM, C.CSD_GJHDQDM, C.CSD_XZQHDM, C.CSD_DZMC, C.HJDZ_DZMC, C.FWCS, C.SFZX_PDBZ, P.ZP FROM (CZRKXX C LEFT JOIN ZDRYXX Z ON C.GMSFHM=Z.GMSFHM) LEFT JOIN ZPXX P ON Z.GMSFHM=P.GMSFHM WHERE ROWNUM <= {}) UA WHERE UA.RN > {} """
单表查询SQL:
两条 sql 分页的逻辑是一样的
"""select * from (select P.GMSFHM, P.ZP, ROWNUM RN from hsjj.ZPXX P where ROWNUM <= {}) UA where UA.RN > {}"""
上面是模板,{} 中需要做字符串格式化:
"""select * from (select P.GMSFHM, P.ZP, ROWNUM RN from hsjj.ZPXX P where ROWNUM <= 100) UA where UA.RN > 0"""
截断查询SQL:
"select * from (select XH, XM, GMSFHM, HJXZ, RYLX, DJDW_GAJGMC, ZP, JZ_LXDH, JJ_LXDH from DCRY.SWRYXX) WHERE ROWNUM <= 10;"
end~