巧用top percent优化top 1
废话不多说,直接上sql
SELECT top 1 B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc
执行计划如下:

执行时间:
16秒、
分析:
嵌套循环之前,进行了排序操作,驱动表CREW_TASK 单表数据量300232。去重排序之后29w+。FLIGHTS 表单表44w+,这里不走hash 的原因是因为top1导致。故去掉 TOP 1 限制语句
SELECT B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc
执行计划:

执行时间:
分析:很明显hash走了hash 匹配,可见在双大表情况下,hash 匹配返回5000多行比嵌套循环返回一条要快得多。
方向明确,那么怎么取上述第一条数据呢?这个时候用到 TOP percent,也就是返回结果集的一个比例值,而不是 top 1 第一条数据:
sql如下:
SELECT top 100 percent B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc
执行时间
,返回100%的结果集
怎么返回第一条?很简单,我返回1%的结果集如下:
SELECT top 1 percent B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc
执行时间:
,很明显返回的是1%的结果集
返回0.01的结果集:
SELECT top 0.01 percent B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc
执行时间:
已经达到要求。
注意:这里返回的是结果集的 百分比,虽然现在满足取第一条的要求,但是是随数据量增大,可能会多条, 故,外面包一层,取TOP 1 这样能保证只取一条。
select top 1 AA.* from (
SELECT top 1 percent B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD
FROM dbo.FLIGHTS A
LEFT OUTER JOIN
(SELECT DISTINCT TASK_ID, CREW_ID
FROM dbo.CREW_TASK
) B ON A.COCKPIT_CREW_GROUP = B.TASK_ID
LEFT OUTER JOIN dbo.FLIGHTS_CREW_REPORT C ON A.FLTID = C.FLTID
LEFT JOIN CREW_INFO E ON B.CREW_ID = E.CREW_ID
LEFT JOIN FLIGHTS_STC F ON A.STC = F.IATA_CODE
WHERE (A.COCKPIT_CREW_GROUP > 0) AND (A.STATUS='ATA')
AND F.RATIO = 1 AND NOT (A.AC LIKE '%--%')
AND B.CREW_ID = ISNULL(60, B.CREW_ID) AND C.OFFBLK is not null AND C.ONBLK is not null
AND C.CREW_LEFT is not null AND C.CREW_RIGHT is not null
ORDER BY A.STD desc )AA
执行时间:
收工!
巧用top percent优化top 1的更多相关文章
- SQL优化系列(二)- 优化Top SQL
优化最耗资源的N条SQL语句 如何从SGA或者AWR中找出最消耗资源的SQL, 例如最慢的20条SQL, 然后逐条优化? SQL自动优化工具SQL Tuning Expert Pro for Orac ...
- 33.allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)
Autosilk top, Silkscreen top 和Assembly top Autosilk top:最后出gerber的时候,自动生成的丝印层.会自动调整丝印位置,以及碰到阻焊开窗的地方, ...
- allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)
allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转) Autosilk top, Silkscreen top 和Assembly t ...
- 获取分组后的TOP 1和TOP N记录
MySQL获取分组后的TOP 1和TOP N记录 有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MyS ...
- css3的transform变换scale和translate等影响jQuery的position().top和offset().top
css3的transform变换scale和translate等影响jQuery的position().top和offset().top
- 每天进步一点点------Allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别
Autosilk top:最后出gerber的时候,自动生成的丝印层.会自动调整丝印位置,以及碰到阻焊开窗的地方,丝印会自动消失,避免露锡的地方涂上丝印(一般画丝印层的时候,焊盘上不会画上丝印,所以过 ...
- 数据库学习笔记3 基本的查询流 2 select lastname+','+firstname as fullname order by lastname+','+firstname len() left() stuff() percent , select top(3) with ties
数据库学习笔记3 基本的查询流 2 order by子句对查询结果集进行排序 多列和拼接 多列的方式就很简单了 select firstname,lastname from person.pers ...
- (转)top关键字与top表达式(SQLServer)
SQLServer 中,top也很有用,例如查询部分数据,还可以用表达式.其语法如下: SELECT TOP number|percent column_name(s) FROM table_name ...
- jquery的offset().top 和position().top 详解 和如何用js实现
1 jquery定义: offset().top 相对于当前文档的坐标(的高度) ps:包括滚动条卷去的高度 position().top 返回的是相对于其定位的祖辈元素的坐标(的高度) ps:包括滚 ...
随机推荐
- 解决IDEA中进行maven install报:系统资源不足的问题
一.背景 最近在idea中使用maven对公司的项目进行install的时候老是出现系统资源不足的问题导致install失败,在网上搜索也没找到很好的答案,自己不断摸索,最终在idea的配置里面找到了 ...
- es-03-DSL的简单使用
以下操作在kibana中进行, 如果在linux的shell中, 请使用 curl -Xget 'http://node1:9200/index/type/id' -d '{ ... }' 的形式, ...
- Andrew Ng机器学习课程笔记(一)之线性回归
Andrew Ng机器学习课程笔记(一)之线性回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364598.html 前言 ...
- slf4j 作用及logback概述
为什么要使用slf4j 现实场景: 我们自己的系统中使用了logback这个日志系统 我们的系统使用了A.jar,A.jar中使用的日志系统为log4j 我们的系统又使用了B.jar,B.jar中使用 ...
- shell脚本案例分享 - 业务系统日志自定义保留或删除需求
需求说明: 线上某些业务系统的日志不定期产生, 有的每天产生, 有的好几天才产生, 因为系统只有在用的时候才产生日志,日志文件均存放在以当天日期命名的目录下. 当日志目录越来越多时就需要处理, 由此 ...
- MQ5.3在redhat9上的安装
一.准备工作 1.安装linux软件包 确保系统中有libgcc_s.so和libstdc++.so.3. 如无意外,libgcc_s.so在redhat中已经存在,存放路径为:/usr/lib/gc ...
- windows环境下搭建Java开发环境(三)——Maven环境配置使用 (转)
1. 安装配置Maven: 1.1 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. Maven下载地址: http://maven. ...
- Spark2.1.0模型设计与基本架构(下)
阅读提示:读者如果对Spark的背景知识不是很了解的话,建议首先阅读<SPARK2.1.0模型设计与基本架构(上)>一文. Spark模型设计 1. Spark编程模型 正如Hadoop在 ...
- asp.net mvc 学习笔记 - 单一实例设计模式
学习之前,先喊一下口号:每天进步一点,生活更好一点 首先声明一点,我也是新新新手一枚,崭新的新哦.如果文章有不合理的地方,也请各位博友多多指点,不要乱喷哦 我的文采很低调,低调到语文老师对我的期望是你 ...
- .39-浅析webpack源码之parser.parse
因为换了个工作,所以博客停了一段时间. 这是上个月留下来的坑,webpack的源码已经不太想看了,又臭又长,恶心的要死,想去看node的源码……总之先补完这个 上一节完成了babel-loader对J ...