记一次 Oracle 下的 SQL 优化过程

1. 介绍

事情是这样的,UAT 环境的测试小伙伴向我扔来一个小 bug,说是一个放大镜的查询很慢,转几分钟才出数据,我立马上开发环境试了一下,很快啊我说?,放大镜的数据立马就出来了,然后我登录 UAT 环境一看,诶是有些慢? ,于是开始了我的排查之旅...

2. 过程

首先我立马拿到了执行的 SQL 在开发环境的数据库执行了下,很快,都在 1s 左右,感觉没啥问题啊,然后我就在页面上点点点,发现好像上面有一个相关联的下拉框,如果选中的有数据,再点击这个放大镜就会慢一点,然后我登录 UAT 环境一试,哦不是这个问题,于是只能开始排查 SQL 了。

百度了一圈 Oracle 性能调优,大多很空泛,没有一个通用的、具体的、可执行的步骤。但是找到了排查前必备的查看执行计划explain plan

以下是正儿八经的优化过程?:

2.1 查看该条 SQL 的执行计划

2.1.1 生成执行计划

在要排查的SQL前面加上explain plan for,例如以下的例子:

explain plan for
SELECT
    * 
FROM
    SOURCE_LISTEX_202101 
WHERE
    pass_id = '012101200123001025061320201201002852';

2.1.2 查看执行计划

推荐使用该 SQL 去查询执行计划? (为什么?因为简短好记?)

select * from table(dbms_xplan.display)

或者

SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

查出来的应该是这个样子:

Plan hash value: 1335523602

-----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                       | 44479 |    38M| 17411   (1)| 00:03:29 |
|   1 | TABLE ACCESS BY INDEX ROWID | SOURCE_LISTEX_202101  | 44479 |    38M| 17411   (1)| 00:03:29 |
|*  2 | INDEX RANGE SCAN            | LISTEX_202101_PASS_ID | 17792 |       |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("PASS_ID"='012101200123001025061320201201002852')

而且如果你的 SQL 长了之后会发现,Operation 列是会有缩进的,缩进代表层级关系,就很乱?,这里我推荐 Datagrip?的右键可视化Explain plan。
使用方法为:选中SQL,右键Explain Plan,就可以查看啦,大概长这个样子:


其中点击 Explain Plan (Raw),也是可以的,就是查看原生的执行计划样子,大概长这样:

2.1.3 分析执行计划

在 1.2 节可视化那个图中,我们主要看表格中的 Total Cost, 它代表着该条操作的总消耗,我们根据层级关系逐个排查,找到最为耗时的操作,排查发现此处两个Full Scan 全表扫描的性能消耗占据了全部总消耗的98% ((384+384)/779)?

之后根据执行计划的层级关系我们去 SQL 中找到这两个全表扫描对应的部分:
image

查一下 sett_ebankinstruct 这个表的数量 有近十万条,看了一下表的定义,一个索引都没加。。。

在此次 SQL 中,使用sett_ebankinstruct的字段只有 instructionidinstructtype

instructionid : 很有可能会作为关联条件去连接多个表,并且该字段不会频繁的update,故在该字段上加索引
如何加索引呢?

create index 索引名称
    on 表名 (字段);

在此处加索引的 SQL 为:

create index IDX_SETT_EBANKINSTRUCT_INSTRID
    on SETT_EBANKINSTRUCT (INSTRUCTIONID);

instructtype : 考虑到 instructtype 只是类型,并且使用的情况可能就是 = 或者in (具体的几个值),于是就不用加。

我们添加索引之后发现,第一个Full Scan 全表扫描已经消失?,因为在 sp.id = se.instructionid 进行表连接的时候走了索引,但是第二个Full Scan全表扫描仍然存在,说明此处并未走索引? :
image

原因是此处使用 not in ,括号里的instructionId并未走内部子查询的索引,那么怎么改成走索引呢?将其改写成 not exists 即可。
image

再次查看下执行计划,发现两个全表扫描都消失了,都变成了索引扫描(Index Scan)???:
image

对比优化前后Total Cost
优化前:779
优化后:62
优化提升:92%

3. 结论

