满足速度需求
时至今日,即使是规模最小的网络业务新兴企业都开始将着眼点放在全球市场,但他们很快发现自己的服务器已经被无数请求所淹没。在性能表现方面,微软在这套最新SQL Server版本中提供了一些不错的特性以应对此类挑战。
我们先从SQl Server 2014中的Hekaton开始——我个人认为这可算是新版本当中的旗舰级特性。Hekaton是微软打造的优化内存表:我们要做的就是定义一套经过内存优化的表,Hekaton引擎会自行完成余下的工作。而且与其它内存内数据库解决方案不同,Hekaton允许我们向内存中添加单一表而非强制要求整套数据库。这显然更符合实际业务场景,毕竟我们通常只需要对少数表进行性能强化,而把整套数据库都添加到内存中却只为了强化其中几个表根本不符合资源的优化配置原则。
Hekaton之所以能够带来如此显著的性能提升效果,依靠的是对优化算法、乐观并发、消除物理锁定与闭锁以及内存内表存储等机制的结合。如果大家设定了只将面向优化内存表的存储规程,则可以将其转换成Hekaton规程以获得更理想的运行速度。转换过程会将其编译成原生C代码,从而实现执行效率提升。
这种转换对于对象类型有所限制,因此大家需要在全面采用这套解决方案之前先对代码进行检查与测试。举例来说,优化存储规程当中不能包含指针、子查询甚至是CTE(即公用表表达式)。这只是这份长长的不支持清单当中的一部分条目,剩下的部分请大家自己做好功课——包括数据库与表的各种要求。鉴于这还是一项全新功能,我相信这些限制将随时间的推移而逐渐解除。
强调了这么多关于速度的内容,它的执行速度到底有多快?其效果到底值不值得我们用代码转换来换取?我已经见识过一些令人印象深刻的演示,而且微软的站点实现了10倍到30倍的显著性能增强。具体提速效果取决于多方面因素,但根据我所看到的演示案例以及自己亲手进行的测试,微软方面公布的数据还是靠谱的。实际情况就是,如果大家需要打理高强度事务型OLTP环境并能够满足Hekaton的起效要求,那么各位肯定会它赞不绝口。
SQL Server 2012引入的列式存储索引给数据仓库的性能表现带来大幅提升。我个人曾经实际体验过,原本在传统索引中需要耗时数分钟的查询操作在列式存储索引中不到一秒即可完成。列式存储索引的弊端在于其无法进行更新。为了将数据载入到表中,大家必须首先清除这些索引,并在载入完成后另行创建。SQL Server 2014很好地解决了这个问题,如今列式存储索引已经支持更新功能了——干得好,微软。
我总是提醒自己团队中的数据库管理新手们用两种方式来解决性能瓶颈:要么降低工作负载强度,要么增加数据吞吐能力。这两种方法显然是从数据吞吐量角度入手,但下面的两项新功能则直接针对工作负载。
Resource Governor最终获得了对物理I/O的控制权。对于任何一套给定系统来说,磁盘都是最可能成为性能瓶颈的对象——这是由磁盘天然的机械部件属性所造成。通常来讲,磁盘传输能力之所以跟不上需求,是因为一些流氓查询占据了大量额外的I/O资源。事实上,我就经历过数据仓库的IOPS被查询拉升至数十亿乃至上百亿、最终陷入崩溃的情况。现在大家终于可以把查询的对象指定为资源池,同时限定每个分卷所要面对的I/O上限了。这意味着不会再出现错误查询占用全部磁盘资源的荒谬状况。降低磁盘系统上的I/O总量对于提升整体性能有着极大帮助。
专走捷径
下面这项功能被称为Delayed Durability,它实际并不会对数据库产生加速作用、但却能让终端用户从使用体验上感受到提速效果。让我们通过典型的事务型负载来进行说明。
我们假设终端用户现在需要更新一条记录。更新内容首先被写入到内存中的日志里,而这份日志随后被写入磁盘。在日志记录被写入到磁盘中后,应用程序会识别出事务处理已经完成,这样用户就能继续进行其它工作了。针对数据库的实际更新操作会在之后的时段内进行。现在有了Delayed Durability,应用程序将在日志被写入到磁盘之前就获得事务完成提醒。这意味着终端用户用不着等待日志向低速磁盘介质写入这一相对缓慢的处理过程,即可快速处理其它工作。我发现很多系统中的瓶颈都源自日志处理过程,而Delayed Durability能够很好地解决这个问题。
不过正如我之前所说,Delayed Durability本身并不能真正减少工作负载。过去需要完成的任务现在仍然需要被完成。这套数据库引擎只不过以更快的速度将控制权返还给客户端,这样终端用户就能在感受上获得更好的操作体验。这项功能同样可以进行配置——大家可以在数据库层、事务层甚至是原子块层(面向整个存储规程)对其加以控制。不过在使用这项功能之前,请大家务必小心谨慎。如果我们的系统在事务被写入磁盘之前发生故障,那么这部分信息将彻底丢失。这也就是Durability(耐用性)一词的含义:事务是可以恢复的。如果我们降低了耐用性操作的执行优先级以换取更理想的客户端响应时间,就必须作好部分数据可能丢失的准备。
最后,SQL Server 2014还带来了一系列安全强化机制。当然,我们现在已经拥有备份加密方案,不过其它新功能的出现直接宣判了第三方备份产品的死刑。这压死骆驼的最后一根稻草正是对象级恢复。此外新版本还提供多种新的服务器级权限——CONNECT ANY USER DATABASE与SELECT ALL USER SECURABLES——它们允许大家以前所未有的简便方式进行安全事务管理。具体来讲,我们现在可以将这些权限一次性指派给全部现有以及未来将要创建的数据库系统。大家不必再随着新数据库的不断加入而重复权限分配流程。
SQL Server 2014是个极为强大的版本,其中集合了大量出色的新功能以及对现有特性的强化方案。尽管我个人对于云功能不太感冒,但我仍然对微软在OLTP方面投入的改善努力给予好评,而且相信未来其效果还会进一步提升。Hekaton是这个版本中引入的全新机制,因此大家可以期待其中的部分限制会在未来的子版本中逐一解除。
说了这么多,我们仍然没有见识到SQL Server 2014中的全部新功能。哪些项目最值得关注?我个人建议大家了解缓冲池扩展、增量统计以及在线操作优先级锁定管理。这些新功能都会给我们的系统性能带来巨大影响。不过值得注意的是,集成服务、报告服务以及复制功能在新版本中没有得到任何强化;而且尽管T-SQL迎来了小幅改进,但数据库管理员或者开发者的实际工作方式并未发生任何变化。
总而言之,SQL Server 2014为我们提供了多种提升性能表现的途径,并允许大家利用Azure云实现备份与高可用性保障。目前面对此类难题的SQL Server用户们,请认真关注这款刚刚面世的新版本。