Hekaton是如何影响你数据库的目标恢复时间(RTO)的

这个周末我发现了SQL Server 2014里Hekaton的一个有趣副作用,很遗憾它会负面影响你数据库的目标恢复时间(Recovery Time Objective,RTO)。你已知道,对于每个本地编译表和存储过程,Hekaton都会创建一个DLL,这些都是以C语言代码实现的。这些DLL文件载入sqlservr.exe的执行空间。你可以用下列的查询通过DMV sys.dm_os_loaded_modules来查看当前载入的Hekaton表:

1 SELECT * FROM sys.dm_os_loaded_modules
2 WHERE description LIKE ‘XTP%‘

在CTP2里,我遇到的副作用是:当你删除对应表后存储过程时,载入的Hekaton的DLL文件并没有卸载掉。假设你创建了一个本地编译的存储过程,在一定时间后你想删除那个存储过程来重建,为了获得更好的本地编译执行计划(在Hekaton里的当前执行时间并不支持重编译)。在那个情况下,你的存储过程的老实现方式还在sqlservr.exe的执行空间里,在消耗额外的内存。当你删除表时也会同样发生,DLL本身还在内存里!

去除这些额外不需要的DLL文件的唯一方法是让你的整个数据库离线,再联机。然后当你查询DMV sys.dm_os_loaded_modules时,你会看到只有当前实现的本地编译表和存储过程被载入sqlservr.exe。当你没有特定的可用维护界面时,这是你Hekaton第一个遇到的糟糕问题。

但事情变得更加糟糕:当你重启SQL server,SQL Server会编译和链接每个原先已经生成的DLL。编译和链接每个Hekaton的DLL会占用一些CPU时间,在此期间你的数据库是处理恢复阶段,从用户角度来说,意味着你的数据库是不能访问的!即使当你尝试访问基于传统硬盘的表,在此期间,你会得到类似如下的错误信息:

Msg 922, Level 14, State 1, Line 1
Database ‘HashCollisions’ is being recovered. Waiting until recovery is finished.

你也可以在C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\xtp目录里看到原先老的.c,.obj和.dll还在,因为对于下次SQL Server的启动它们是需要。

假设你创建50个本地编译表和存储过程并立即删除。在那个情况下你在结束100个DLL文件,这些文件会在SQL Server启动期间编译和连接。我在虚拟机上测试SQL Server 2014的CTP2,我的数据库在69秒后才联机!

因此请留意这些副作用,因为它们会大幅度降低你的目标恢复时间(RTO)!设想下你在群集故障转移,在那个情况下,每个DLL必须在你另外的群集点编译和链接好,对于的终端用户,你的数据库才会联机。我说过,这是我在SQL Sever 2014 CTP2里遇到的问题,因为我希望在RTM版本发布时,微软对这方面会有所改进!

感谢关注!

时间: 2024-12-12 15:13:20

Hekaton是如何影响你数据库的目标恢复时间(RTO)的的相关文章

MySQL性能管理及架构设计(一):什么影响了数据库查询速度、什么影响了MySQL性能

一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS:是TransactionsPerSecond的缩写,也就是事务数/秒.它是软件测试结果的测量单位.客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数. Tips:最好不要在主库上数据库备份,

经验:什么影响了数据库查询速度、什么影响了MySQL性能 (转)

一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS:是TransactionsPerSecond的缩写,也就是事务数/秒.它是软件测试结果的测量单位.客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数. Tips:最好不要在主库上数据库备份,大型活动前

是什么影响了数据库索引选型?

主存存取原理 主存的构成 主存储器(简称主存或内存)包括存取体.各种逻辑部件及控制电路等.存储体由许多存储单元组成,每个存储单元又包含若干个存储元件,每个存储元件能寄存一位二进制代码"0"或"1".这样,一个存储单元可以存储一串二进制代码,这串二进制代码称为存储字,这串二进制代码的位数称为存储字长,可以是8位.16位或者32位等. 主存与CPU的联系 MAR(Memory Address Register)是存储器地址寄存器,用来存放欲访问的存储单元的地址,其位数对

Hekaton的神话与误解

最近这段时间,我花了很多时间来更好的理解Hekaton——SQL Sever 2014里的全新内存表技术.我看了很多文章,了解了Haktaon的各种内部数据存储结构(主要是哈希索引和Bw-tree).另外我也看了不少关于这方面的讲座. 但不止一次,有很多的误报,神话和误解出现,人们对Hektaton的认识发生了错误.从大家对Hekaton的提问就可以看出,我们需要整理Hekaton的知识,向大家重新传达它的相关知识,让大家更好的理解Hekaton,在Hekaton合适的场景来更好的使用它. 下面

终极事务处理(XTP,Hekaton)——万能大招?

在SQL Server 2014里,微软引入了终极事务处理(Extreme Transaction Processing),即大家熟知的Hekaton.我在网上围观了一些文档,写这篇文章,希望可以让大家更好的理解Hekaton,它的局限性,还有它惊艳的全新内存数据库技术.这篇文章会通过下面几个方面来讲解Hekaton: 概况 可扩展性(Scalability) 局限性(Limitations) 1.概况 让我们从XTP的简洁概况开始.像XTP这样的内存数据库技术首要目标非常明确:尽可能高效的使用

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用

修改Oracle数据库字符集

Oracle数据库字符集在创建后原则上不能更改.如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用 ALTER DATABASE CHARACTER SET UTF8 Oracle 字符集的查看和修改 一.什么是Oracle字符集 O

移动端数据库新王者:realm

介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android. 2014年7月发布.由YCombinator孵化的创业团队历时几年打造,是第一个专门针对移动平台设计的数据库.目标是取代SQLite. 为了彻底解决性能问题,核心数据引擎C++打造,并不是建立在SQLite之上的ORM.如果对数据引擎实现想深入了解可以查看:Realm 核心数据库引擎探秘.因此得到的收益就是比普通的ORM要快很多,甚至比单独无封装的SQLite还要快. 因为

ORACLE数据库性能优化之-->内存磁盘

1,内存结构优化概述 1.1 缓冲区 影响数据库运行性能的缓冲区包括可以共享的SGA和服务器进程私有的pga两大类,其中sga又包括共享池.大型池.java池.数据缓冲区.流池.redo log缓冲区. 1.2 自动内存管理 oracle一般采用自动内存管理来管理系统内存,由oracle自动管理和调整数据库实例的内存大小.在自动管理模式下,首先对初始化参数MEMORY_TARGET(目标内存大小)和MEMORY_MAX_TARGET(最大内存大小)进行配置,数据库调整目标内存大小,根据需要不断重