select *
from (select t.row_id,
t.supplier_name,
t.tel,
address,
t.contact,
t.contact_post,
t.contact_mobi,
t.contact_tel,
case
when project_supp_type = 0 then
to_number(nvl(t.discount_rate, 0))
when project_supp_type2 = 0 then
to_number(nvl(t.discount_rate2, 0))
when project_supp_type3 = 0 then
to_number(nvl(t.discount_rate3, 0))
when project_supp_type4 = 0 then
to_number(nvl(t.discount_rate4, 0))
when project_supp_type5 = 0 then
to_number(nvl(t.discount_rate5, 0))
when project_supp_type6 = 0 then
to_number(nvl(t.discount_rate6, 0))
end as rate
from md_supplier t
where t.supplier_type = 4
and (project_supp_type = 0 or project_supp_type2 = 0 or
project_supp_type3 = 0 or project_supp_type4 = 0 or
project_supp_type5 = 0 or project_supp_type6 = 0)
and t.status = 1
and exists (select *
from md_project mp, md_project_supplier mps
where mp.row_id = mps.project_id
and mp.status = 1 and supplier_id = t.row_id)
order by rate desc, t.supplier_name)
where rownum <= 5

这是原始sql,sql运行4秒出结果,网友反映比较慢

看了执行计划

执行计划没有问题,驱动表全表扫描也只是返回27条,无伤大雅,被驱动表view VW_SQ_1

被驱动表内走了 merge jion,merge jion比nl要强一下,进行全表扫描之后再排序,之后再连接

问题要看exists中的表 返回227行,在view中 exists中的表有相当于一个驱动表了,他要驱动id 10,每次查询都要全表 ,还要227次,就慢了,就需要改写

将它提取出来,不让他扫描多次,这就是思路

改写之后的sql

with ttt as (select *
from md_project mp, md_project_supplier mps
where mp.row_id = mps.project_id
and mp.status = 1
)
select *
from (select t.row_id,
t.supplier_name,
t.tel,
address,
t.contact,
t.contact_post,
t.contact_mobi,
t.contact_tel,
case
when project_supp_type = 0 then
to_number(nvl(t.discount_rate, 0))
when project_supp_type2 = 0 then
to_number(nvl(t.discount_rate2, 0))
when project_supp_type3 = 0 then
to_number(nvl(t.discount_rate3, 0))
when project_supp_type4 = 0 then
to_number(nvl(t.discount_rate4, 0))
when project_supp_type5 = 0 then
to_number(nvl(t.discount_rate5, 0))
when project_supp_type6 = 0 then
to_number(nvl(t.discount_rate6, 0))
end as rate
from md_supplier t
where t.supplier_type = 4
and (project_supp_type = 0 or project_supp_type2 = 0 or
project_supp_type3 = 0 or project_supp_type4 = 0 or
project_supp_type5 = 0 or project_supp_type6 = 0)
and t.status = 1
and exists (select * from ttt where supplier_id = t.row_id)
order by rate desc, t.supplier_name)
where rownum <= 5

sql运行时间为0.03秒

简单改写SQL达到优化目的的更多相关文章

  1. 深入浅出数据仓库中SQL性能优化之Hive篇

    转自:http://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job,一个Map Reduce Job又有Map,R ...

  2. 一个sql的优化

    原文:一个sql的优化 目的:为了查询某天某个服务器上的登录id的个数   刚开始编写的sql: select count(a.mac) logusers from Log_MacLogin_All ...

  3. SQL性能优化前期准备-清除缓存、开启IO统计

    文章来至:https://www.cnblogs.com/Ren_Lei/p/5669662.html 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置 ...

  4. 【SQL系列】深入浅出数据仓库中SQL性能优化之Hive篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SQL系列]深入浅出数据仓库中SQL性能优化之 ...

  5. 从简单Sql探索优化之道

    从简单Sql探索优化之道 梁敬彬 2016-03-17 09:39:41 本文需要优化的语句是select count(*) from t,这简单的统计语句一出,估计不少人纳闷了,能有啥优化空间,还优 ...

  6. SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  7. SOAR SQL进行优化和改写的自动化工具

    前言 SQL优化是程序开发中经常遇到的问题,尤其是在程序规模不断扩大的时候.SQL的好坏不仅制约着程序的规模,影响着用户的体验,甚至威胁着信息的安全. 我们经常听到说哪家平台挂了,哪家网站被黑了,但我 ...

  8. 小米正式开源 SQL 智能优化与改写工具 SOAR

    近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...

  9. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

随机推荐

  1. 在ASP.NET MVC中使用DropDownList

    在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性H ...

  2. C# 中的值类型和引用类型

    原文 C# 中的值类型和引用类型 值类型(value type):int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管 ...

  3. Java Script 正则表达式的使用示例

    一.语法 1.1 在JS中的使用代码 var myregex = new RegExp("^[-]?[0-9][0-9]{0,2}\\.[0-9]{5,15}\\,\s*[-]?[0-9][ ...

  4. Android中Bitmap和Drawable,等相关内容

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  5. POJ 1236 Network of Schools 有向图强连通分量

    参考这篇博客: http://blog.csdn.net/ascii991/article/details/7466278 #include <stdio.h> #include < ...

  6. 发送复杂的HTTP GET请求并且取回响应。

    设计思想: 创建一个HttpWebRequest类的实例,并通过GetReponse()方法取回响应的HTTP响应. 实例方案: string url="http://www.baidu.c ...

  7. IE兼容性问题解决方案2--css样式兼容标签

    在页面中加入下面的标签: <meta http-equiv = "x-UA-compatible" content="IE=edge,chrome=1"& ...

  8. 三相异步电动机过载保护及报警PLC控制

    一.项目所需设备.工具.材料 见表7-1. 表7-1  项目所需设备.工具.材料 二.  训练内容: 1.项目描述 试设计一电动机过载保护程序,要求电动机过载时能自动停止运转,同时发出10秒钟的声光报 ...

  9. mysql修改字段的语句写法

    http://www.111cn.net/database/mysql/50678.htm 下面为您介绍的sql语句都是mysql修改字段操作中的一些常用语句,如果您是一个刚刚接触mysql数据库的新 ...

  10. 学习和理解C#的委托

    去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却 ...