如果排查确实是 SQL 问题,就直接看 执行计划 ,重点关注占用Total Cost的部分,然后查看对应的 SQL 。

  1. 如果是表频繁连接的字段,就要考虑加索引了。
  2. not innot exists,(业界流传 not existsnot in 快)
    其实非也,如果主查询和子查询表大小相当,那么用 inexists 差别不大。
    如果子查询表大,用 exists 快,如果子查询表小,用 in 快。
  3. Where :数据量多的情况下,排除越多记录的条件应该是先执行。
    Oracle 下能排除掉多的条件放后面,因为 Oraclewhere是从右往左执行的,格式化 SQL 后也就是从下往上执行,这样写那么会先排除大量的数据,因而加快后续操作的速度。
    MySQL 正好和 Oracle 相反,MySQL 下的 Where 是从左往右执行的,格式化 SQL 之后也就是从上往下执行,
    因而 MySQLWhere 的条件应该是排除多的条件放前面。
道生一,一生二,二生三,三生万物。
本文转载于网络 如有侵权请联系删除

相关文章

  • ping、arp、tracert三大命令详细用法,弄懂立马成大神

    正文ping、arp、tracert三大命令配合使用,可以查出或解决网络中的大部分基本故障问题。一、Ping命令的详细用法在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为:1、用来检测网络的连通情况和分析网络速度2、根据域名得到服务器IP3、根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。ping的主要用法:我们通常会用它来直接pingip地址,来测试网络的连通情况。类如这种,直接pingip地址或网关,ping通会显示出以上数据。我们来系统的看下ping的六种用法。 一、ping-t的用法不间断地Ping指定计算机,直到管理员中断。这就说明电脑连接路由器是通的,网络效果很好。下面按按住键盘的Ctrl+c终止它继续ping下去,就会停止了,会总结出运行的数据包有多少,通断的有多少了,可以反映出网络的情况。 二、ping-a的使用ping-a解析计算机名与NetBios名。就是可以通过ping它的ip地址,可以解析出主机名。三、ping-n的使用这个我们在昨天的20道题中就有一个考这个命令,在默认情况下,一般都只发送四个数据包,通过这个命令可

  • Redis系列(十二)scan Info Object等特殊命令集合

    前言在上一篇文章中,介绍了Redis的所有命令的基本含义及其用法。但是Redis的命令太多,导致上一篇文章只能简单的进行总结,而有一些命令是那么简单的话语总结不了的,因此在这里单独的进行讲解。当然,这种复杂的命令,不属于线上常用数据结构内部,而是一些监控和debug用到的。目录前言目录SCANscan原理联想其他scanINFOMONITOROBJECT参考文章联系我SCAN好吧,这个是线上用的。对Redis的很多操作都是已知key而去操作或者查找value,那么当我们不知道key或者仅仅知道一部分,想找到对应的key应该怎么办呢?keys命令提供了根据正则来匹配key的能力,但是一般线上的redis是禁用掉这个key的。原因如下:keys直接返回所有的key,万一数量太多,我们看不过来。他会遍历所有的key,如果reids实例中的key数量太大,这个遍历的O(n)过程可能会导致服务器卡顿,从而影响对线上的服务。2.8之后版本的redis为我们提供了另一个批量扫描的,可控的遍历方法。也就是SCAN命令。它通过批量遍历的方式,来避免卡顿服务器。SCANcursor[MATCHpatter

  • C# 基础知识系列- 17 实战篇 编写一个小工具(1)

    0.前言这是对C#基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用。如果有看过IO篇的小伙伴,应该有印象。当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了找某个文件的位置而烦恼。那么我们现在尝试写一个控制台程序来帮助我们找文件的具体位置。1.分析好,大家应该初步了解了需求内容。然后让我们来做一个简单的需求分析:简单分析一下需求包括哪些功能点规划各个功能点的实现方式嗯,理论上讲还有一大堆的步骤,但因为是个练手的小项目就不扯那么多没用的了。简单来讲就是,分两步:抓取系统可以访问的所有文件,并保存其全路径根据输入的参数查询文件的全路径需求分析完了,然后寻找可以实现的技术,我们现有的技术有IO、文件/路径操作、任务模式等技术,那么可以供我们选择的技术一目了然了:通过文件/目录/路径API访问所有的文件目录,使用字典保存,然后使用Linq查询文件所在目录。OK,需求分析完了,技术也确认了。那么我们现在开始吧,小伙伴们跟紧了哦,车速不快的。2.开始这里简单演示一下如何用Rider和VSCode、VisualStudio2019创建项目。2.1.创建一个名为Fi

  • 我说分布式事务之消息最终一致性事务(二):RocketMQ的实现

    来源:https://0x9.me/A76YN 号外:最近整理了一下以前编写的一系列SpringBoot内容,整了个《SpringBoot基础教程》的PDF,关注我,回复:001,快来领取吧~!更多内容持续整理中,帮助大家更好的学习Spring相关的系列内容!上一篇《我说分布式事务之消息最终一致性事务(一):原理及实现》中,我们讲解了可靠消息最终一致性的实现原理及如何基于一款开源的消息中间件,实现一个可靠消息服务的思路。本文,我们讲解如何利用开源消息中间件RocketMQ的特性–事务消息,实现基于消息一致性的最终一致的分布式事务。RocketMQ是阿里巴巴开源的一款高性能、高可靠的消息中间件,经历过双11等大流量高并发的大考,是国内开源界的翘楚,在业界有着广泛的应用。我假设你对RocketMQ有着一定的了解,就不对它的基础概念及使用做进一步的展开,如果需要,请参考官方文档做进一步的学习了解RocketMQ官网。按照我们的套路,先上图。原理简介RocketMQ提供了类似X/OpenXA的分布事务功能,通过MQ的事务消息能达到分布式事务的最终一致。发送方在业务执行开始会先向消息队列中投递“

  • 响铃:联想、腾讯巨头携手,“极速计划”建立SIoT又一个堡垒?

    文|曾响铃 来源|科技向令说(xiangling0815)巨头联合、资源互补已成为互联网科技领域下半程重要玩法,一些大佬已经开始行动。12月24日,联想与腾讯在北京联想总部召开主题为“极速计划”的战略合作签约仪式,双方将围绕内容、产品、渠道、用户权益等进行深度合作,本次合作项目主要针对联想最近升级智慧联想浏览器以及游戏内容。在这之前,联想与腾讯已有具体业务层面的合作,例如近期联想发布的手机Z5s就与腾讯游戏展开了合作,这次战略合作水到渠成。毫无疑问,联想与腾讯之间的合作将产生资源共振,对联想而言能拓展其电脑产品的用户群体和品牌优势,进而反哺SIoT平台,这对联想意图领跑SIoT2.0时代意义明显。牵手腾讯,是联想SIoT2.0走向深化的必然2017年,联想把其“三波战略”的第三波“新型智能设备”命名为“SIoT(智能物联)设备”,开始SIoT全面智能化转型。一年左右的运营,SIoT在消费级市场上取得了不错的成效,例如MirageAR智能头盔成为2017年同品类全球销量冠军,累计销量已近50万套,市场份额近80%;SmartDisplay带屏智能音响自2018年6月在北美上市累计销量已达

  • CentOS5/6 升级 Python2.4/2.6 到 2.7 版本教程

    当魏艾斯博客写教程的时候,有时候需要Python2.7版本来实现环境搭建,而很多网友还在使用默认的CentOS5/6版本,对应的是Python2.4/2.6版本的。为了让这部分网友能够顺利使用,所以就有了今天的CentOS5/6升级Python2.4/2.6到2.7版本流程。1、检查当前python版本。老魏给测试系统安装的是centos5.11版本,可以说是比较低的了。先来看看Python的版本是什么,输入命令:python-V复制可以看到目前是python2.43版本,无法达到部分程序的使用要求,需要进行升级操作。OK,followme。2、安装GCC编译器yum-yinstallgcc复制3、下载/解压Python-2.7安装包一般来说安装python2.7版本就足够大部分程序使用了。另外python官网在国外了,国内VPS下载速度真心不快,如果你VPS放在国外了那速度肯定是飞快的。或者你可以通过网页下载,然后再用ftp上传到root目录中去。wgethttps://www.python.org/ftp/python/2.7/Python-2.7.tar.bz2复制4、解压缩并进

  • 读书笔记|大数据时代

    本篇来源于《大数据时代》中的第二部分商业变革,是《大数据时代》的连载篇,全篇分为数据化、价值、角色定位三个部分。1数据化—量化一切首先我们需要明确两个概念就是数字化和数据化数据化、是指一种把现象转变为可制表分析的量化形式的过程。数字化、是指把模拟数据转换成0和1表示的二进制码。计算机的出现带来了数字测量和存储设备,数字化带来了数据化,但是数字化无法取代数据化。数据化的核心是量化一切,常见的被量化的有文字、方位和沟通。当文字变成图书,拿电子书为例,未数据化的电子书只能够被展示出来,读者并不能通过搜索关键词被查找到,也不能被分析。当方位变成数据,就是将地理信息进行,比如百度地图、各种网站的获取位置都是将方位变成数据。当沟通变成数据,一些社交平台通过添加各种心情表情,来收集我们的心情状态,还有人们的喜好,年龄什么的都可以变成数据。2价值—数据创新不同于物质性的东西,数据的价值不会随着它的使用而减少。数据就像一个神奇的砖石矿,当他的首要价值被发掘后仍能不断给予。它的真实价值就像漂浮在海洋中的冰山,第一眼只能看到冰山的一角,而绝大部分隐藏在表面之下。他可以为了同一目标被多次使用,也用于其他目的。

  • 【深度】亚马逊Alexa称霸CES,语音计算平台仍面临这5大技术挑战

    【新智元导读】亚马逊的Alexa在CES上的大获成功让关于智能语音的话题再次被业界广泛谈起。低调的亚马逊似乎已经在这一潜力巨大的市场上完成了布局。大家的共识是,智能语音助理将成为下一代计算平台,在国外,目前这一市场竞争已经呈白热化,虽然亚马逊独占鳌头,但谷歌、微软和苹果也不是没有机会。可以看到,虽然市场争夺战异常激烈,但是语音要成为智能时代全新的操作系统,在语音识别、自然语言理解、用户界面设计乃至安全隐私方面都还存在急需解决的难题。本文带来智能语音市场、技术两方面的深入解析。2017年的CES上,亚马逊Alexa大放异彩,成为“最大赢家”。亚马逊以Alexa和Echo为代表的智能语音系统,已经悄悄地占据了这一各大互联网公司必争之地的“下一代计算平台”之争的有利位置。语音市场的巨大潜力在于对话。对话经济(ConversationalEconomy)通常被定义为主要用对话计算界面(conversationalcomputinginterface)构建的公司和产品的集合。它包括:1)即时通讯软件,2)语音控制计算,3)聊天机器人及服务(内置于即时通讯软件或语音控制硬件中)。这个下一代的软件的

  • [Atcoder][CF]简单题选做练习笔记 2

    前言接着上篇继续刷。文章太长了被迫拆分。AT5759ThREE构造题,我最讨厌的题型之一。p_i\timesp_j\equiv0\pmod3或者:p_i+p_j\equiv0\pmod3第一个式子,要求p_i\equiv0\pmod3,第二个式子要求p_i\equiv1\pmod3且p_j\equiv2\pmod3或者反过来。一个简单的思路就是按i\bmod3进行分类,然后考虑怎么做。然后发现这个东西特别难做,因为距离为3还会出现跨过祖先的点对。但是有一点是确定的,即距离为3的点对深度奇偶性一定不同。虽然奇偶性不同的点不一定距离为3,但如果保证奇偶性不同的点都能满足,那么距离为3当然也满足。于是可以按深度分类,分为X与Y,即深度为奇与偶的集合。需要按数量进行讨论。|X|,|Y|>\lfloor\dfrac{n}{3}\rfloor两个都比较大的时候,将p_i\equiv1\pmod3与p_i\equiv2\pmod3分别放入,再把p_i\equiv0\pmod3的塞入剩下的位置。这样对于所有的奇偶性不同的点对,都有p_i\equiv0\pmod3或者p_i\equiv1\pmod

  • 【每日要闻】元宇宙一天只有38个活跃用户;金立手机公司未履行金额超13亿,被列入经营异常

    1、美国电动皮卡制造商Rivian因故障问题召回几乎所有车辆  2、VR/AR头显拥有量将激增,报告称专用元宇宙设备市场存量2024年将达1亿  3、Canalys:预计中东智能手机市场2023年出货量近4600万台,平均售价达325美元  4、金立手机公司未履行金额超13亿,被列入经营异常 5、SNEResearch:宁德时代引领全球,中国电动汽车电池制造商8月装机量均大增 6、AppleWatchSeries7被曝过热后爆炸  7、价值13亿的元宇宙,一天只有38个活跃用户 8、PICO4便携包存在隐患并宣布召回,将在10月21日前更新升级 9、传特斯拉新一代自动驾驶芯片将转投台积电5nm平台  10、韩系动力电池厂商今年前8个月全球市占率25%1、美国电动皮卡制造商Rivian因故障问题召回几乎所有车辆当地时间10月8日消息,美国电动汽车制造商Rivian7日表示,正在召回其生产的几乎所有车辆,原因是车辆前悬架上的紧固件松动。根据该公司向美国国家公路交通安全管理局提交的文件,此次召回共涉及12212辆车。Rivian在一项声明中称,已经收到了7起可能与上述问题有关的报告,目前还没

  • 腾讯云媒体智能标签描述自定义人物详细信息api接口

    1.接口描述接口请求域名:ivld.tencentcloudapi.com。 描述自定义人物详细信息,包括人物信息与人物信息 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeCustomPersonDetail。 Version 是 String 公共参数,本接口取值:2021-09-03。 Region 是 String 公共参数,详见产品支持的地域列表。 PersonId 是 String 自定义人物Id 3.输出参数 参数名称 类型 描述 PersonInfo CustomPersonInfo 自定义人物信息 TaskIdSet ArrayofString 出现该自定义人物的所有分析人物Id

  • nginx 客户端返回499的错误码

    我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录 网络架构和背景 我们服务架构和错误码是上面这样的,上游服务日志没有记录,无法确定kong到上游服务的连接和请求细节。 kong上的日志 rsp_cost:0.041 rsp_length:0 rsp_status:499 ups_rsp_cost:- ups_rsp_length:0 ups_rsp_status:- 复制 waf上的日志 rsp_cost:1.045 rsp_length:0 rsp_status:499 ups_rsp_cost:- ups_rsp_length:0 ups_rsp_status:- 复制 看日志,两个负载均衡的现象一毛一样,kongupstream到web服务上,不太确定是upstream链接的问题或者是读写数据的问题,或者是kong自己的问题,根本就没有反向代理到上游服务 上游服务抓包 打算在上游服务上抓一下包,看看请求是在kong上出问题了,根本没

  • JS之获取属性总结

        嗨,我是沐晴,今天来说说JS中关于获取属性的一些方法和区别。闲话不说,来正题。    首先什么是属性呢,比如input标签,标签中的valueidtypestyle等,这些就是属性。我们JS获取属性一般有三种方法:   1 通过点的方式   2通过括号的形式   3通过DOM的方式 通过栗子说明: <inputtype="text"value="hello"id="text"/>varoText=document.getElementById("text")复制 1 通过点的方式  oText.value   需要注意的是: 1 点要查找的是JS中本来就存在的属性名,不能找到变量或者函数的参数。比如下面 增加代码: varname="value" oText.name //这种方式访问就会出错,因为点的方式访问,它会去input的标签里面直接到有没有name的属性

  • 【dva】如何监听异步请求是否完成(页面loading)

    方案1.你可以在model里面操作 在model里面的state里面声明一个变量state,默认是false,effect函数执行开始就将其改为true,然后等call()然后结束后又将其改为false. state{ isloading:false, isEnd:false//你也可以加一个变量去区分其状态 } yieldput({ type:'save', payload:{ isloading:true, isEnd:false, }, }); constres=yieldcall(query,payload); yieldput({ type:'save', payload:{ isloading:false, isEnd:true, }, }); 复制  这种方案的好处是我自己写的逻辑,我自己随时可以调节加条件等.缺点也很明显,需要额外加很多逻辑.   方案2.dva自带的loadingEffect constloadingEffect=useSelector((state)=>state.loading); 复制 我们先看看lo

  • PHP开发API接口签名及验证

    <?php //设置一个密钥(secret),只有发送方,和接收方知道 /*----发送方和接收方-start----*/ $secret="28c8edde3d61a0411511d3b1866f0636"; /*----发送方和接收方-end----*/ /*----发送方待发送数据-start----*/ //待发送的数据包 $data=array(   'username'=>'123@qq.com',   'sex'=>'1',   'age'=>'16',   'addr'=>'zhongguo',   'timestamp'=>time(), ); //获取sign functiongetSign($secret,$data){   //对数组的值按key排序   ksort($data);   //生成url的形式   $params=http_build_query($data);   //生成sign   $sign=md5($params.$secret);   return$sign; } //发送的数据加上sign

  • 批处理集锦——(5)使用dir查找文件

      eg  dir/a-d/s/b*.bat复制 -d表示不显示.bat结尾的文件夹 比你优秀的人不可怕,可怕的是比你优秀的人比你更努力

  • ToolBar、ActionBar与Menu的纠葛(以及navigationIcon、setHomeButtonEnabled、setDisplayHomeAsUpEnabled)

      因为贴图的繁琐。。。所以下面是无图版。。。完整的在这里: 探究一下toobar和actionbar在使用menu时的吊诡情况   一、背景介绍 toolbar最近比较火,而且是出出来代替actionbar的,但是目前还没有完全代替 但其实actionbar也是在Android3.0(API11)中才加入到SDK中的,也并不古老 更早的还有tittlebar(不带menu),ActionBar取代了传统的tittlebar和menu,在程序运行中一直置于顶部 ActionBar和TitleBar是同一个位置的 都是在状态栏下 ActionBar是3.3版本后推出的,上面可以放入按钮,或下拉式的按钮.可以有文字,logo等信息.还可以设置返回按钮等信息 TitleBar只有APP图标和文字.不支持点击事件   二、actionbar与menu 1.titlebar不再介绍了很简单,下面稍微介绍一下actionbar ActionBar的图标,可显示软件图标,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通

  • 用Akka构建一个简易的分布式文件系统

    本来初期打算用Hadoop2,可是后来有限的服务器部署了SolrCloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光。想来想去,由于目前架构基于Scala的,所以还是用ScalaAkka实现了一个简单版本的分布式文件系统。 Scala版本是2.10.3:http://www.scala-lang.org,Akka版本是2.2.3:http://akka.io。 所有文件随机放在不同的服务器上,在数据库中记录了文件存放的服务器IP地址、文件路径。在服务端部署基于Akka的简单文件服务,接收文件路径,读取并返回文件内容。调用者根据文件地址,去数据库中查找文件的服务IP地址和文件路径,根据得到的服务器IP地址,传入文件路径,调用该服务器的文件服务。 以下是部分实现代码。 1.文件服务参数 1caseclassPatentFulltextArgs( 2valurl:String, 3valstart:Int, 4valsize:Int){ 5 6}复制 2.文件服务Trait(有点像WCF中的服务契约) 1traitPatentFulltextServic

  • 【java基础知识】并发

    要执行的任务runnable、驱动任务执行的线程thread。thread自身不执行任何操作,只是驱动赋予它的任务。 newThread(newTask()).start()   Executor执行器管理线程,允许管理异步任务的执行,无须显式管理线程的生命周期,其有多种类型。 Executors.newCachedThreadPool();为每个任务创建一个线程,每个任务分配一次线程开销 Executors.newFixedThreadPool(num);预先一次性进行线程分配,一次线程分配开销 Executors.newSinleThreadExecutor();序列化提交的任务,线程数为1   publicclassLiftoffimplementsRunnable{  @Override publicvoidrun(){  for(inti=0;i<3;i++){      System.out.println("hello"+i);    Thread.yi

  • CSS实现移动端横向滑动

    html: <divclass="chosen-container"> <divclass="chosen-swiper"> <ahref="ticketDetail.html"> <pclass="name">壳牌加油</p> <pclass="money">20<span>元</span></p> <pclass="explain">20元无门槛优惠券</p> </a> <ahref="ticketDetail.html"> <pclass="name">壳牌加油</p> <pclass="money">20<span>元</span></p> <pclass="explain">20元无门槛优惠券</p> </a> <ahref="ticketDetail.html"> <pclass="name"&

  • Luogu P2292 [HNOI2004]L语言

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个字典D是若干个单词的集合。我们称一段文章T在某个字典D下是可以被理解的,是指如果文章T可以被分成若干部分,且每一个部分都是字典D中的单词。 例如字典D中包括单词{‘is’,‘name’,‘what’,‘your’},则文章‘whatisyourname’是在字典D下可以被理解的,因为它可以分成4个单词:‘what’,‘is’,‘your’,‘name’,且每个单词都属于字典D,而文章‘whatisyouname’在字典D下不能被理解,但可以在字典D’=D+{‘you’}下被理解。这段文章的一个前缀‘whatis’,也可以在字典D下被理解,而且是在字典D下能够被理解的最长的前缀。 给定一个字典D,你的程序需要判断若干段文章在字典D下是否能够被理解。并给出其在字典D下能够被理解的最长前缀的位置。 输入输出格式 输入格式: 输入文件第一行是两个正整数n和m,表示字典D中有n个单词,且有m段文章需要被处理。之后的n行

相关推荐

推荐阅读