废话不多说,直接上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的更多相关文章

  1. SQL优化系列(二)- 优化Top SQL

    优化最耗资源的N条SQL语句 如何从SGA或者AWR中找出最消耗资源的SQL, 例如最慢的20条SQL, 然后逐条优化? SQL自动优化工具SQL Tuning Expert Pro for Orac ...

  2. 33.allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)

    Autosilk top, Silkscreen top 和Assembly top Autosilk top:最后出gerber的时候,自动生成的丝印层.会自动调整丝印位置,以及碰到阻焊开窗的地方, ...

  3. allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)

    allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转) Autosilk top, Silkscreen top 和Assembly t ...

  4. 获取分组后的TOP 1和TOP N记录

    MySQL获取分组后的TOP 1和TOP N记录 有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MyS ...

  5. css3的transform变换scale和translate等影响jQuery的position().top和offset().top

    css3的transform变换scale和translate等影响jQuery的position().top和offset().top

  6. 每天进步一点点------Allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别

    Autosilk top:最后出gerber的时候,自动生成的丝印层.会自动调整丝印位置,以及碰到阻焊开窗的地方,丝印会自动消失,避免露锡的地方涂上丝印(一般画丝印层的时候,焊盘上不会画上丝印,所以过 ...

  7. 数据库学习笔记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 ...

  8. (转)top关键字与top表达式(SQLServer)

    SQLServer 中,top也很有用,例如查询部分数据,还可以用表达式.其语法如下: SELECT TOP number|percent column_name(s) FROM table_name ...

  9. jquery的offset().top 和position().top 详解 和如何用js实现

    1 jquery定义: offset().top 相对于当前文档的坐标(的高度) ps:包括滚动条卷去的高度 position().top 返回的是相对于其定位的祖辈元素的坐标(的高度) ps:包括滚 ...

随机推荐

  1. 开启curl函数功能

    先打开php.ini文件 然后找到extension=php_curl.dll 这句话 然后把前面的:去掉,再重启apache服务 即可!

  2. 如何查找SHELL的进程号并杀死

    一.shell查找进程并杀死 #!/bin/sh tomcat_id=`ps -ef | grep tomcat | grep -v "grep" | awk '{print $2 ...

  3. 复刻smartbits的国产网络测试工具minismb-如何测试路由器

    复刻smartbits的国产网络性能测试工具minismb,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数 ...

  4. Maven Jetty9

    <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactI ...

  5. mac 上位Idea 配置Project SDK

    问题 刚开始没有Project SDK 方法 添加SDK: /Library/Java/JavaVirtualMachines/jdkXYZ_VERSION.jdk/Contents/Home/jre ...

  6. elasticSearch6源码分析(12)DiscoveryModule

    1.DiscoveryModule概述 /** * A module for loading classes for node discovery. */ 2.discovery The discov ...

  7. jQuery UI的datepicker()与变更格式

    继续MVC应用程序的练习,刚刚练习了jQuery的UI中的datepicker()的方法,它是为了让用户能在文本框中快捷输入日期. 代码简洁与简单. 打开以前练习的一个视图Views\Home\Ind ...

  8. @Html.Raw() 与Newtonsoft.Json.JsonConvert.SerializeObject()

    一.后台 ViewBag.TypeList = typeList; 二.前台C# @{     var typeListFirst = ViewBag.TypeList;} 三.前台js中 var t ...

  9. [android] ndk环境的搭建

    C语言的编辑加运行,分两步 编译阶段 连接阶段 java语言的步骤是 转成.class文件  java的虚拟机运行 C语言在windows上==> .o中间文件 ==>.exe可执行文件 ...

  10. Ubuntu安装完成后设置root密码

    安装完ubuntu后没有默认的root密码,如果要设置root密码需要进行如下步骤: 1 sudo passwd 2 连续输入两次新密码