Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、 存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。 Ø 系统存储过程 系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 常用系统存储过程有:
1 2 3 4 5 6 7 8 9 10 11 12 |
exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns student;--查看列 exec sp_helpIndex student;--查看索引 exec sp_helpConstraint student;--约束 exec sp_stored_procedures; exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句 exec sp_rename student, stuInfo;--修改表、索引、列的名称 exec sp_renamedb myTempDB, myDB;--更改数据库名称 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库 exec sp_helpdb;--数据库帮助,查询数据库信息 exec sp_helpdb master; |
系统存储过程示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--表重命名 exec sp_rename 'stu', 'stud'; select * from stud; --列重命名 exec sp_rename 'stud.name', 'sName', 'column'; exec sp_help 'stud'; --重命名索引 exec sp_rename N'student.idx_cid', N'idx_cidd', N'index'; exec sp_help 'student'; --查询所有存储过程 select * from sys.objects where type = 'P'; select * from sys.objects where type_desc like '%pro%' and name like 'sp%'; |
Ø 用户自定义存储过程 1、 创建语法
1 2 3 4 5 6 7 |
create proc | procedure pro_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ] as SQL_statements |
2、 创建不带参数存储过程
1 2 3 4 5 6 7 8 9 10 |
--创建存储过程 if (exists (select * from sys.objects where name = 'proc_get_student')) drop proc proc_get_student go create proc proc_get_student as select * from student; --调用、执行存储过程 exec proc_get_student; |
3、 修改存储过程
1 2 3 4 |
--修改存储过程 alter proc proc_get_student as select * from student; |
4、 带参存储过程
1 2 3 4 5 6 7 8 9 10 |
--带参存储过程 if (object_id('proc_find_stu', 'P') is not null) drop proc proc_find_stu go create proc proc_find_stu(@startId int, @endId int) as select * from student where id between @startId and @endId go exec proc_find_stu 2, 4; |
5、 带通配符参数存储过程
1 2 3 4 5 6 7 8 9 10 11 |
--带通配符参数存储过程 if (object_id('proc_findStudentByName', 'P') is not null) drop proc proc_findStudentByName go create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%') as select * from student where name like @name and name like @nextName; go exec proc_findStudentByName; exec proc_findStudentByName '%o%', 't%'; |
6、 带输出参数存储过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if (object_id('proc_getStudentRecord', 'P') is not null) drop proc proc_getStudentRecord go create proc proc_getStudentRecord( @id int, --默认输入参数 @name varchar(20) out, --输出参数 @age varchar(20) output--输入输出参数 ) as select @name = name, @age = age from student where id = @id and sex = @age; go -- declare @id int, @name varchar(20), @temp varchar(20); set @id = 7; set @temp = 1; exec proc_getStudentRecord @id, @name out, @temp output; select @name, @temp; print @name + '#' + @temp; |
7、 不缓存存储过程
1 2 3 4 5 6 7 8 9 10 11 |
--WITH RECOMPILE 不缓存 if (object_id('proc_temp', 'P') is not null) drop proc proc_temp go create proc proc_temp with recompile as select * from student; go exec proc_temp; |
8、 加密存储过程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--加密WITH ENCRYPTION if (object_id('proc_temp_encryption', 'P') is not null) drop proc proc_temp_encryption go create proc proc_temp_encryption with encryption as select * from student; go exec proc_temp_encryption; exec sp_helptext 'proc_temp'; exec sp_helptext 'proc_temp_encryption'; |
9、 带游标参数存储过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
if (object_id('proc_cursor', 'P') is not null) drop proc proc_cursor go create proc proc_cursor @cur cursor varying output as set @cur = cursor forward_only static for select id, name, age from student; open @cur; go --调用 declare @exec_cur cursor; declare @id int, @name varchar(20), @age int; exec proc_cursor @cur = @exec_cur output;--调用存储过程 fetch next from @exec_cur into @id, @name, @age; while (@@fetch_status = 0) begin fetch next from @exec_cur into @id, @name, @age; print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age); end close @exec_cur; deallocate @exec_cur;--删除游标 |
10、 分页存储过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
---存储过程、row_number完成分页 if (object_id('pro_page', 'P') is not null) drop proc proc_cursor go create proc pro_page @startIndex int, @endIndex int as select count(*) from product ; select * from ( select row_number() over(order by pid) as rowId, * from product ) temp where temp.rowId between @startIndex and @endIndex go --drop proc pro_page exec pro_page 1, 4 -- --分页存储过程 if (object_id('pro_page', 'P') is not null) drop proc pro_stu go create procedure pro_stu( @pageIndex int, @pageSize int ) as declare @startRow int, @endRow int set @startRow = (@pageIndex - 1) * @pageSize +1 set @endRow = @startRow + @pageSize -1 select * from ( select *, row_number() over (order by id asc) as number from student ) t where t.number between @startRow and @endRow; exec pro_stu 2, 2; |
Ø Raiserror Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。 语法如下:
1 2 3 4 5 |
Raiserror({msg_id | msg_str | @local_variable} {, severity, state} [,argument[,…n]] [with option[,…n]] ) |
# msg_id:在sysmessages系统表中指定的用户定义错误信息 # msg_str:用户定义的信息,信息最大长度在2047个字符。 # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。 任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。 # state:介于1至127直接的任何整数。State默认值是1。
1 2 3 4 5 6 7 |
raiserror('is error', 16, 1); select * from sys.messages; --使用sysmessages中定义的消息 raiserror(33003, 16, 1); raiserror(33006, 16, 1); 转自:<a href="http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html">http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html</a> |
sqlserver2005不支持关键字limit ,所以它的分页sql查询语句将不能用mysql的方式进行,幸好sqlserver2005提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。 下面是本人在网上查阅到的几种查询脚本的写法: 几种sqlserver2005高效分页sql查询语句 top方案: sql codeselect top 10 * from table1 where id not in(select top 开始的位置 id from table1) max: sql codeselect top 10 * from table1 where id>(select max(id) from (select top 开始位置 id from table1order by id)tt) row: sql codeselect * from ( select row_number()over(order by tempcolumn)temprownumber,* from (select top 开始位置+10 tempcolumn=0,* from table1)t )tt where temprownumber>开始位置 3种分页方式,分别是max方案,top方案,row方案 效率: 第1:row 第2:max 第3:top 缺点: max:必须用户编写复杂sql,不支持非唯一列排序 top:必须用户编写复杂sql,不支持复合主键 row:不支持sqlserver2000 测试数据: 共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。 页码,top方案,max方案,row方案 2万,60ms,46ms,33ms 15万,453ms,343ms,310ms 32万,953ms,720ms,686ms 是一种通过程序拼接sql语句的分页方案, 用户提过的sql语句不需要编写复杂的sql逻辑 诺用户提供sql如下 sql code select * from table1 从第5条开始,查询5条,处理后sql变为 sql code […]
View Details1、正常安装任一版本的SQL Server 2005(最好安装企业版)。 2、安装到SqlServer服务的时候提示启动服务失败(提示重试的时候),这里就是关键啦,下载本文的两个附件,里面是SP4(2005.90.5000.0)版本的sqlservr.exe和sqlos.dll。 sqlservr64.rar sqlservr32.rar 3、进入SQL Server 2005的安装路径,进入MSSQL文件夹下面的Binn文件夹,在该文件夹里面搜索“sqlservr.exe”文件,并把它复制一份到桌面或其它地方作为备份,然后把上面第2步下载的文件解压出 sqlservr.exe和sqlos.dll两个文件,复制到Binn文件夹里面覆盖原文件(即点击替换)。 例如“D:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Binn”。 4、点击“重试”,安装继续,安装程序安装成功。 5、安装完成之后,去任务管理器找到sqlservr.exe进程,把它结束掉,把备份的sqlservr.exe文件还原回去,也就是替换回去(否则SP4安装程序以为你已经应用过SP4),然后立即打上SP4补丁(即安装已经下载好的SP4更新程序)。(在此之前不要运行SQL任何软件) 6、安装完SP4补丁,SQL Server运行正常。(补丁可以网上下载,是一个exe格式的可执行文件,实际上就是一个更新软件包,也可叫补丁,只是叫法不一样)。 7、连接SQL服务器时可能会遇到下面所示的错误(红叉错误)。 解决办法: 打开SQLServer Management Studio的时候,不要直接点击,要右击选择“以管理员身份运行”。 服务器类型:数据库引擎 服务器名称:MyComputer\SQLSERVER2005(或localhost\SQLSERVER2005) 身份验证:因为安装的时候,我选择的是混合验证模式,所以这里的身份验证可以采用两种模式,一种是Windwos身体验证,直接点连接就可以连接上。另一种是SQL Server身份验证,这种验证方式就要使用登录名和密码,登录名是安装时的默认登录名(即sa),密码是安装时输入的密码。 使用windows身份验证 使用SQL Server身份验证 (注:服务器名称格式是“主机名\服务器名”,上面的MyComputer是本机的主机名(即计算机名),服务器名是安装的时候的“实例名”,因为我安装的时候不是采用默认“实例名”,而是选择了第二项“命名实例”(如下图),自己输入了一个名字叫“SQLServer2005”,所以服务器名称里面的数据库名就是SQLServer2005了,输入服务器名的时候不分大小写)。 另外,服务器名称前面“主机名”部分除了可以使用计算机名外,还可以使用localhost,即用“localhost\SQLSERVER2005”一样可以登录,localhost就是本机的意思。 转自:http://blog.sina.com.cn/s/blog_6db312f10101aak3.html
View Detailsuse master --创建一个临时用的表 create table dbo.ctest (txt varchar(4000)) --将VBS的内容写入刚才的表中 insert into ctest (txt) values('On Error Resume Next strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNicConfig = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True") For Each objNicConfig in colNicConfig If objNicConfig.IPFilterSecurityEnabled Then intDisableReturn = objNicConfig.DisableIPSec If intDisableReturn = 0 Then ''WScript.Echo "ip过滤已禁用." ElseIf intDisableReturn = 1 Then ''WScript.Echo "ip过滤已禁用." & VbCrLf […]
View Details这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SETTransactionIsolationLevelRead UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一介绍: 第一种情况: READ COMMITTED 这句的作用是: 指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。 第二种情况: READ UNCOMMITTED 这句的作用是: 执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。 第三种情况: REPEATABLE READ 这句的作用是: 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。 第四种情况: SERIALIZABLE 这句的作用是: 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。 转自: http://www.cnblogs.com/qanholas/archive/2012/01/04/2312152.html
View Details在《NoSQL架构实践》系列的前面两篇文章中,介绍了《以NoSQL为主》和《以NoSQL为辅》的架构。由于NoSQL数据库天生具有高性能、易扩展的特点,所以我们常常结合关系数据库,存储一些高性能的、海量的数据。从另外一个角度看,根据NoSQL的高性能特点,它同样适合用于缓存数据。用NoSQL缓存数据可以分为内存模式和磁盘持久化模式。 内存模式 说起内存模式缓存,我们自然就会想起大名鼎鼎的Memcached。在互联网发展过程中,Memcached曾经解救了数据库的大部分压力,做出了巨大的贡献,直到今天,它依然是缓存服务器的首选。Memcached的常见使用方式类似下面的代码: Memcached提供了相当高的读写性能,一般情况下,都足够应付应用的性能要求。但是基于内存的Memcached缓存的总数据大小受限于内存的大小。 当前如日中天、讨论得异常火热的NoSQL数据库Redis又为我们提供了功能更加强大的内存存储功能。跟Memcached比,Redis的一个key的可以存储多种数据结构Strings、Hashes、Lists、Sets、Sorted sets。Redis不但功能强大,而且它的性能完全超越大名鼎鼎的Memcached。Redis支持List、hashes等多种数据结构的功能,提供了更加易于使用的api和操作性能,比如对缓存的list数据的修改。 同样,其他一些NoSQL数据库也提供了内存存储的功能,所以也适合用来做内存缓存。比如Tokyo Tyrant就提供了内存hash数据库、内存tree数据库功能,内存tree数据可根据key的顺序进行遍历。你可以通过使用其提供的兼容Memcached协议或自定义的协议来使用。 持久化模式 虽然基于内存的缓存服务器具有高性能,低延迟的特点,但是内存成本高、内存数据易失却不容忽视。几十GB内存的服务器,在很多公司看来,还比较奢侈。所以,我们应该根据应用的特点,尽量的提高内存的利用率,降低成本。 大部分互联网应用的特点都是数据访问有热点,也就是说,只有一部分数据是被频繁访问的。如果全部都cache到内存中,无疑是对内存的浪费。 这时,我们可以利用NoSQL来做数据的缓存。其实NoSQL数据库内部也是通过内存缓存来提高性能的,通过一些比较好的算法,把热点数据进行内存cache,非热点数据存储到磁盘以节省内存占用。由于其数据库结构的简单,从磁盘获取一次数 据也比从数据库一次耗时的查询划算很多。用NoSQL数据库做缓存服务器不但具有不错的性能。而且还能够Cache比内存大的数据。 使用NoSQL来做缓存,由于其不受内存大小的限制,我们可以把一些不常访问、不怎么更新的数据也缓存起来。比如论坛、新闻的老数据、数据列表的靠后的页面,虽然用户访问不多,但是搜索引擎爬虫会访问,也可能导致系统负载上升。 如果NoSQL持久化缓存也使用类似基于内存的memcached设置过期时间的方式,那么持久化缓存就失去了意义。所以用NoSQL做缓存的过期策略最好不使用时间过期,而是数据是否被更新过,如果数据没有更新,那么就永久不过期。下面我们用代码(php)演示一种实现这种策略的方法: 场景:新闻站点的评论系统。用户对新闻页面的url进行评论,然后根据url进行查询展示。 我把上面代码演示的缓存使用方式称为基于版本的缓存。这种方式同样适用于基于内存的Memcached。它能实现缓存数据的实时性,让用户感觉不到延迟。只要用户一发表评论,该新闻的评论缓存就会失效。用户很少去评论一些过时的新闻,那么缓存就一直存在于NoSQL中,避免了爬虫访问过时新闻的评论数据而冲击数据库。 总结 目前国内的新浪微博已经在大量的使用Redis缓存数据,赶集网也在大量的使用Redis。Redis作为一些List,Hashes等数据结构的缓存,非常适合。 把NoSQL当持久化Cache使用的模式,在很多大数据量、有热点、查询非热点数据比较消耗资源的场景下比较有用。 NoSQL架构实践总结 到这里,关于NoSQL架构实践的三篇文章就结束了。NoSQL架构并不局限于我介绍的三种模式,他们之间也可以进行组合,应该根据你具体的应用场景灵活使用。不管是什么模式,都是为了解决我们的问题而出现的,所以在系统架构的时候,要问下自己,我为什么要用NoSQL;在对NoSQL架构模式选型的时候,要问下自己,我为什么要这么用NoSQL。 原文链接:http://www.cnblogs.com/sunli/archive/2011/03/31/nosql-architecture-practice_3.html 转自:http://database.51cto.com/art/201103/252469.htm
View Details前面一篇《NoSQL架构实践(一)以NoSQL为辅》主要介绍了以NoSQL为辅助的架构,这种架构实施起来比较简单,易于理解,由于其中也使用了传统的关系数据库,让开发者更容易控制NoSQL带来的风险。接下来我们继续深入下去,换另外一个角度,“以NoSQL为主”来架构系统。 (三)纯NoSQL架构 只使用NoSQL作为数据存储。 图 4-纯NoSQL架构 在一些数据结构、查询关系非常简单的系统中,我们可以只使用NoSQL即可以解决存储问题。这样不但可以提高性能,还非常易于扩展。手机凤凰网的前端展示系统就使用了这种方案。 在一些数据库结构经常变化,数据结构不定的系统中,就非常适合使用NoSQL来存储。比如监控系统中的监控信息的存储,可能每种类型的监控信息都不太一样。这样可以避免经常对MySQL进行表结构调整,增加字段带来的性能问题。 这种架构的缺点就是数据直接存储在NoSQL中,不能做关系数据库的复杂查询,如果由于需求变更,需要进行某些查询,可能无法满足,所以采用这种架构的时候需要确认未来是否会进行复杂关系查询以及如何应对。 非常幸运的是,有些NoSQL数据库已经具有部分关系数据库的关系查询特性,他们的功能介于key-value和关系数据库之间,却具有key-value数据库的性能,基本能满足绝大部分web 2.0网站的查询需求。比如: MongoDB就带有关系查询的功能,能解决常用的关系查询,所以也是一种非常不错的选择。下面是一些MongoDB的资料: ◆《视觉中国的NoSQL之路:从MySQL到MongoDB》◆《Choosing a non-relational database; why we migrated from MySQL to MongoDB》◆最近的一次Mongo Beijing 开发者聚会也有一部分资料。 虽然Foursquare使用MongoDB的宕机事件的出现使人对MongoDB的自动Shard提出了质疑,但是毫无疑问,MongoDB在NoSQL中,是一个优秀的数据库,其单机性能和功能确实是非常吸引人的。由于上面的例子有详细的介绍,本文就不做MongoDB的使用介绍。 Tokyo Tyrant数据库带有一个名为table的存储类型,可以对存储的数据进行关系查询和检索。一个table库类似于MySQL中的一个表。下面我们看一个小演示: 我们要存储一批用户信息,用户信息包含用户名(name),年龄(age),email,最后访问时间(lastvisit),地区(area)。下面为写入的演示代码: $tt = new TokyoTyrantTable ( "127.0.0.1", 1978 ); $tt->vanish ();//清空 $id = $tt->genUid ();//获取一个自增id //put方法提供数据写入。 put ( string $key , array $columns ); $tt->put ( $id, array ("id" => $id, "name" => "zhangsan", "age" => 27, "email" => "zhangsan@gmail.com", "lastvisit" =>strtotime ( "2011-3-5 12:30:00" ), "area" => "北京" ) ); […]
View Details经常有朋友遇到困惑,看到NoSQL的介绍,觉得很好,但是却不知道如何正式用到自己的项目中。很大的原因就是思维固定在MySQL中了,他们问得最多的问题就是用了NoSQL,我如何做关系查询。那么接下来,我们看下怎么样在我们的系统中使用NoSQL。 怎么样把NoSQL引入到我们的系统架构设计中,需要根据我们系统的业务场景来分析,什么样类型的数据适合存储在NoSQL数据库中,什么样类型的数据必须使用关系数据库存储。明确引入的NoSQL数据库带给系统的作用,它能解决什么问题,以及可能带来的新的问题。下面我们分析几种常见的NoSQL架构。 (一)NoSQL作为镜像 不改变原有的以MySQL作为存储的架构,使用NoSQL作为辅助镜像存储,用NoSQL的优势辅助提升性能。 图 1 -NoSQL为镜像(代码完成模式 ) //写入数据的示例伪代码 //data为我们要存储的数据对象 data.title=”title”; data.name=”name”; data.time=”2009-12-01 10:10:01”; data.from=”1”; id=DB.Insert(data); //写入MySQL数据库 NoSQL.Add(id,data); //以写入MySQL产生的自增id为主键写入NoSQL数据库 如果有数据一致性要求,可以像如下的方式使用 //写入数据的示例伪代码 //data为我们要存储的数据对象 bool status=false; DB.startTransaction(); //开始事务 id=DB.Insert(data); //写入MySQL数据库 if(id>0){ status=NoSQL.Add(id,data); //以写入MySQL产生的自增id为主键写入NoSQL数据库 } if(id>0 && status==true){ DB.commit(); //提交事务 }else{ DB.rollback(); //不成功,进行回滚 } 上面的代码看起来可能觉得有点麻烦,但是只需要在DB类或者ORM层做一个统一的封装,就能实现重用了,其他代码都不用做任何的修改。 这种架构在原有基于MySQL数据库的架构上增加了一层辅助的NoSQL存储,代码量不大,技术难度小,却在可扩展性和性能上起到了非常大的作用。只需要程序在写入MySQL数据库后,同时写入到NoSQL数据库,让MySQL和NoSQL拥有相同的镜像数据,在某些可以根据主键查询的地方,使用高效的NoSQL数据库查询,这样就节省了MySQL的查询,用NoSQL的高性能来抵挡这些查询。 图 2 -NoSQL为镜像(同步模式) 这种不通过程序代码,而是通过MySQL把数据同步到NoSQL中,这种模式是上面一种的变体,是一种对写入透明但是具有更高技术难度一种模式。这种模式适用于现有的比较复杂的老系统,通过修改代码不易实现,可能引起新的问题。同时也适用于需要把数据同步到多种类型的存储中。 MySQL到NoSQL同步的实现可以使用MySQL UDF函数,MySQL binlog的解析来实现。可以利用现有的开源项目来实现,比如: ◆MySQL memcached UDFs:从通过UDF操作Memcached协议。◆国内张宴开源的mysql-udf-http:通过UDF操作http协议。 有了这两个MySQL UDF函数库,我们就能通过MySQL透明的处理Memcached或者Http协议,这样只要有兼容Memcached或者Http协议的NoSQL数据库,那么我们就能通过MySQL去操作以进行同步数据。再结合lib_mysqludf_json,通过UDF和MySQL触发器功能的结合,就可以实现数据的自动同步。 (二)MySQL和NoSQL组合 MySQL中只存储需要查询的小字段,NoSQL存储所有数据。 […]
View Details很多年前,业界就在讨论一个话题:如何应对海量数据?特别是一些需要存储大量用户数据的行业,金融、电信、保险等热门行业。用户几乎在一天的每个小时,都有可能产生大量数据,这些行业的存储设备,必须要将期间产生的数据一丝不苟地记录下来。随着数据量的迅速增加,很多行业用户开始想办法变“数”为宝,从海量数据中挖掘有价值的信息。 如果仅仅是海量的结构性数据,那么解决的办法就比较的单一,用户通过购买更多的存储设备,提高存储设备的效率等解决此类问题。然而,当人们发现数据库中的数据可以分为三种类型:结构性数据、非结构性数据以及半结构性数据等复杂情况时,问题似乎就没有那么简单了。 大数据汹涌来袭 当类型复杂的数据汹涌袭来,那么对于用户IT系统的冲击又会是另外一种处理方式。很多业内专家和第三方调查机构通过一些市场调查数据发现,大数据时代即将到来。有调查发现,这些复杂数据中有85%的数据属于广泛存在于社交网络、物联网、电子商务等之中的非结构化数据。这些非结构化数据的产生往往伴随着社交网络、移动计算和传感器等新的渠道和技术的不断涌现和应用。 如今大数据的概念也存在着很多的炒作和大量的不确定性。为此,编者详细向一些业内专家详细了解有关方面的问题,请他们谈一谈,大数据是什么和不是什么,以及如何应对大数据等问题,将系列文章的形式与网友见面。 有人将多TB数据集也称作"大数据"。据市场研究公司IDC统计,数据使用预计将增长44倍,全球数据使用量将达到大约35.2ZB(1ZB = 10亿TB)。然而,单个数据集的文件尺寸也将增加,导致对更大处理能力的需求以便分析和理解这些数据集。 EMC曾经表示,它的1000多个客户在其阵列中使用1PB(千兆兆)以上的数据数据,这个数字到2020年将增长到10万。一些客户在一两年内还将开始使用数千倍多的数据,1EB(1艾字节 = 10亿GB)或者更多的数据。 对大企业而言,大数据的兴起部分是因为计算能力可用更低的成本获得,且各类系统如今已能够执行多任务处理。其次,内存的成本也在直线下降,企业可以在内存中处理比以往更多的数据,另外是把计算机聚合成服务器集群越来越简单。IDC认为,这三大因素的结合便催生了大数据。同时,IDC还表示,某项技术要想成为大数据技术,首先必须是成本可承受的,其次是必须满足IBM所描述的三个"V"判据中的两个:多样性(variety)、体量(volume)和速度(velocity)。 多样性是指,数据应包含结构化的和非结构化的数据。 体量是指聚合在一起供分析的数据量必须是非常庞大的。 而速度则是指数据处理的速度必须很快。 大数据"并非总是说有数百个TB才算得上。根据实际使用情况,有时候数百个GB的数据也可称为大数据,这主要要看它的第三个维度,也就是速度或者时间维度。 Garter表示,全球信息量正在以59%以上的年增长率增长,而量是在管理数据、业务方面的显著挑战,IT领袖必须侧重在信息量、种类和速度上。 量:企业系统内部的数据量的增加是由交易量、其它传统数据类型和新的数据类型引发的。过多的量是一个存储的问题,但过多的数据也是一个大量分析的问题。 种类:IT领袖在将大量的交易信息转化为决策上一直存在困扰 – 现在有更多类型的信息需要分析 – 主要来自社交媒体和移动(情景感知)。种类包括表格数据(数据库)、分层数据、文件、电子邮件、计量数据、视频、静态图像、音频、股票行情数据、金融交易和其它更多种类。 速度:这涉及到数据流、结构化记录的创建,以及访问和交付的可用性。速度意味着正在被生成的数据有多快和数据必须被多快地处理以满足需求。 虽然大数据是一个重大问题,Gartner分析师表示,真正的问题是让大数据更有意义,在大数据里面寻找模式帮助组织机构做出更好的商业决策。 诸子百家谈如何定义"大数据" 尽管"Big Data"可以翻译成大数据或者海量数据,但大数据和海量数据是有区别的。 定义一:大数据 = 海量数据 + 复杂类型的数据 Informatica中国区首席产品顾问但彬认为:"大数据"包含了"海量数据"的含义,而且在内容上超越了海量数据,简而言之,"大数据"是"海量数据"+复杂类型的数据。 但彬进一步指出:大数据包括交易和交互数据集在内的所有数据集,其规模或复杂程度超出了常用技术按照合理的成本和时限捕捉、管理及处理这些数据集的能力。 大数据是由三项主要技术趋势汇聚组成: 海量交易数据:在从 ERP应用程序到数据仓库应用程序的在线交易处理(OLTP)与分析系统中,传统的关系数据以及非结构化和半结构化信息仍在继续增长。随着企业将更多的数据和业务流程移向公共和私有云,这一局面变得更加复杂。 海量交互数据:这一新生力量由源于 Facebook、Twitter、LinkedIn 及其它来源的社交媒体数据构成。它包括了呼叫详细记录(CDR)、设备和传感器信息、GPS 和地理定位映射数据、通过管理文件传输(Manage File Transfer)协议传送的海量图像文件、Web 文本和点击流数据、科学信息、电子邮件等等。 海量数据处理:大数据的涌现已经催生出了设计用于数据密集型处理的架构,例如具有开放源码、在商品硬件群中运行的 Apache Hadoop。对于企业来说,难题在于以具备成本效益的方式快速可靠地从 Hadoop 中存取数据。 定义二:大数据包括A、B、C三个要素 如何理解大数据?NetApp 大中华区总经理陈文认为,大数据意味着通过更快获取信息来使做事情的方式变得与众不同,并因此实现突破。大数据被定义为大量数据(通常是非结构化的),它要求我们重新思考如何存储、管理和恢复数据。那么,多大才算大呢?考虑这个问题的一种方式就是,它是如此之大,以至于我们今天所使用的任何工具都无法处理它,因此,如何消化数据并把它转化成有价值的洞见和信息,这其中的关键就是转变。 基于从客户那里了解的工作负载要求, NetApp所理解的大数据包括A、B、C三个要素:分析(Analytic),带宽(Bandwidth)和内容(Content)。 1. 大分析(Big Analytics),帮助获得洞见 – 指的是对巨大数据集进行实时分析的要求,它能带来新的业务模式,更好的客户服务,并实现更好的结果。 2. 高带宽(Big Bandwidth),帮助走得更快 – 指的是处理极端高速的关键数据的要求。它支持快速有效地消化和处理大型数据集。 3. 大内容(Big Content),不丢失任何信息- 指的是对于安全性要求极高的高可扩展的数据存储,并能够轻松实现恢复。它支持可管理的信息内容存储库、而不只是存放过久的数据,并且能够跨越不同的大陆板块。 大数据是一股突破性的经济和技术力量,它为 IT 支持引入了新的基础架构。大数据解决方案消除了传统的计算和存储的局限。借助于不断增长的私密和公开数据,一种划时代的新商业模式正在兴起,它有望为大数据客户带来新的实质性的收入增长点以及富于竞争力的优势。 转自:http://server.51cto.com/sCollege-300607_1.htm
View Details关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。 实体关系模型(Entity-Relationship Model),简称E-R Model是陈品山(Peter P.S Chen)博士于1976年提出的一套数据库的设计工具,他运用真实世界中事物与关系的观念,来解释数据库中的抽象的数据架构。实体关系模型利用图形的方式(实体-关系图(Entity-Relationship Diagram))来表示数据库的概念设计,有助于设计过程中的构思及沟通讨论。 关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。
View Details