巧用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:包括滚 ...
随机推荐
- php -- 格式化字符串
----- 003-output.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- Spring整合Mybatis原理简单分析
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
- nginx把两个不同的网站挂到同一台服务器的80端口上
本文主要分享如果利用nginx把两个不同的网站挂到同一台服务器的80端口上 最终效果 例如:www.manyjar.com (web服务器是8080端口)和ishenghuo.manyjar.com ...
- 第五章 Web应用程序状态管理
状态管理概述 Cookie Session URL重写 状态管理概述: HTTP协议使用的是无状态的连接 对容器而言,每一个请求都来自于一个新的客户 这里我们有四种方法来解决这个状态: a:表 ...
- Spark(1.6.1) Sql 编程指南+实战案例分析
首先看看从官网学习后总结的一个思维导图 概述(Overview) Spark SQL是Spark的一个模块,用于结构化数据处理.它提供了一个编程的抽象被称为DataFrames,也可以作为分布式SQL ...
- Mac添加命令别名
1. 切换到用户主目录 $ cd 2. 编辑或新建.bash_profile文件 3. 添加别名 命令别名设置语法: alias [别名]='[指令名称]' 注意:等号两边均无空格,指令名称中如有空格 ...
- linux系统编程:自己动手写一个cp命令
cp命令的基本用法: cp 源文件 目标文件 如果目标文件不存在 就创建, 如果存在就覆盖 实现一个cp命令其实就是读写文件的操作: 对于源文件: 把内容全部读取到缓存中,用到的函数read 对于目标 ...
- HDU3440(差分约束)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU2859(KB12-Q DP)
Phalanx Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- pycharm虚拟环境
pycharm虚拟环境 1. 选择一个本地的空目录,---该目录就作为python虚拟环境目录, 2. 选择本地python安装目录: 3. 勾选该选项后则可以使用base interpreter中的 ...