最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下:

  1、软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字段多些,但是对于查询的速度提升是非常明显的,特别是在排序的情况下。

  2、我们在关联的时候可能需要排序的表只是其中的一张或者两张,我们可以先针对这两张需要排序的表先查询排序,然后再用这两个表查询的结果关联其他表。代码如下:

  

 SELECT * FROM (
SELECT * FROM M_RK_JBXX A
LEFT JOIN M_RK_ZFGX B ON A.RKID = B.RKID
LEFT JOIN(SELECT *
FROM M_DZ_MP D
LEFT JOIN M_DZ_LD E ON D.LDID = E.LDID
ORDER BY E.XC, E.PXH, D.PXH)DD ON B.MPID = DD.MPID
LEFT JOIN M_DZ_WGGL F ON DD.WGID = F.WGID
LEFT JOIN M_RK_HJXXZH C ON C.MPID = DD.MPID
)

后来我在需要分页的环境下,用rownum来进行分页,发现按照上面的排序的顺序就被打乱了。在网上找了很多资料也看了很多博客,也没找到解决方案。

所以上面的代码的适用性就很局限了(不分页的情况下)。

但是我需要高效率的分页怎么办呢?rownum满足不了我呀。后来我又找到了一个函数ROW_NUMBER() OVER(ORDER BY column)  ,通过该函数可以极大的提高查询的效率。

使用的方式为

 SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY A.PXH, B.PXH) NUM,
A.*,B.*
FROM TAB1 A
LEFT JOIN TAB2 B
ON A.T2= B.ID
)
WHERE NUM BETWEEN 1 AND 20

通过这种方式我的查询速度提高了将近10倍,当然我的实际环境比这段代码要麻烦很多。

ORACLE数据库多表关联查询效率问题解决方案的更多相关文章

  1. Oracle数据库锁表的查询方法以及解锁的方法

    1,锁表语句简单查询方法   select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session ...

  2. 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?

    概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...

  3. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  4. oracle 两表关联查询

      oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...

  5. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

  6. oracle解决多表关联分组查询问题

    做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...

  7. Oracle - 查询语句 - 多表关联查询

    /* SQL语句的历史版本 SQL89 比较多 SQL92 SQL99 多表关联查询 笛卡尔积 等值关联查询 非等值关联查询 左外连接 右外连接 全外连接 自连接 */ --------------- ...

  8. oracle02--多表关联查询

    1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应 ...

  9. MSSQL N张表关联查询

    declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...

随机推荐

  1. 【链表】【模拟】Codeforces 706E Working routine

    题目链接: http://codeforces.com/problemset/problem/706/E 题目大意: 给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别 ...

  2. zookeeper集群环境安装配置

    众所周知,Zookeeper有三种不同的运行环境,包括:单机环境.集群环境和集群伪分布式环境 在此介绍的是集群环境的安装配置 一.下载: http://apache.fayea.com/zookeep ...

  3. 浅谈层次化的AI架构

    原文地址:http://www.aisharing.com/archives/86/comment-page-1 记得在以前的一篇文章中谈到了一种类似于双缓冲的AI结构,最近在整理一些东西的时候,发现 ...

  4. [Locked] Best Meeting Point

    Best Meeting Point A group of two or more people wants to meet and minimize the total travel distanc ...

  5. OpenWrt简要刷机教程

    准备工作 1. 下载openwrt中文固件到PC.(当然其他英文固件也可) 2  找到路由器的RST键. 3  找到路由器刷机口---姑且称之为“WAN口” 4. 关闭路由器的电源. 5. 将PC网口 ...

  6. SoupUI学习资料

    官网: https://www.soapui.org 下载地址: https://www.soapui.org/downloads/soapui.html 官方文档: https://www.soap ...

  7. powershel连接数据库监控数据库状态并发报警邮件

    function Get-DatabaseData {    [CmdletBinding()]    param (        [string]$connectionString,        ...

  8. oracle 零散知识汇集

    1. Select '登陆' + 2 From dual会报错: ora- 01722 无效数字,原理是oracle把'登陆'当成数字来和2进行加法运算. Select '登陆'|| 2 From d ...

  9. slides 带手势的图片滑动效果(用于移动终端)

    slidesjs 是基于jQuery开发的一款功能强大,是简单的幻灯片插件,但是需要要应用于移动终端的话,还需要考虑手势滑动时候图片切换功能. 此次,我就在slidesjs基础上扩展了两个swipe属 ...

  10. [PWA] 6. Hijacking response

    For example, if the url is not match to any API endpoint, we want to return 404 error message. So fi ...