在Visual Studio 2010中有一个内置的选项允许开发者通过一个快速的右击操作生成
单元测试。但是Visual Studio 2012和Visual Studio 2013预览版都移除了这个功能,幸运的是现在它又回来了。Visual Studio ALM Rangers创建了一个新的扩展,该扩展恢复了Unit Test Generator 1.0版本中的大量功能。
团队很快就注意到这并不是复活,而是由之前的工具所激发的替代品。该项目的目标是:
支持.NET MS-Test、NUnit和XUnit测试框架以及VB/C#测试代码的生成
为某个特定的测试框架提供一个“参考实现”,告诉用户该如何去做
关注项目和引用管理而不是代码生成
通过对三种不同的测试框架(MS-Test、NUnit和XUnit)的支持,开发者能够使用最适合于他们项目的框架。开发者还能够通过这个工具定制要生成的项目,包括命名空间的名字、类、方法和方法体的文本。
如果使用默认设置那么会生成一个默认的类,该类中的测试方法通过Assert.Fail()设置为失败,以便开发者能够发现它们并使用有效的测试代码替代默认生成的内容。
注意,按照设计生成器仅会为公共类中的公共方法生成方法存根。它并不会为私有类生成任何内容,也不会生成私有方法。借助于该工具对Visual Studio 2012/2013的支持以及项目周围的便捷方法,团队现在合并该工具并做好升级准备应该没有任何困难。
Channel 9已经提供了一个简要的说明,与此同时ALM Rangers之前也基于发布的候选版发布了一篇博客
文章作为教程。
说明:SCN(System Change Number 简称 SCN)是当
Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字,可以理解成ORACLE数据库的时间戳,从ORACLE 10G开始,提供了函数可以实现SCN和时间进行相互转换;
用途:在进行数据库的还原和利用数据库的闪回功能时,进行SCN和时间的转换就变的非常必要了;
操作方法:
1、通过dbms_flashback.get_system_change_number获得系统当前的SCN值:
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-----------------
122037263
2、通过scn_to_timestamp函数可以将SCN转换为时间戳:SQL> select scn_to_timestamp(122037263) scn from dual;
SCN
---------------------------------------------------------------------------
14-7月 -14 04.45.36.000000000 下午
3、还可以通过timestamp_to_scn可以将时间戳转换为SCN:
SQL> select timestamp_to_scn(to_date('2014-07-13,13:25:59','yyyy-mm-dd,hh24:mi:ss')) scn from dual;
SCN
---------------------
121936647
对于一个刚开始
学习数据库优化的新手DBA来说,当用户反馈系统比较慢时,他会非常紧张,面对数据库,他无从下手,不知道从哪里开始着手来优化数据库,查找系统
存在的问题。
今天我们通过
操作系统命令TOP,来优化数据,我们如何把操作系统与数据库关联起来哪,我们主要是通过操作系统TOP命令找到最消耗资源OS PID进程。
通过OS PID与V$PROCESS动态性能试图进行管理。我们知道V$PROCESS是被认为从操作系统到数据库的入口,而进入数据库内部,进程需要创建回话(SESSION)执行数据库操作的
SQL语句,一般情况下,一个进程只会创建一个回话,但是在特殊的情况下,一个进程也可以创建多个数据库回话。回话的信息是通过动态性能试图V$SESSION来进行管理和体现的。
那么我们通过一个实验来看一下,如何完成从操作系统命令到数据库内部的操作,我们模拟一个出现故障的场景,我们通过操作系统命令TOP,进行观察,找到操作系统进程占CPU资源比较高的进程。
1.首先我们建立一个测试表t1,向表中插入一些数据。 SQL>create table t1 as select * from emp;
SQL>insert into t1 as select * from t1;
SQL>/
SQL>/
SQL>/
SQL>/
使表T1大约有几万条记录。
2.开3,4个会话,其中表t1有几万行的数据,同时运行,立刻查询上面的语句
declare v1 emp.sal%type; begin for n in 1..100 loop for k in 1..100 loop select count(*) into v1 from t1; end loop; dbms_lock.sleep(1); end loop; end; / |
3.通过操作系统命令TOP找到消耗CPU资源的进程
top - 12:57:42 up 19 min, 2 users, load average: 1.18, 0.35, 0.23 Tasks: 132 total, 2 running, 130 sleeping, 0 stopped, 0 zombie Cpu(s): 20.5%us, 5.9%sy, 0.0%ni, 73.1%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1034664k total, 883716k used, 150948k free, 125584k buffers Swap: 4120664k total, 0k used, 4120664k free, 609440k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5182 oracle 19 0 368m 50m 48m S 37.9 5.0 0:03.57 oracle 1 root 15 0 2160 652 564 S 0.0 0.1 0:02.30 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.05 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.04 migration/1 5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 6 root 10 -5 0 0 0 S 0.0 0.0 0:00.04 events/0 7 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/1 8 root 11 -5 0 0 0 S 0.0 0.0 0:00.01 khelper 9 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread 13 root 10 -5 0 0 0 S 0.0 0.0 0:00.10 kblockd/0 14 root 10 -5 0 0 0 S 0.0 0.0 0:00.02 kblockd/1 15 root 16 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid 179 root 12 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue/0 180 root 12 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue/1 183 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 khubd 185 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod 252 root 18 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 253 root 17 0 0 0 0 S 0.0 0.0 0:00.00 pdflush 254 root 15 0 0 0 0 S 0.0 0.0 0:00.03 pdflush |
4.我们看到进程PID等于5182,我们下面的一个脚本,关联V$PROCESS试图和V$SESSION试图、V$SQLTEST试图,可以找出这个进程正在执行的SQL语句,这里只需要一个“发动”条件,就是进程(PID):
SQL>SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value), DECODE(sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC; / |
提示输入变量值。
Enter value for pid: 5182 old 9: (SELECT addr FROM v$process c WHERE c.spid = '&pid')) new 9: (SELECT addr FROM v$process c WHERE c.spid = '5182')) SQL_TEXT ---------------------------------------------------------------- declare v1 number; begin for n in 1..100 loop for k in 1..100 l oop select count(*) into v1 from t1; end loop; dbms_lock.sleep(1 ); end loop; end; |
注:这里我们使用了3个动态性能试图,获取到了执行的SQL语句。我们的逻辑是:
1)首先输入一个PID,这个PID即是process id,也就是在TOP命令中看到的PID.
2)通过PID和v$process.spid相关,我们可以获得process的详细信息。
3)通过v$process.addr和v$session.paddr相关联,可以获取session的相关详细信息。
4)再结合v$sqltest,即可获得当前session正在执行的SQL语句。
总结:
1.首先我们通过操作系统命令TOP找到了PID.
2.我们结合3个试图,就找打了当前正在疯狂消耗CPU的罪魁祸首,那么下面的工作就是如何优化这个SQL,我们可以进一步通过
dbms_system包跟踪改进程,或者通过AWR获取该SQL的执行计划。来改变SQL的执行计划,达到优化的目的。
一般初学JavaScript的时候最头痛的就是浏览器兼容问题。在Firefox下面好好的代码放到IE就不能显示了,又或者是在IE能正常显示的代码在firefox又报错了。
如果你正初学JavaScript并有着一样的处境的话建议你:初学JavaScript的时候无视DOM和BOM的兼容性,将更多的时间花在 了解语言本身(ECMAScript)。只在特定浏览器编写代码(Chrome/Firefox/Safari),实际
工作中使用成熟的 JavaScript框架(jQuery等)。放心,很少有公司会让JS新手用原生JS做前端开发。
学习JS初期无视兼容问题有什么好处
2、减少挫败感
3、花更多的时间学习ECMAScript
什么时候学习JS跨浏览器开发知识?而浏览器兼容问题留到什么时候解决呢?
当你能熟练使用JavaScript框架编写可复用的代码时(jQuery插件或前端控件),或当你准备自己开发一个JavaScript框架时。
其他一些JavaScript初学者建议
千万不要拿JavaScript权威指南当入门书籍
应该用JavaScript高级程序设计(第三版)作为入门书籍
传值和传值、作用域知识必须理解
调试工具必须懂并多用,学会自己捕捉错误。(chrome developer tool/Firebug)
耐心再耐心,对每一个知识点深挖能学的更轻松。
以上就是一些分享希望若能帮助到初学JavaScript的你,如果觉得有误导的地方敬请立即指出。
管理 VLAN 简介:
S2100系列以太网交换机任何时刻只能有一个VLAN对应的VLAN接口可以配置IP地址,
该 VLAN 即为管理 VLAN。
如果要对以太网交换机进行远程管理,必须配置交换机管理 VLAN接口的 IP地址。
当然,管理vlan可以是任何一个vlan。
如以下:创建管理 VLAN 20接口。
<H3C>system-view
Enter system view
, return to user view with Ctrl+Z.
[H3C]vlan 20
[H3C-Vlan20]quit
[H3C]management-vlan 20
[H3C]interface vlan-interface 20
管理 VLAN 20指定静态 IP地址和掩码。
#创建 VLAN 20,并将其指定为管理 VLAN,创建管理 VLAN 20的接口。
<H3C>system-view
Enter system view, return to user view with Ctrl+Z.
[H3C]vlan 20
[H3C-Vlan20]quit
[H3C]management-vlan 20
[H3C]interface vlan-interface 20
#为管理 VLAN 20接口指定 IP地址和掩码。
[H3C-Vlan-interface20]ip address 192.168.0.55 255.255.255.0
最后需要配置默认网关,不然远程无法访问交换机。
进入系统视图
system-view
进入管理VLAN接口视图
interface vlan-interface 20
配置管理VLAN接口网关
ip gateway 192.168.0.1
既然是征伐,一味蛮干,只懂得身先士卒,是不够的。
谋定而后动,还是有一定道理的。今日姑且小议一句话。“兵者诡道也”。
情景一:
为了项目进度,需要晚上加班测试。
如果你是个leader此时极有可能听到team中各种声音。
“怎么会加班呢?啥时候能回家啊?”
“今天能搞定嘛?不会通宵吧”
“这要搞到啥时候?我还有事呢”
……
分析:
诚然这些声音多少包含消极的因素,然却无可厚非。
正如我一贯主张,劳逸结合是最好的,但特殊情况是无可避免的。
现象:
我看到过一些领导,批评下属“你们的梦想呢……”
也看到一些主管空喊口号“加油啊”
自然也看到过一些leader,身先士卒,但是只顾埋头苦干。
点评:
第一种,大言不惭。
有什么理由批评人,本来就是加班的事情。
人都会疲惫都需要休息。
批评只会让结果恶化。最多是口服心不服。
第二种,华而不实。
空喊口号久了,只能被冠上无能的称号。
也会让人鄙视leader,喊口号谁不会呢?
第三种,匹夫之勇。
一味埋头苦干,人们碍于面子或许会跟着做。
然而消极情绪不能消除。
事倍功半。何况这又何尝不是一种精神上的压迫呢?
对策:
一言以蔽之“远而示之近”和望梅止渴的典故有异曲同工之妙。
人因未知而恐惧,因恐而迷茫。此时重点是要激发斗志。
“明确告诉大家,我们九点就能下班,就能搞定。
希望就在眼前,马上大家就能回家各种happy”
与此同时,和组内的同学一起做一点。
哪怕只是一点,也胜过自己埋半天。
即便你最后搞到了九点半,那多出来的半小时也是斗志昂扬的。
更何况积极状态下2小时,能完成消极状态下3小时的
工作。
注意:此方法,不可在短期内连续多次使用。最好还是规律作息。
注意:前提是自己对实际的任务量有较为清晰的把控。
情景二:
在绩效考核,或职业等级评估晋升前期(一个月左右)
一些同学觉得自己已经完成绩效计划中的任务,所以工作懈怠。
一些同学觉得技术已经达到考核标准,不再虚心积累。 分析:
惧满盈,则思江海下百川。
可是很多工作时间不太长的同学还没有完全领悟这个道理。
绩效的目标只是定在完成,考核的目标只是定在通过。
其实这需要leader引导的,也是人才培养的一部分。
现象:
见过一些leader也随着大家一起松懈。
见过一些领导在那空放厥词,大讲是非论。
点评:
第一种,我只想建议一句话:先天下之忧而忧,后天下之乐而乐。
第二种,从来只是内因其变化
不能激发主观能动性,只能徒增逆反心理。
对策:
一言以蔽之:“近而示之远”
不用解释要有啥更高的追求。
只找他一起回顾下半年前的绩效目标,
绩效这东西就像海绵挤挤总会有空隙。
只需要让他知其实还没有达到目标(尽管他已经无限接近)
做一次模拟等级评定。
他一来会感激你的关怀,二来你借此问一些偏冷门的问题。
总有不会的,目的就是让他知道,他和自己心中的目标还有距离。
人之所以自满是因为觉得自己距离目标已经无限接近。
我们与其费力改变目标,不如制造距离感。
一、软件问题的定义与分类
1. 软件问题的分类
软件错误(software error)
软件缺陷(software defect)
软件故障(software faut)
软件失效(software faiure)
定义:
(1)软件错误:指在软件生存周期内的不希望或不可接受的人为错误,其结果将导致软件缺陷的产生。
关注点:属于人为错误
(2)软件缺陷:存在于软件(程序、数据、文档)之中的那些不希望或不可接受的偏差。
关注点:欠缺或不完备的地方
一般情况下,满足以下五种情况中的一种,即可存在软件缺陷。
① 软件未达到产品说明书中标明的功能。
② 软件出现了产品说明书中指明的不会出现的错误。
③ 软件功能超出了产品说明书指明的范围。
④ 软件未达到产品说明书虽未指出但应达到的目标。
⑤
软件测试人员认为软件难以理解、不易使用、运行速度慢,和最终用户认为不好使用。
(3)软件故障:指在软件运行过程中出现的不希望或不可接受的内部状态,若此时无适当的措施(容错或异常处理机制)加以及时处理,便产生软件失效。
关注点:内部状态
(4)软件失效:指在软件运行时产生的一种不希望或不可接受的外部行为结果。
关注点:外部行为结果
2. 软件失效机理
软件错误——>软件缺陷——>软件故障——>软件失效
软件错误是一种人为的错误,一个软件错误必定产生一个或多个软件缺陷
当一个软件缺陷被激活时,便产生一个软件故障。
同一个软件缺陷在不同的条件下被激活,可能产生不同的软件故障。
软件故障若没被及时的使用容错加以处理,便不可避免的导致软件失效。
同一个软件故障在不同条件下可能产生不同的软件失效。
3. 产生软件错误、缺陷的原因
主要原因是开发的软件与需求说明书、软件设计说明书的不一致,以及在软件的实现中,未能达到用户潜在用户需求的目标。
二、软件错误的跟踪与管理
1.缺陷与错误严重与优先级
(1) 严重级别
严重:系统崩溃、数据丢失、数据破坏。
较严重:操作性错误、错误结果、遗漏功能。
一般:小问题、错别字。
建议:不影响使用的瑕疵或更好的实现。
(2) 优先级
最高优先级:立即修复,停止进一步测试。
次高优先级:在产品发布之前必须修复。
中等优先级:在产品发布之前应该修复。
最低等优先级:可能会修复,但是也能发布。
2.软件错误的跟踪管理
(1)错误(bug)信息的描述
①Bug记录信息
测试软件名称
测试版本号
测试人名称
测试事件
测试软件和硬件配置环境
发现软件错误的类型
错误的严重等级
详细步骤
必要的附图
测试注释
②Bug的处理信息
处理者姓名
处理时间
处理步骤
错误记录的当前状态
3.软件错误状态的描述
① 新信息(New):测试中新报告的软件错误(Bug)。
② 打开(Open):错误已经被确认并已经分配给相关开发人员处理。
③ 修正(Fixed):错误已经由开发人员修正完成,等待测试人员验证。
④ 拒绝(Decined):高级测试人员或开发人员认为不是错误,拒绝修改Bug。
⑤ 延期(Deferred):此错误不在当前版本中修复,而要到下一版本中修复。
⑥ 关闭(Cosed):错误已经修复,并已经过验证。
4.错误管理流程
步骤:
第一步:测试人员提交新的错误信息,并输入到错误跟踪管理系统错误信息数据库中(如TD),错误状态置为初始状态“New”。
第二步:高级测试人员验证错误并做相应处理。
① 如果确认是错误,分配给相应的开发人员,把错误状态置为“Open”。
② 如果高级测试人员认为这个“New”状态的“错误”不是错误,则拒绝修改,把错误状态设置为“Decined”。
第三步:开发人员查询状态为“Open”的所有错误,并对错误做如下处理:
① 如果开发人员认为这个“Open”状态的错误不是错误,则拒绝修改,把错误状态设置为“Decined”。
② 如果是错误,则修复并把错误状态设置为“Fixed”。
③ 如果是不能解决的错误,要留下文字说明并保持错误状态为“Open”。
④ 如果需要延期解决的错误,要留下文字说明,把错误状态设置为“Deferred”。
注意:对于不能解决的和延期解决的错误,不能由开发人员自己决定,一般需要某种会议(评审会)通过才能认可。
第四步:测试人员查询状态为“Fixed”的所有错误,验证这些错误是否已经解决,并做如下处理:
① 如问题解决了,把错误状态设置为“Cosed”。
② 如问题还没解决,重新把错误状态设置为“Open”。
5.错误流程管理原则
①为了保证错误处理的正确性,需要有测试经验丰富的测试人员验证发现的错误是否是真正的错误,书写的测试步骤是否准确,可以重复。
②每次对错误的处理都要保留处理信息,包括处理姓名、时间、处理方法、处理意见、Bug状态等。
③拒绝或延期处理错误不能由程序员单方面决定,应由项目经理、测试经理和设计经理共同决定。
④错误修复后必须由报告错误的测试人员验证,确认已经修复后,才能关闭错误。
⑤加强测试人员与程序员之间的交流,对于“Deferred”状态的错误,需要互相交流意见,避免真正的错误被遗漏。对于某些不能重复的错误,可以请测试人员补充详细的测试步骤和方法,以及必要的测试用例。
因为要在命令行下运行一些
android的工具,所以配置一些环境变量会比较方便:
遇到问题:
java -jar re-sign.jar 出现提示android路径没有配置好:
需要配置如下:
配置ANDROID_HOME为android sdk的安卓目录,例如:D:\android-sdk
在path下添加这两个:
%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;
重新开关一次命令窗口
因为
robotium要求被测应用和测试代码要有一致的key,所以我们需要把下载到的apk,通过re-sign.jar来产生debug key的apk,这个重新生成的apk就会跟测试项目签名一致了
re-sign.jar可以从这里下载到:
http://www.troido.de/re-sign.jar
下载完后,在命令行下 通过 java -jar re-sign.jar就会出现一个节目,然后将apk拖到这个节目,就会自动生成一个debug key的apk
产生新apk的过程中会弹出一个信息框,记得截下图,因为里面有两个信息我们等会的代码中需要用到
然后打开模拟器(模拟器器一定要打开才能安装成功),然后打开命令行
adb install mitalk_debug.apk(新生成apk的名称)
安装成功就可以再模拟器里看到该应用的图标了
注意:
一、删除之前 APK 文件的签名
1、解压apk 文件
2、删除解压出来文件夹中的 META-INF 目录:META-INF 存放签名后的CERT 和MANIFEST 文件,用于识别软件的
签名及版权。
3、删除文件夹后重新把解压出来的其它文件夹压缩为zip 文件,然后直接把文件后缀改为apk
二、为 APK 重新生成签名
1、将证书复制到与需要重新签名的apk 文件相同的目录下
2、jarsigner -keystore debug.keystore -storepass android -keypass android D:\Robotium\robotium\robotium\weixin_delet_rsa_sf.apk androiddebugkey
打开Eclipse,点击File->New一个Android
Test Project,然后点击下一步的时候选择This project(因为我们没有米聊应用的源码),然后选择要在哪个android版本上测试
在该项目下创建一个包,com.tencent.test,在该包下创建LoginTest类,如下
package com.mitalk.test; import android.app.Activity; import android.test.ActivityInstrumentationTestCase2; import com.jayway.android.robotium.solo.Solo; @SuppressWarnings("rawtypes") public class LoginTest extends ActivityInstrumentationTestCase2 { public Solo solo; public Activity activity; private static Class<?> launchActivityClass; // 对应re-sign.jar生成出来的信息框里的两个值 private static String mainActiviy = "com.tencent.mm.ui.LauncherUI"; private static String packageName = "com.tencent.mm"; static { try { launchActivityClass = Class.forName(mainActiviy); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @SuppressWarnings("unchecked") public LoginTest() { super(packageName, launchActivityClass); } @Override protected void setUp() throws Exception { super.setUp(); this.activity = this.getActivity(); // this.solo = new Solo(getInstrumentation(), getActivity()); } public void testLoginWithIncorrentUsernameAndPassword() throws Exception { wait(5000); //待完成 } @Override public void tearDown() throws Exception { try { this.solo.finishOpenedActivities(); } catch (Throwable e) { e.printStackTrace(); } this.activity.finish(); super.tearDown(); } } |
每个
学习软件开发的初级阶段都是从会写购物车开始的,同理购物车
测试用例的全局性和覆盖度也是检测每个测试工程师的标杆。
请根据如下功能图设计 1. 加入购物车 2. 查看购物车 的测试用例:
加入购物车
一.软件功能对比
二.成本考虑
三.满足业务场景
四.平衡各种资源
一.是否满足业务场景,各DB系统软件功能对比
1.功能对比
oracle功能是大而全并且非常完善,无论是锁定机制还是事物支持,无论是内置函数还是外部可扩展功能,无论OLTP和OLAP都能很好的支撑。
mysql作为开源数据的代表,得到了广泛的应用,关系型数据库的常用功能也全面覆盖到了,但mysql的缺失大表的hash join功能,这让他在OLAP发展受阻。
nosql主用用于K/V环境查询的场景,在事务以及Join方面都未支持,能支持多维度复杂过滤的产品比较少。
从功能角度比较 oracle > mysql > nosql
2.性能强弱
2.1 write性能
Oracle需要记录Redo Log且保证每次事务都fsync到物理磁盘以保证事务安全,属于连续写;数据的写入大多是在内存中完成,后台进程进行内存到磁盘的定期批量刷新,以随机写为主。MySQL InnoDB引擎与Oracle类似;MyISAM引擎无事务所以没有事务日志到磁盘的fsync问题,但由于其表锁的原因,并发较弱。从总体使用经验来看 和Oracle相差不大。
NoSQL在数据存储及日志记录方面的架构及实现优化,使之在写入性能方面较传统数据库有较大优势。
总的来说write性能 NoSQL > Oracle = Mysql
2.2 简单查询
Oracle在高并发场景下,由于其在事务控制实现方面的优势,以及多进程的机制,显示出了相对明显的优势。
MySQL在并发数不是太高的前提下,如16,32个并发场景下,相对于Oracle没有显示出弱势,甚至部分存储引擎下还有一些优势,但是随着并发数 的增加,就逐步体现出了与Oracle的差距,这与其基于线程的机制也有一定关系。
NoSQL大部分时候的简单查询性能都不如前二者
所以简单查询的性能 Oracle > Mysql > Nosql
2.3 复杂查询
Oracle统计信息涉及的方面非常多,优化器相对于MySQL来说也先进很多,再加上对Join方式的全面支持,无论是从功能还是性能角度来说,多表 Join都是Oracle的优势所在。
MySQL其查询优化器所能参考的统计信息相对较少,优化器深度也比Oracle少很多,所以在多表Join的时候出现执行计划异常并不少见。此外,不 支持 Hash Join 的天生缺陷也让其 Join 能力大打折扣。
NoSQL不支持Join,不具可比性,无疑是最弱的
索引复杂查询性能 Oracle > Mysql > Nosql
3.扩展能力
Oracle由于极高的一致性要求,采用share Everything架构,造成架构上不少限制,使其扩展陈本较高
Mysql的Replication特性对一致性要求较弱,使其架构很灵活,但slave的延迟是个大问题。
Nosql大都支持分布式部署,具有非常好的scale out能力
所以扩展能力 Nosql > Mysql > Oracle
4.商业支持
NoSQL产品目前有商业支持的很少,MySQL的本地化商业支持选择并不多,Oracle方面的商业支持无论是大型公司还是初创团队,选择性相对比较广泛
所以在商业支持方面:Oracle > Mysql > Nosql
5.软件可维护性
这一点一直是运维人最为关注的因素,毕竟任何一个软件系统都是需要后期维护的。
NoSQL 产品由于发展时间相对较短,对于可维护性角度的支持相对要少很多,虽然大多提供了一些相应的小工具,但总体来说都还是过于简单了些,所以这方面和相对成熟的MySQL以及Oracle相比较要弱。而Oracle为后期维护所做的
工作无疑是最为全面,无论是运行状态的跟踪,还是基础的备份恢复等,都很完善。
所以在可维护性角度方面:Oracle > Mysql > Nosql
三.业务场景分析
1.数据一致性要求
虽然无论你什么时候去问任何一个业务方,都会告诉你他系统的数据是不能有任何一条丢失的,任何时候都需要实时反馈变化。但实际上是当你换一个提问方式,告诉他们如果在极端情况下(比如断电)也要确保数据不会有任何丢失,会增加几十上百万的成本,那这个时候得到的回答可能就会完全不一样了。所以我们在了解业务方对数据一致性要求的需求时候,一定要明确厉害关系,分清数据级别,并且做到最大化的信息透明,才能挖出最清晰的需求。对于数据一致性的保护,Oracle 无疑是做的最可靠的一个。
2.并发规模
并发规模会考验我们的扩展能力,如果并发规模很大,那我们就需要很好的扩展能力以保证后续并发增长的需求。选用一个难以扩展的系统,会导致后续并发规模增长过程中无论是时间成本还是经济成本都很高
3.逻辑复杂度
如果业务逻辑过于复杂,至少NoSQL肯定不是合适的选择,至于MySQL还是Oracle,那就是考验二者功能及性能的时候了。
4.总容量规模
我们的系统数据容量规模自然也会影响到软件选型,规模非常大的,肯定要用分布式系统支持,至少也得分库分表吧,这时候的扩展能力就会充分显示出其优势。
四.平衡各种资源做出最后选择
通过软件功能和成本对比,以及“场景分析”,我们已经为系统选型积累到相对充分的信息了,那是不是就可以比较明确的选择出合适的系统了呢?
这时候我们可能会发现我们的数量规模很大,但是又希望能够维护方便容易控制。这时候我们就面临如下问题:数据量规模大选NoSQL更合适,便于维护又是Oracle的优势,怎么办? 又或者如果我们有这样一个场景:某交易系统,并发量很大,对于数据一致性要求很高,业务逻辑也并不简单,怎么办?Oracle可以为我们提供很好的数据保护,面对复杂逻辑的时候也能有最好的性能,但在扩展的时候会面临成本压力。MySQL可以提供较好的扩展方案,而且成本相对会较低,NoSQL无法解决复杂逻辑的业务场景。
类似问题可能会频繁出现在我们的架构师面前,需要大家根据各种利弊进行权衡,做好平衡决策,在尽可能满足业务需求的前提下,选择一个更合适的系统。有些时候可能也不得不作出牺牲极少数业务需求来换取系统更大的发展,而不要为了保全某些极端场景的需求而影响整个选型。
总结
数据存储软件的多样化趋势势不可当,不管是传统龙头的Oracle,还是开源典范的MySQL,以及NoSQL这一新秀,各有其特色,但同样也都有其短板。没有谁是万能的,同样也没有哪一种架构能应对所有问题。
作为一个架构师,我们的选型工作需要做到下面几点:
1. 在平时的工作中做好积累,以获得上面的“系统功能对比”和“成本对比”中的信息。
2. 在面对具体业务需求的时候,充分挖掘最真实的需求,并将各种利弊信息透明化
3. 在最终决策的时候做好平衡,从需求实现,成本控制以及维护管理多个角度权衡利弊
4. 对新技术学习的渴求不能影响选型结果,同样也不能对新技术的使用带有恐惧。
Oracle,MySQL 以及 NoSQL,都只是一个软件而已,实际使用效果更多的取决于使用者的能力。一个优秀的使用者能够充分利用其优势避开其软肋,最终获得最大化的价值。
二.成本考虑
1.软件成本
这个没有争议:Oracle > Mysql = Nosql
2.运维成本与团队管理水平
维护的服务器数量、耗电、自动化工具和人员配备数量
系统是否在团队的可控范围之内,出现性能、事故,团队要有能力解决
3.人才环境
Oracle发展几十年,具有充足的人才储备,活跃的社区环境。
MySQL开源数据库的王者,社区活跃,虽然人才总量常常供不应求,但总体还是处于良性状态。
NoSQL新技术,产品众多,社区活跃度远不如前面二者,处于人才极度匮乏状态