精华内容
下载资源
问答
  • 许多人在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机...下面我将从这三个方面分别进行总结:
  • 许多人在使用SQL时往往会陷入一误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现...

    分类: SQLServer 477人阅读 评论(0) 收藏 举报

    如何适当优化SQL

    许多人在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:

     

    为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。

     

    ---- 测试环境--

    ---- 主机:HP LH II

    ---- 主频:330MHZ

    ---- 内存:128兆

    ---- 操作系统:Operserver5.0.4

    ----数据库:Sybase11.0.3

     

    一、不合理的索引设计

    例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况:

    1.在date上建有一非个群集索引

     

    select count(*) from record where date >

    '19991201' and date < '19991214'and amount >

    2000 (25秒)

    select date,sum(amount) from record group by date

    (55秒)

    select count(*) from record where date >

    '19990901' and place in ('BJ','SH') (27秒)

     

    分析:

    date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。

     

    2.在date上的一个群集索引

     

    select count(*) from record where date >

    '19991201' and date < '19991214' and amount >

    2000 (14秒)

    select date,sum(amount) from record group by date

    (28秒)

    select count(*) from record where date >

    '19990901' and place in ('BJ','SH')(14秒)

     

    分析:

    在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

     

    3.在place,date,amount上的组合索引

     

    select count(*) from record where date >

    '19991201' and date < '19991214' and amount >

    2000 (26秒)

    select date,sum(amount) from record group by date

    (27秒)

    select count(*) from record where date >

    '19990901' and place in ('BJ, 'SH')(< 1秒)

     

    分析:

    这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。

     

    4.在date,place,amount上的组合索引

     

    select count(*) from record where date >

    '19991201' and date < '19991214' and amount >

    2000(< 1秒)

    select date,sum(amount) from record group by date

    (11秒)

    select count(*) from record where date >

    '19990901' and place in ('BJ','SH')(< 1秒)

     

    分析:

    这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。

     

    5.总结:

     

    缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

     

    ①.有大量重复值、且经常有范围查询

     

    (between, >,< ,>=,< =)和order by

    、group by发生的列,可考虑建立群集索引;

     

    ②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

     

    ③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

     

    二、不充份的连接条件:

    例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:

     

    select sum(a.amount) from account a,

    card b where a.card_no = b.card_no(20秒)

     

    将SQL改为:

    select sum(a.amount) from account a,

    card b where a.card_no = b.card_no and a.

    account_no=b.account_no(< 1秒)

     

     

    分析:

    在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:

     

    外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O

     

    在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:

     

    外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O

     

    可见,只有充份的连接条件,真正的最佳方案才会被执行。

     

    总结:

     

    1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。

     

    2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302)。

     

    三、不可优化的where子句

    1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

     

    select * from record where

    substring(card_no,1,4)='5378'(13秒)

    select * from record where

    amount/30< 1000(11秒)

    select * from record where

    convert(char(10),date,112)='19991201'(10秒)

     

    分析:

    where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

     

    select * from record where card_no like

    '5378%'(< 1秒)

    select * from record where amount

    < 1000*30(< 1秒)

    select * from record where date= '1999/12/01'

    (< 1秒)

     

    你会发现SQL明显快起来!

     

    2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:

     

    select count(*) from stuff where id_no in('0','1')

    (23秒)

     

    分析:

    where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。

     

    实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:

     

    select count(*) from stuff where id_no='0'

    select count(*) from stuff where id_no='1'

     

    得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒。或者,用更好的方法,写一个简单的存储过程:

    create proc count_stuff as

    declare @a int

    declare @b int

    declare @c int

    declare @d char(10)

    begin

    select @a=count(*) from stuff where id_no='0'

    select @b=count(*) from stuff where id_no='1'

    end

    select @c=@a+@b

    select @d=convert(char(10),@c)

    print @d

     

    直接算出结果,执行时间同上面一样快!

    总结:

     

    可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。

     

    1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

     

    2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

     

    3.要善于使用存储过程,它使SQL变得更加灵活和高效。

     

    从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计

    展开全文
  •  优化流量和改善页面不是网站分析师直接工作,但一优秀网站分析师得有能力为产品和运营部门提供分析和建议,并在公司中形成数据氛围,保证各个部门向着同一目标前进。毕竟,网站分析是一发现问题、分析...

    通过网站流量管理,了解产品运行的状况,能够很好的帮助产品和运营提供决策依据,调整运营策略,产品策略,促进产品更好的为用户服务。
     
      优化流量和改善页面不是网站分析师的直接工作,但一个优秀的网站分析师得有能力为产品和运营部门提供分析和建议,并在公司中形成数据氛围,保证各个部门向着同一个目标前进。毕竟,网站分析是一个发现问题、分析问题和解决问题的过程。
      而流量对一家互联网公司的重要性不言而喻,所以我们做流量分析、内容分析和转化分析等工作,因为我们关心流量的背后能为网站带来多少收入。
      那么,网站流量数据分析流程是怎样的?常用的网站分析工具有哪些?网站流量质量如何分析?本篇文章就围绕这几个问题进行详细解答。
      一、流量数据分析流程是怎样的?
      在进行流量数据分析前,我们得知道流量数据如何获取?常见的网站流量有哪些类型?如何区分真假流量?
      1.1流量数据的获取
      流量数据获取主要分3类:网站日志文件、打点、JS页面标记。它们的区别如下:
     
      现在大多数公司都是用JS页面标记来获取数据。JS页面标记是指在页面端嵌入JS标记代码,JS代码会将一些需要统计的信息以URL参数的形式附带在请求地址的后面。而JS页面标记输出的是执行过JS代码的日志请求记录。
      日志输出的IP地址、访问时间戳、访问地址路径、访问来源、User Agent用于我们准确分析流量。
      1.2流量数据的分类
      知道流量数据如何获取后,那么常见的流量类型有哪些呢?通常,我们将网站的流量分为三大类,分别是直接流量、推介流量和搜索引擎流量,如图:
     
      搜索流量:是指访问者通过点击搜索结果访问网站产生的流量;
      推介流量:是指访问者通过点击其他网站的链接访问网站产生的流量;
      直接流量:是指访问者直接输入域名访问网站产生的流量;
      1.3直接流量的分类及分析
      假如发生referer信息的丢失,推介流量便会被系统算做直接流量;当访问者首先通过搜索引擎或标记链接访问网站后,再次直接访问时,这部分也会被记录为之前的访问来源,算做直接流量。由于直接流量的复杂性,我们在分析前得弄清直接流量的分类组成和对应的分析法。
      1.3.1直接流量的分类
      直接流量通常包含以下三大类的流量,如图:
     
      浏览器地址栏:访问者在浏览器地址栏中直接输入网址产生的流量;
      浏览器收藏夹:访问者点击书签中收藏的网站URL产生的流量;
      丢失来源信息:各种没有或丢失来源信息的流量,包括 Flash 广告、工具、弹窗广告等;
      1.3.2直接流量的分析方法
      由于浏览器地址栏、浏览器收藏夹、丢失来源信息这三个产生流量的原因和特点不同,分析方法也不同。下面针对这三类直接流量来分别探索其不同分析方法。
      1、浏览器地址栏—流量分析法
      针对浏览器地址栏产生的流量,一般从Landing Page、页面访问路径进行分析。
      1)Landing Page:由于大部分是网站的首页,如果Landing Page不是网站首页的那部分流量,大部分都不是浏览器地址栏产生的流量。
      2)页面访问路径:当发现网站的直接流量变高,或者质量变差等异常现象,一般以网站首页为起点,通过路径分析发现问题。
      2、浏览器收藏夹—流量分析法
      网站中的任何一个页面都可能被访问者收藏,并再次访问。分析方法如下:
      对收藏行为和来自浏览器收藏夹的流量进行标记,然后在报告中过滤出这部分的流量;
      进行新老访客分析。一般使用收藏夹访问网站的用户大都属于回访用户,如果大部分新增流量都是新访用户时,这部分流量一般有问题。
      3、丢失来源信息—流量分析法
      丢失来源信息的分析方法一般有3类:
      URL增加标记;
      站内搜索关键词分析(先将直接流量分类,然后关注直接流量使用站内搜索的情况,以及关键词的变化);
      使用跳出率指标来分析,因为纯正的直接流量是网站忠诚度最高的那类访客。
      1.4如何区分真假流量
      知道流量数据的分析流程及方法后,那么对于现在常见的虚假网站流量该如何区分呢?怎么辨别虚假流量去保证广告效果呢?虚假流量通常是通过程序或者人为产生的。
      1.4.1真假流量的特征
      1)虚假流量的特征:
      目的性:虚假流量的产生一定和某个目的有关;
      规律性:特定的目的会使虚假流量一定带有规律性。
      2)真实流量的特征:
      自然性:真实流量在各个维度的表现都是自然的;
      多样性:网民的喜好不同,行为也一定是多样的。
      1.4.2如何区分真假流量
      知道真实和虚假流量的特征后,那么如何辨别呢?通常,辨别虚假流量是通过判断流量产生的时间/地理位置/网络属性/跳出率,访客进入页面的路径/点击分布图/重合度/忠诚度去分析的。
      1)流量产生的时间
      真实的流量一般分布在全天的各个时间段,即使有访问高峰,在流量曲线图中一般也为平滑曲线。而虚假流量却是人为控制的,在曲线图中的表现是流量暴增。
      2)流量的地理来源
      通常访客是来自各个不同的地理位置,而虚假流量很难使用多个IP来产生流量,所以如果流量集中来自一个地区就比较可疑了。
      3、流量的网络属性
      真实流量下,访客网络的接入方式应该是千差万别的,而虚假流量的接入一般比较单一。所以,如果访客接入方式只提供1-2种服务提供商的名称就比较可疑了。
      4)流量的跳出率
      真实流量下,访客可能在任何时间跳出,如果跳出率比较集中在某一个时间段,则要重点分析那个时间段的流量地理来源以及流量的网络属性了。
      5)进入入径&点击分布图
      通常,由于广告活动会有一个登录页面,所以流量入口只有一个。真实访客进来后会点击不同的链接,可能在任何一个页面离开,而虚假流量的访问路径与离开页面一般都相同。
      6)访客忠诚度分析
      通常来说,一定数量的访客访问网站后是会对网站进行回访的,即使数量很少。所以,真实流量会有访客再次回访的行为产生,而虚假流量一般是不会有回访的,对于那些没有回访的流量一般是异常的。
      7)访客重合度分析
      对于不同的流量渠道,可以使用访客重合度分析法判断是否为虚假流量。一般,当某个渠道在短时间内有较高访客重合度时候,就需要进一步检查流量的质量了。
      二、常用的网站流量分析工具有哪些?
      目前,市面上常用的运营数据分析工具有友盟、talking data 、百度统计、谐云等,下面主要说下这几个主流工具的使用特点,它们的对比如下:
     
      三、如何进行网站流量的质量分析?
      知道了哪部分才是网站的真实流量,那么对于这部分真实流量的质量该如何评估呢? 我们去评估网站流量的质量是因为只有保证有质量的流量,才能为企业带来价值。
      网站的质量分析一般是按照质和量两个维度来衡量的,如下图所示:
     
      量:X轴,指网站获得的访问量;
      质:Y轴,指可以促进网站目标的事件次数,例如商品浏览、注册、购买等行为。
      将流量按照它们在这两个维度上的表现展示在坐标轴上,不同的流量就会有不同的位置相对应,如果把流量的成本用圆圈的大小表示,则可把流量表示在四个象限的位置描述成四种不同的流量:
      第一象限的流量:质高量高。这是网站的核心流量,对于这部分流量保持即可。建议降低获取流量的成本;
      第二象限的流量:质高量低。这部分流量是网站的忠诚用户,它们有很高的质,但数量较少。建议提高这部分流量的数量;
      第三象限的流量:量还可以但质较低,并且获取流量的成本也比较高;
      第四象限的流量:量高质低。这部分流量要提高质。建议使用细分的方法。
      总结:这样整个网站流量数据分析的流程就很清晰了,先分清流量数据的种类,再按照需求去获取流量数据,再去分析这些流量数据的真假以及质量好坏。有了这些后再去甄别该选用什么样的数据分析工具,根据他们的优劣以及自身的需要去选择,从而保证网站流量的质量为企业带来价值。

    转载于:https://www.cnblogs.com/wellmoon/p/6738903.html

    展开全文
  • 一般地,我们认为,机器学习领域最基本的三个方向就是“监督学习”“无监督学习”和“强化学习”,而深度学习、半监督学习、元学习都是由它们在某些方面迭代衍生出来的优化后的模型。 经过前两篇的笔记,我们已经对...

    http://www.woshipm.com/ai/2529645.html

    本文笔者将与大家讲述:强化学习的基本原理、两个基本类型,以及基于这两个类型下的相关算法。

    一般地,我们认为,机器学习领域最基本的三个方向就是“监督学习”“无监督学习”和“强化学习”,而深度学习、半监督学习、元学习都是由它们在某些方面迭代衍生出来的优化后的模型。

    经过前两篇的笔记,我们已经对监督学习和无监督学习有了一个基本的了解,这次我们就来了解一下:神秘而强大的强化学习(Reinforcement Learning)是什么?

    与一些新兴的算法流派相比,强化学习算是有着悠久的历史,早在几十年前就有相关的算法诞生。

    我们都知道了,监督学习基于给定的数据和相应的标注,能够完成一系列的分类、回归问题;无监督学习基于无标注的数据,能够以比较低的人力成本解决聚类问题。而强化学习,则主要解决决策问题(Decision-Making),尤其是对于连续决策问题很是拿手。

    这次来说说强化学习(上)

    这个图简单地展示了强化学习的基本模型,里面的五个单词也就是强化学习的几个基本元素,他们分别是:

    1. 学习主体(Agent)——强化学习体系中的“学习者”。
    2. 环境(Environment)——主体的行为在环境中产生、环境对主体产生影响。
    3. 状态(State)——环境反馈给主体的状态的集合。
    4. 奖赏(Reward)——环境对主体行为的反馈的集合。
    5. 行为(Action)——主体在环境中的行动的集合。

    怎么去理解这几个词呢,又到了举栗子时间。

    这次来说说强化学习(上)

    在上图的情境里,小陈就是我们的学习主体,他的“行为”是一个集合,这个集合里有两个元素“运动”和“偷懒”,运动将获得表扬,偷懒将遭受批评。

    小本是小陈行为的监督者和见证人,在这个情境里小陈的“状态”由小本说了算,所以小本即是“环境”。

    小本对小陈的“奖赏”也是一个集合,集合中也是两个元素“表扬”和“批评”,而这两个元素对应着小本对小陈的评价——“状态”,胖了就批评,瘦了就表扬。

    那小陈如何对小本的评价做出反应呢?

    在文章的开头我们就提到了,强化学习主要解决决策问题,这里的决策比较简单,只有“运动”和“偷懒”,而小本对小陈的奖赏则决定了小陈会做出什么决策。

    在一个强化学习的系统里,一般会根据最终目的来制定奖赏的机制,比如:在上面的系统里,我们希望最终的结果是小陈能够减肥,那么我们就会给小本的“奖赏”赋值,表扬是+1,批评是-1,而系统的整体目标则是获得更高的分数。这样一来,小陈就会在每一次的奖赏中明白,“运动”是更好的选择,也就慢慢地减下了肥~

    在上面的栗子里,我们了解了强化学习的基本原理,接下来我们一起简单地了解一下它的两个基本类型和基于这两个类型下的相关算法:

    1. 基于模型的强化学习(Model-based RL)
    2. 无模型的强化学习(Model-free RL)

    “Model-based 尝试model这个环境,最终基于这个环境选择最优的策略。 Model-free 则一直在每一步中去尝试学习最优的策略,在多次迭代后就得到了整个环境最优的策略(e.g:Q-learning)。”

    这段话引用自quora的一个回答,可能看起来还是不太容易理解,那么又到了栗子时间。

    现在小曹要学习打乒乓球,他花了大量时间观看乒乓球教学视频,通过看书研究了乒乓球拍的各种不同的握持发力方式,在网上学习了各种类型的发球方式,还了解了空气动力学、人体解刨学等知识,力求将每一个球打得完。然后终于有一天小曹叫上朋友走到了乒乓球桌前,发现自己一个球也接不到。

    这种学习方式就是Model-based,核心是:通过学习先验知识对现有的环境有了一个大概的了解,能够对未来的状态和回报做出预测

    但显然,小曹学习乒乓球这个过程,更好的方法是直接拿其球拍进行实践,也就是通过Model-free的方式来学习乒乓球。

    那什么时候该使用model-based呢?

    现在小曹终于通过model-free的方式学会了乒乓球,他发现这个方法真好,所以小曹在去打球的路上决定使用model-free的方法来找到去乒乓球室的路。

    半天过去了,小曹在某不知名小巷里认识到了model-free不是万能的,于是他掏出了手机打开了高达导航,找到了他现在的位置和乒乓球室所在的位置,并规划好了路线,model-based最终帮助小曹找到了正确的路线。

    在z我们讲到了Model-free和Model-based,这其实只是强化学习方法中针对学习主题理不理解环境所做的一种分类。而实际上强化学习的应用环境更加复杂,这一种分类方法可能不足以帮助我们对所有的情况进行判断,我们还需要更加深入地了解强化学习的更多分类和算法以及相关栗子。

    按照不同的判断标准,强化学习的方法可以按如下几种方式来分类:

    1. Model-free & Model-based:基于模型和 不基于模型
    2. Policy-based & Value-based:基于策略(概率) 和 基于价值
    3. Monte-carlo update & Temporal-Difference update:回合更新和 单步更新
    4. On-Policy & off-Policy:在线学习和 离线学习

    第一个在上面已经说过了,我们就从第二个,Policy-based & Value-based开始。

    好了,又到了栗子时间。

    这次来说说强化学习(中)

    我们把上次小陈跑步的系统里的一部分拿出来,上图就是说小陈正在使用Policy-based的方式选择策略,看起来很好理解,也就是根据做出某项行为的概率来选择下一步行为

    那么,按照一样的逻辑,基于价值也就很好理解啦:

    这次来说说强化学习(中)

    这就是一个最简单的value-based的决策模型,小陈会毫不犹豫地根据每项行为的价值来决定选择怎么做,不带一点主观色彩~

    除了判断方式以外,两种方法的区别,以及相应的优劣势是什么呢?

    就让我们用它们所对应的两种标志性的算法:大名鼎鼎的Q-learningPolicy Gradients

    来做讲解吧~

    先从有名的Q-learning说起:它是value-based模型下的一个经典算法,上面已经有提到,value-based的核心思想是根绝每项行为的价值来选择下一步行为,那么Q-learning也是如此,让我们再次祭出小陈作栗子。

    这次来说说强化学习(中)

    可以看到,小陈在这个图里有两个选择,跑步或是偷懒。我们和小陈在之前的栗子中都已经知道了,小陈如果选择偷懒,就会受到来自小本的批评,反之,则受到表扬。

    在Q-learning的模型中,这个情境变成了“连续的”。小陈选择一个行为之后将获得一个行为对应的状态,然后在新的状态下继续做选择。

    这次来说说强化学习(中)

    这次来说说强化学习(中)

    如图所示,在S1时,小陈通过之前积累的经验知道了跑步将会获得小本的表扬,偷懒则会受到批评,所以小陈选择了跑步(a1),小陈的状态也就从S1变化为了S2。

    那么每一步的行为具体是怎么选取呢?小陈是如何判断每一个选择的价值的呢?

    这里就需要引入Q-table,也可以叫做Q表,Q-table的内容实际上就是每一个状态和选择对应的值,也就是在每一个状态下对不同行为的反馈期望

    这次来说说强化学习(中)

    小陈通过Q-table就可以知道:在S2的时候,选择a1,也就是跑步,将获得更大的收益,这是不需要通过实际行动就可以得知的。

    是不是觉得这个表述很熟悉?

    没错,Q-learning除了是value-based的代表性算法以外,它也同样属于model-based下的一种算法,小陈通过先验知识得知了他该如何做出选择,这是model-free做不到的。

    总结一下,Q-learning的步骤如下:

    这次来说说强化学习(中)

    我们已经了解了前面四个步骤,但我们还不知道最后一步,Q表中的值是如何更新的,现在让我们看看Q-learning 的核心方程(这是一个贝尔曼方程,也叫动态规划方程)。

    这次来说说强化学习(中)

    Q(s,a)代表的是算法对某一个状态的行为的估计值,比如Q(S1,a1)就是1。

    后面括号里的东西代表我们估计出来的值与实际值之间的误差,R(s,a)指的是某个状态下做出某个行为得到的奖励(注意这个奖励是实际执行后从环境得到的一个反馈,而Q(s,a)只是通过想象得到的一个值,一个是实际值,一个是想象值),γ是一个衰减系数,γmaxQ’(s’,a’)就是未来某个状态行为奖励的衰减值

    括号外的α指的是学习率,也就是这次的误差有多少要被学习,它是一个小于1的数。

    其实Q-learning本质就是一种动作值函数的算法,输入“状态”和“行为”,得到一个“奖励”,也就是一个具体的值。agent根据最大的值对应的行为做出选择,而选择得到的结果又会反向传递,对Q-table的值进行更新。

    希望大家看到这里还没有进入懵逼状态,因为我们接下来就要了解Policy Gradients是怎么一回事了。不过别担心,理解了Q-learning再来看Policy Gradients就很简单啦!

    在上面的学习中,我们知道了value-based方法是计算不同动作的值来判断更好的选择,那么现在让我们来看看如果情境变成了这样:

    这次来说说强化学习(中)

    小陈在操场跑步,并且小陈可以选择360°任意一个方向作为前进的方向。

    这次来说说强化学习(中)

    操场上可能捡到钱(矩形),也可能踩到狗屎(三角形),小陈该如何针对这个情况制订合适的行动方案呢?

    相较于value-based中的栗子,小陈的选择从有限的(跑步和偷懒),变成了无限的(任意一个方向)。在这个时候,value-based就变得无力了,Q-learning可以通过动作值函数计算出某个状态下某个动作的期望值,但它无法在无穷多个选择中求解

    而policy-based方法也就在这种情况下应运而生啦!

    Policy-based不同于value-based先得出值再选择动作,它根据对状态的观测直接给出一个具体的策略。

    与value-based的相比,policy-based主要有三个优点:

    1. 更容易收敛
    2. 可以在高维&连续的动作空间工作
    3. 可以学习出带有随机性的策略

    Policy Gradients(策略梯度算法)是Policy-based中的一类经典算法,其核心思想也包含在了它的名字中——基于策略来做梯度下降。

    什么叫梯度下降(Gradient descent)呢?

    这次来说说强化学习(中)

    这是一个简单的一元二次方程y=x²+1,途中的两个梯度方向实际上就是在这两个点时y=x²+1的导数方向。而梯度下降法是一个求解最小值的方法,比如在上图中,梯度方向一个向左上,一个向右上。我们可以确定这两个点中间一定有更小的值,而不断地对这个区间内的函数求导,最终就可以将我们的结果收敛到最小值。

    那么,Policy Gradients是如何做梯度下降的呢?

    这次来说说强化学习(中)

    再看回这张图,假设小陈在一开始通过观测得出的概率进行了这样的行动,得到了钱,我们就给他一个相应的奖励。而策略梯度算法的核心,就是将根据这个奖励/惩罚进行一个反向传递,让这个方向(得到奖励的策略)在下一次被选中的概率提升。反之,则让这个方向在下一次被选中的概率降低。

    Policy Gradients的思想就是这样,很简单吧!

    这次来说说强化学习(中)

    公式的推导和参数的更新如果感兴趣的话可以在下面的参考资料中自行学习,这里再赘述可能反而会影响大家对它的理解,这一期的强化学习就到这里啦。下一次让我们了解一下集成了两种方法的Actor-critic算法和一些其他没有提到的分类方式~

    参考资料

    介绍&几个非常值得一看的视频(油管视频)

    从概念到应用,全面了解强化学习

    【整理】强化学习与MDP

    什么是 Policy Gradients

    什么是Q-learning

    通过 Q-learning 深入理解强化学习

    比较好懂的Policy Gradient介绍

    浅谈Policy Gradient

     

    展开全文
  • 以及设施损毁情景下额外增加的救援变更时间反映鲁棒性, 用三个目标函数组成的三元组刻画选址决策的目标向量, 理想点是一个三元向量, 每一个分量值表示只以这个分量目标函数求解得到的最优值, 提出了基于理想点的...
  • 索引对性能的优化

    2011-04-05 09:45:00
    人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法...下面我将从这三个方面分别进行总结: 为了更直观地说明问题,所有实例中SQL运行时间均经过测试,不超过1秒均表示为

          人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:

      为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(< 1秒)。

      测试环境--

      主机:HP LH II

      主频:330MHZ

      内存:128兆

      操作系统:Operserver5.0.4

      数据库:Sybase11.0.3

      一、不合理的索引设计

      例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况:

      1.在date上建有一非个群集索引

    select count(*) from record where date >
    '19991201' and date < '19991214'and amount >
    2000 (25秒)
    select date,sum(amount) from record group by date
    (55秒)
    select count(*) from record where date >
    '19990901' and place in ('BJ','SH') (27秒)

      分析:

      date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。

      2.在date上的一个群集索引

    select count(*) from record where date >
    '19991201' and date < '19991214' and amount >
    2000 (14秒)
    select date,sum(amount) from record group by date
    (28秒)
    select count(*) from record where date >
    '19990901' and place in ('BJ','SH')(14秒)

      分析:

      在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

      3.在place,date,amount上的组合索引

    select count(*) from record where date >
    '19991201' and date < '19991214' and amount >
    2000 (26秒)
    select date,sum(amount) from record group by date
    (27秒)
    select count(*) from record where date >
    '19990901' and place in ('BJ', 'SH')(< 1秒)

      分析:

      这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。

      4.在date,place,amount上的组合索引

    select count(*) from record where date >
    '19991201' and date < '19991214' and amount >
    2000(< 1秒)
    select date,sum(amount) from record group by date
    (11秒)
    select count(*) from record where date >
    '19990901' and place in ('BJ','SH')(< 1秒)

      分析:

      这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。

      5.总结:

      缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

      ①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;

      ②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

      ③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

    二、不充份的连接条件:

      例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:

    select sum(a.amount) from account a,
    card b where a.card_no = b.card_no(20秒)

      将SQL改为:

    select sum(a.amount) from account a,
    card b where a.card_no = b.card_no and a.
    account_no=b.account_no(< 1秒)

      分析:

      在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O

          在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:

      外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O

      可见,只有充份的连接条件,真正的最佳方案才会被执行。

      总结:

      1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。

      2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302)。

    三、不可优化的where子句

      1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

    select * from record where
    substring(card_no,1,4)='5378'(13秒)
    select * from record where
    amount/30< 1000(11秒)
    select * from record where
    convert(char(10),date,112)='19991201'(10秒)

      分析:

      where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

    select * from record where card_no like
    '5378%'(< 1秒)
    select * from record where amount
    < 1000*30(< 1秒)
    select * from record where date= '1999/12/01'
    (< 1秒)

      你会发现SQL明显快起来!

      2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:

    select count(*) from stuff where id_no in('0','1')
    (23秒)

      分析:

      where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。

      实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:

    select count(*) from stuff where id_no='0'
    select count(*) from stuff where id_no='1'

      得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒。或者,用更好的方法,写一个简单的存储过程:

    create proc count_stuff as
    declare @a int
    declare @b int
    declare @c int
    declare @d char(10)
    begin
    select @a=count(*) from stuff where id_no='0'
    select @b=count(*) from stuff where id_no='1'
    end
    select @c=@a+@b
    select @d=convert(char(10),@c)
    print @d

      直接算出结果,执行时间同上面一样快!

    总结:

      可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。

      1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

      2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

      3.要善于使用存储过程,它使SQL变得更加灵活和高效。

      从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。

      1.合理使用索引

      索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

      ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

      ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

      ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

      ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

      ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

      2.避免或简化排序

      应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

      ●索引中不包括一个或几个待排序的列;

      ●group by或order by子句中列的次序与索引的次序不一样;

      ●排序的列来自不同的表。

      为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

      3.消除对大型表行数据的顺序存取

      在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

      还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

    SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

      虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

    SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 
    UNION 
    SELECT * FROM orders WHERE order_num=1008 

      这样就能利用索引路径处理查询。

      4.避免相关子查询

      一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

      5.避免困难的正规表达式

      MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

      即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

      另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

      6.使用临时表加速查询

      把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    AND cust.postcode>“98000” 
    ORDER BY cust.name

      如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    ORDER BY cust.name 
    INTO TEMP cust_with_balance 

      然后以下面的方式在临时表中查询:

    SELECT * FROM cust_with_balance 
    WHERE postcode>“98000”

      临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

      注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

      7.用排序来取代非顺序存取

      非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

      有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

    总结:

      可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。

      1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

      2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

      3.要善于使用存储过程,它使SQL变得更加灵活和高效。

      从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。

      1.合理使用索引

      索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

      ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

      ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

      ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

      ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

      ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

      2.避免或简化排序

      应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

      ●索引中不包括一个或几个待排序的列;

      ●group by或order by子句中列的次序与索引的次序不一样;

      ●排序的列来自不同的表。

      为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

      3.消除对大型表行数据的顺序存取

      在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

      还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

    SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

      虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

    SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 
    UNION 
    SELECT * FROM orders WHERE order_num=1008 

      这样就能利用索引路径处理查询。

      4.避免相关子查询

      一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

      5.避免困难的正规表达式

      MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

      即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

      另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

      6.使用临时表加速查询

      把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    AND cust.postcode>“98000” 
    ORDER BY cust.name

      如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

    SELECT cust.name,rcvbles.balance,……other columns 
    FROM cust,rcvbles 
    WHERE cust.customer_id = rcvlbes.customer_id 
    AND rcvblls.balance>0 
    ORDER BY cust.name 
    INTO TEMP cust_with_balance 

      然后以下面的方式在临时表中查询:

    SELECT * FROM cust_with_balance 
    WHERE postcode>“98000”

      临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

      注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

      7.用排序来取代非顺序存取

      非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

      有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

    展开全文
  • 具体来看,有三个表现:第一,难以吸引到有见识、有实操经验、有事业共识高手来加盟。第二, 家族成员与外部经理人配合不顺畅。第三,人员流失率较高,人才队伍没有沉淀。 股权结构不合理负面影响基本覆盖了...
  • 有效优化SQL

    2005-11-30 17:23:00
    人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或决策...下面我将从这三个方面
  • SQL优化

    2018-02-25 13:52:01
    人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或...下面我将从这三个方面分...
  • 简单有效优化SQL

    2008-05-20 23:42:00
    人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或决策...下面我将从这三个方面
  • 此外,传统遗传算法(GA)从三个方面进行了改进:通过提高种群多样性避免了局部最优陷阱; 通过引入自适应交叉算子和遗传算子,加快了迭代速度。 在不牺牲计算速度前提下,通过添加多元竞争算法来保证收敛质量...
  • 围棋自从被创造出来,已经有数千年历史了,在19路围棋中,即棋盘是由19*19纵横交叉点组成,每交叉点都有黑白空种不同状态,则博弈树复杂度在10300次方左右,其天文数字远远超过了宇宙中原子个数。...
  • 交互、功能优化以及服务模式三个方面出发,在人机交互方面提出①建议车联网产品装备 10 英寸以上中控屏,提升产品综合竞争力;②AR-HUD/仪表/中控以及全液晶仪表将逐渐成为提升车联网产品竞争力重要设计;③车...
  • 人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或...下面我将从这三个方面分...
  • 算法通过搜索获得整个Pareto最优解集,能够同时对三个目标函数进行优化,为决策者提供不同调度条件下最佳调度方案,具有实际工程指导意义。该研究成果发表在《中国激光》2013年第12期上(doi:10.3788/CJL201340...
  • 为了解决隐患管理系统适应企业对安全管理需求不断增加问题....研究结果:有效地减少了企业违行为数量,同时也为企业的决策管理提供了依据,实现了人和物两个方面对隐患管理,对企业安全管理具有十分重要现实意义.
  • 在配置训练、验证和测试数据集过程中做出正确决策会更高效创建神经网络 在机器学习中,经常将样本分为训练集、验证集和测试集部分。对于早期机器学习数据而言,经常使用 70%/30% 来划分验证集和测试集...
  • 人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或...下面我将从这三个方面分...
  • 下面将从这三个方面分别进行总结: 为了更直观地说明问题,所有实例中SQL运行时间均经过测试,不超过1秒均表示为(< 1秒)。—- 测试环境: 主机:HP LH II—- 主频:330MHZ—- 内存:128兆—-
  • 人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或...下面我将从这三个方面
  • SQL优化总结

    2007-11-29 00:11:00
    人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或决策...下面将从这三个方面...
  • 股权优化的目标是分别并逐步地解决上述四问题,核心目标是逐步实现股权集中,即股权向决定和影响企业发展主要力量——直接带领企业前进、关注企业长久发展核心中高层人员集中,也可以称之为管理层收购。...
  • 机器学习决策树算法解决图像识别

    千次阅读 2016-12-19 18:02:35
    随着科技发展,信息量日益膨胀,对此我们引入了一名词——大数据,在大数据领域中我们面临大问题,数据抓取,数据管理和处理数据。他是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力...
  • 宏昌决策管理系统

    2006-06-16 15:12:52
    方面提供快速便捷的通道用于昌宏化工到集团总部的管理信息流,一方面提供INTERNET范围内的灵活方便的可访问性,从而确保集团总部能够快速准确的把握昌宏化工的经营运作状况,为决策的有效性和及时性提供坚实的基础...
  • 人们在使用SQL时往往会陷入一个误区,即太关注于所得结果是否正确,而忽略了不同实现方法之间可能存在性能差异,这种性能差异在大型或是复杂数据库环境中(如联机事务处理OLTP或...下面我将从这三个方面分...
  • 数据中台()企业数据中台建设评估与选择 一、企业数据应用成熟度评估(成熟度也高,数据支撑业务能力越强) 统计分析 决策支持 数据驱动 运营优化 二、建设数据中台目标 企业战略目标...
  • 本章主要从当今营销领域五大分析应用领域:数据Data、探索数据Data Explorer、预测模型Predictive Model、优化Optimization和决策Decision这五个方面来进行学习。 几个案例 Some cases 我们先通过三个例子来了解...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

优化决策的三个方面