分类存储过程
存储过程分为三类:
系统存储过程:(System stored Procere)sp_开头,为SQLSERVER内置存储过程。
扩展存储过程:(Extended stored Procere),也就是外挂程序,用于扩展SQLSERVER的功能,以sp_或者xp_开头,以DLL的形式单独存在。
(系统存储过程和扩展存储过程都是在master数据库中。sp_开头的可是全局的,任何一个数据库都可以直接调用的。)
系统存储过程主要分为以下几类:
目录存储过程,例如:
sp_columns 返回当前环境中可查询的指定表或视图的列信息。
sp_tables 返回当前环境下可查询的对象的列表(任何可出现在 FROM 子句中的对象)。
sp_stored_proceres 返回当前环境中的存储过程列表。
复制类存储过程,例如:
sp_addarticle 创建项目并将其添加到发布中。此存储过程在发布服务器的发布数据库上执行。
安全管理类存储过程,例如:
sp_addrole 在当前数据库创建新的 Microsoft�0�3 SQL Server�6�4 角色。
sp_password 添加或更改 Microsoft�0�3 SQL Server�6�4 登录的密码。
分布式查询存储过程,例如:
sp_foreignkeys 返回引用主键的外键,这些主键在链接服务器中的表上。
sp_primarykeys 返回指定远程表的主键列,每个键列占一行。
扩展存储过程:
xp_sendmail 向指定的收件人发送邮件和查询结果集附件。
xp_startmail 启动 SQL 邮件客户端会话。
xp_cmdshell 以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行xp_cmdshell 的权限。
用户定义的存储过程:(User-defined stored Procere),这个就是用户在具体的数据库中自己定义的,名字最好不要以sp_和xp_开头,防止混乱。
注意事项:
1.在存储过程中,有些建立对象的语句是不可使用的:create default,create trigger,create procere,create view,create rule.
2.在同一数据库中,不同的所有者可以建立相同名称的对象名。例如:a.sample,b.sample,c.sample三个数据表可以同时存在。如果存储过程中未指明对象的所有者(例如存储过程中的语句select * from sample,这句中的sample没有指明所有者),在执行的过程中默认的所有者查找顺序是:相应的存储过程的建立者->相应数据库的所有者。如果这个查找过程中没有把所有者确定下来,系统就要报错。
(这里我额外插一句:如果需要严密的数据操作,在任何操作中尽量加上所有者,例如leijun.sample)
3.在存储过程名称前边添加#或者##,所建立的存储过程则是“临时存储过程“(#是局部临时存储过程,##是全局临时存储过程)。
2. 写一个存储过程对用户表中的年龄进行分类
TYPE表中的第个类型代表一个年龄区间,即然是区间,那么就需要一个明确的起始值,而不是靠人为去判断每个年龄段的起始年龄。假定TYPE表增加一个字段,typevaluemin 代表每个年龄段的最小年龄值,那么,可以直接用一条语句就查询出来,没有必要再弄个存储过程
---mssqlserver代码,newid没有说明生成规则,所以未列出此字段取值
insertinto(uid,typeid)
selecta.uid,b.typeid
from[user]a
leftjoin[type]bona.uagebetweenb.typevalueminandb.typevalue
----如果确实不方便添加字段,可以使用自动计算的方式提取最小值,代码如下:
insertinto(uid,typeid)
selecta.uid,b.typeid
from[user]a
leftjoin
(select
id
,typeid
,typename
,typevaluemin=isnull((selecttop1typevalue+1astypevalueminfrom[type]wheretypevalue<x.typevalueorderbytypevaluedesc),0)
,typevalue
from[type]x
)bona.uagebetweenb.typevalueminandb.typevalue
--另外,因为“张7/赵六”的年龄段在TYPE表中不存在,因此,他们的类型为NULL
3. 试说明存储过程的主要优点及分类
过程:
把冰箱门打开,把大象放进去,再把冰箱门带上。
这就把大象储存起来了。
4. 数据库原理-存储过程的类型有哪些分别有什么特征。
(3).存储过程分类<1>.系统存储过程系统存储过程(System
Stored
Proceres)主要存储在master数据库中,并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL
Server提供支持。<2>.本地存储过程本地存储过程(Local
Stored
Proceres)也就是用户自行创建在用户数据库中的存储过程。事实上一般所说的存储过程值得就是本地存储过程。用户创建的存储过程是由用户创建并能完成某一特定功能(如查询用户所需的数据信息)的存储过程。<3>.临时存储过程临时存储过程(Temporary
Stored
Proceres)可分为以下两种:A.本地临时存储过程如果在创建存储过程中,以井号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程(例如,CREATE
PROCEDURE
#book_proc.....)。本地临时存储过程只有创建它的连接的用户才能够执行它,而且一旦这位用户断开与SQL
Server的连接,本地临时存储过程就会自动删除,当然,这位用户也可以在连接期间用DROP
PROCEDURE命令删除多创建的本地临时存储过程。B.全局临时存储过程如果在所创建的存储过程名称是以两个井号(#
#)开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,如果没有,便立即将全局临时存储过程删除;如果有,SQL
Server会让这些执行中的操作继续进行,但是不允许任何用户再执行全局临时存储过程,等到所有未完成的操作执行完毕后,全局临时存储过程就会自动删除。由于全局临时存储过程能够被所有的连接用户使用,因此,必须注意其名称不能和其他连接所采用的名称相同。<4>.远程存储过程远程存储过程(Remote
Stored
Proceres)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5. 如何实现用户自己的数据文件的分类存放策略
1 虚拟存储技术的产生
虚拟化技术并不是一件很新的技术,它的发展,应该说是随着计算机技术的发展而发展起来的,最早是始于70年代.由于当时的存储容量,特别是内存容量成本非常高,容量也很小,对于大型应用程序或多程序应用就受到了很大的限制.为了克服这样的限制,人们就采用了虚拟存储的技术,最典型的应用就是虚拟内存技术.随着计算机技术以及相关信息处理技术的不断发展,人们对存储的需求越来越大.这样的需求刺激了各种新技术的出现,比如磁盘性能越来越好,容量越来越大.但是在大量的大中型信息处理系统中,单个磁盘是不能满足需要,这样的情况下存储虚拟化技术就发展起来了.在这个发展过程中也由几个阶段和几种应用.首先是磁盘条带集(RAID,可带容错)技术,将多个物理磁盘通过一定的逻辑关系集合起来,成为一个大容量的虚拟磁盘.而随着数据量不断增加和对数据可用性要求的不断提高,又一种新的存储技术应运而生,那就是存储区域网络(SAN)技术.SAN的广域化则旨在将存储设备实现成为一种公用设施,任何人员,任何主机都可以随时随地获取各自想要的数据.目前讨论比较多的包括iSCSI,FC Over IP 等技术,由于一些相关的标准还没有最终确定,但是存储设备公用化,存储网络广域化是一个不可逆转的潮流.
2 虚拟存储的概念
所谓虚拟存储,就是把多个存储介质模块(如硬盘,RAID)通过一定的手段集中管理起来,所有的存储模块在一个存储池(Storage Pool)中得到统一管理,从主机和工作站的角度,看到就不是多个硬盘,而是一个分区或者卷,就好象是一个超大容量(如1T以上)的硬盘.这种可以将多种,多个存储设备统一管理起来,为使用者提供大容量,高数据传输性能的存储系统,就称之为虚拟存储.
虚拟存储的分类
目前虚拟存储的发展尚无统一标准,从虚拟化存储的拓扑结构来讲主要有两种方式:即对称式与非对称式.对称式虚拟存储技术是指虚拟存储控制设备与存储软件系统,交换设备集成为一个整体,内嵌在网络数据传输路径中;非对称式虚拟存储技术是指虚拟存储控制设备独立于数据传输路径之外.从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统.具体如下:
A.对称式虚拟存储
图1
图1对称式虚拟存储解决方案的示意图
在图1所示的对称式虚拟存储结构图中,存储控制设备 High Speed Traffic Directors(HSTD)与存储池子系统Storage Pool集成在一起,组成SAN Appliance.可以看到在该方案中存储控制设备HSTD在主机与存储池数据交换的过程中起到核心作用.该方案的虚拟存储过程是这样的:由HSTD内嵌的存储管理系统将存储池中的物理硬盘虚拟为逻辑存储单元(LUN),并进行端口映射(指定某一个LUN能被哪些端口所见),主机端将各可见的存储单元映射为操作系统可识别的盘符.当主机向SAN Appliance写入数据时,用户只需要将数据写入位置指定为自己映射的盘符(LUN),数据经过HSTD的高速并行端口,先写入高速缓存,HSTD中的存储管理系统自动完成目标位置由LUN到物理硬盘的转换,在此过程中用户见到的只是虚拟逻辑单元,而不关心每个LUN的具体物理组织结构.该方案具有以下主要特点:
(1)采用大容量高速缓存,显着提高数据传输速度.
缓存是存储系统中广泛采用的位于主机与存储设备之间的I/O路径上的中间介质.当主机从存储设备中读取数据时,会把与当前数据存储位置相连的数据读到缓存中,并把多次调用的数据保留在缓存中;当主机读数据时,在很大几率上能够从缓存中找到所需要的数据.直接从缓存上读出.而从缓存读取数据时的速度只受到电信号传播速度的影响(等于光速),因此大大高于从硬盘读数据时盘片机械转动的速度.当主机向存储设备写入数据时,先把数据写入缓存中,待主机端写入动作停止,再从缓存中将数据写入硬盘,同样高于直接写入硬盘的速度
(2)多端口并行技术,消除了I/O瓶颈.
传统的FC存储设备中控制端口与逻辑盘之间是固定关系,访问一块硬盘只能通过控制它的控制器端口.在对称式虚拟存储设备中,SAN Appliance的存储端口与LUN的关系是虚拟的,也就是说多台主机可以通过多个存储端口(最多8个)并发访问同一个LUN;在光纤通道100MB/带宽的大前提下,并行工作的端口数量越多,数据带宽就越高.
(3)逻辑存储单元提供了高速的磁盘访问速度.
在视频应用环境中,应用程序读写数据时以固定大小的数据块为单位(从512byte到1MB之间).而存储系统为了保证应用程序的带宽需求,往往设计为传输512byte以上的数据块大小时才能达到其最佳I/O性能.在传统SAN结构中,当容量需求增大时,唯一的解决办法是多块磁盘(物理或逻辑的)绑定为带区集,实现大容量LUN.在对称式虚拟存储系统中,为主机提供真正的超大容量,高性能LUN,而不是用带区集方式实现的性能较差的逻辑卷.与带区集相比,Power LUN具有很多优势,如大块的I/O block会真正被存储系统所接受,有效提高数据传输速度;并且由于没有带区集的处理过程,主机CPU可以解除很大负担,提高了主机的性能.
(4)成对的HSTD系统的容错性能.
在对称式虚拟存储系统中,HSTD是数据I/O的必经之地,存储池是数据存放地.由于存储池中的数据具有容错机制保障安全,因此用户自然会想到HSTD是否有容错保护.象许多大型存储系统一样,在成熟的对称式虚拟存储系统中,HSTD是成对配制的,每对HSTD之间是通过SAN Appliance内嵌的网络管理服务实现缓存数据一致和相互通信的.
(5)在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN.
因为系统保持了标准的SAN结构,为系统的扩展和互连提供了技术保障,所以在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN.
B.非对称式虚拟存储系统
图2
图2非对称式虚拟存储系统示意图
在图2所示的非对称式虚拟存储系统结构图中,网络中的每一台主机和虚拟存储管理设备均连接到磁盘阵列,其中主机的数据路径通过FC交换设备到达磁盘阵列;虚拟存储设备对网络上连接的磁盘阵列进行虚拟化操作,将各存储阵列中的LUN虚拟为逻辑带区集(Strip),并对网络上的每一台主机指定对每一个Strip的访问权限(可写,可读,禁止访问).当主机要访问某个Strip时,首先要访问虚拟存储设备,读取Strip信息和访问权限,然后再通过交换设备访问实际的Strip中的数据.在此过程中,主机只会识别到逻辑的strip,而不会直接识别到物理硬盘.这种方案具有如下特点:
(1)将不同物理硬盘阵列中的容量进行逻辑组合,实现虚拟的带区集,将多个阵列控制器端口绑定,在一定程度上提高了系统的可用带宽.
(2)在交换机端口数量足够的情况下,可在一个网络内安装两台虚拟存储设备,实现Strip信息和访问权限的冗余.
但是该方案存在如下一些不足:
(1)该方案本质上是带区集——磁盘阵列结构,一旦带区集中的某个磁盘阵列控制器损坏,或者这个阵列到交换机路径上的铜缆,GBIC损坏,都会导致一个虚拟的LUN离线,而带区集本身是没有容错能力的,一个LUN的损坏就意味着整个Strip里面数据的丢失.
(2)由于该方案的带宽提高是通过阵列端口绑定来实现的,而普通光纤通道阵列控制器的有效带宽仅在40MB/S左右,因此要达到几百兆的带宽就意味着要调用十几台阵列,这样就会占用几十个交换机端口,在只有一两台交换机的中小型网络中,这是不可实现的.
(3)由于各种品牌,型号的磁盘阵列其性能不完全相同,如果出于虚拟化的目的将不同品牌,型号的阵列进行绑定,会带来一个问题:即数据写入或读出时各并发数据流的速度不同,这就意味着原来的数据包顺序在传输完毕后被打乱,系统需要占用时间和资源去重新进行数据包排序整理,这会严重影响系统性能.
4 数据块虚拟与虚拟文件系统
以上从拓扑结构角度分析了对称式与非对称式虚拟存储方案的异同,实际从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统.
数据块虚拟存储方案着重解决数据传输过程中的冲突和延时问题.在多交换机组成的大型Fabric结构的SAN中,由于多台主机通过多个交换机端口访问存储设备,延时和数据块冲突问题非常严重.数据块虚拟存储方案利用虚拟的多端口并行技术,为多台客户机提供了极高的带宽,最大限度上减少了延时与冲突的发生,在实际应用中,数据块虚拟存储方案以对称式拓扑结构为表现形式.
虚拟文件系统存储方案着重解决大规模网络中文件共享的安全机制问题.通过对不同的站点指定不同的访问权限,保证网络文件的安全.在实际应用中,虚拟文件系统存储方案以非对称式拓扑结构为表现形式.
虚拟存储技术和这门课的结合点
本学期的这门课中,所涉及的虚拟存储技术,实际上是虚拟存储技术的一个方面,特指以CPU时间和外存空间换取昂贵内存空间的操作系统中的资源转换技术
基本思想:程序,数据,堆栈的大小可以超过内存的大小,操作系统把程序当前使用的部分保留在内存,而把其他部分保存在磁盘上,并在需要时在内存和磁盘之间动态交换,虚拟存储器支持多道程序设计技术
目的:提高内存利用率
管理方式
A 请求式分页存储管理
在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其他页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面
B 请求式分段存储管理
为了能实现虚拟存储,段式逻辑地址空间中的程序段在运行时并不全部装入内存,而是如同请求式分页存储管理,首先调入一个或若干个程序段运行,在运行过程中调用到哪段时,就根据该段长度在内存分配一个连续的分区给它使用.若内存中没有足够大的空闲分区,则考虑进行段的紧凑或将某段或某些段淘汰出去,这种存储管理技术称为请求式分段存储管理
现在团IDC网上有45元/年美国空间的团购,便宜有口碑
1 虚拟存储技术的产生
虚拟化技术并不是一件很新的技术,它的发展,应该说是随着计算机技术的发展而发展起来的,最早是始于70年代.由于当时的存储容量,特别是内存容量成本非常高,容量也很小,对于大型应用程序或多程序应用就受到了很大的限制.为了克服这样的限制,人们就采用了虚拟存储的技术,最典型的应用就是虚拟内存技术.随着计算机技术以及相关信息处理技术的不断发展,人们对存储的需求越来越大.这样的需求刺激了各种新技术的出现,比如磁盘性能越来越好,容量越来越大.但是在大量的大中型信息处理系统中,单个磁盘是不能满足需要,这样的情况下存储虚拟化技术就发展起来了.在这个发展过程中也由几个阶段和几种应用.首先是磁盘条带集(RAID,可带容错)技术,将多个物理磁盘通过一定的逻辑关系集合起来,成为一个大容量的虚拟磁盘.而随着数据量不断增加和对数据可用性要求的不断提高,又一种新的存储技术应运而生,那就是存储区域网络(SAN)技术.SAN的广域化则旨在将存储设备实现成为一种公用设施,任何人员,任何主机都可以随时随地获取各自想要的数据.目前讨论比较多的包括iSCSI,FC Over IP 等技术,由于一些相关的标准还没有最终确定,但是存储设备公用化,存储网络广域化是一个不可逆转的潮流.
2 虚拟存储的概念
所谓虚拟存储,就是把多个存储介质模块(如硬盘,RAID)通过一定的手段集中管理起来,所有的存储模块在一个存储池(Storage Pool)中得到统一管理,从主机和工作站的角度,看到就不是多个硬盘,而是一个分区或者卷,就好象是一个超大容量(如1T以上)的硬盘.这种可以将多种,多个存储设备统一管理起来,为使用者提供大容量,高数据传输性能的存储系统,就称之为虚拟存储.
虚拟存储的分类
目前虚拟存储的发展尚无统一标准,从虚拟化存储的拓扑结构来讲主要有两种方式:即对称式与非对称式.对称式虚拟存储技术是指虚拟存储控制设备与存储软件系统,交换设备集成为一个整体,内嵌在网络数据传输路径中;非对称式虚拟存储技术是指虚拟存储控制设备独立于数据传输路径之外.从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统.具体如下:
A.对称式虚拟存储
图1
图1对称式虚拟存储解决方案的示意图
在图1所示的对称式虚拟存储结构图中,存储控制设备 High Speed Traffic Directors(HSTD)与存储池子系统Storage Pool集成在一起,组成SAN Appliance.可以看到在该方案中存储控制设备HSTD在主机与存储池数据交换的过程中起到核心作用.该方案的虚拟存储过程是这样的:由HSTD内嵌的存储管理系统将存储池中的物理硬盘虚拟为逻辑存储单元(LUN),并进行端口映射(指定某一个LUN能被哪些端口所见),主机端将各可见的存储单元映射为操作系统可识别的盘符.当主机向SAN Appliance写入数据时,用户只需要将数据写入位置指定为自己映射的盘符(LUN),数据经过HSTD的高速并行端口,先写入高速缓存,HSTD中的存储管理系统自动完成目标位置由LUN到物理硬盘的转换,在此过程中用户见到的只是虚拟逻辑单元,而不关心每个LUN的具体物理组织结构.该方案具有以下主要特点:
(1)采用大容量高速缓存,显着提高数据传输速度.
缓存是存储系统中广泛采用的位于主机与存储设备之间的I/O路径上的中间介质.当主机从存储设备中读取数据时,会把与当前数据存储位置相连的数据读到缓存中,并把多次调用的数据保留在缓存中;当主机读数据时,在很大几率上能够从缓存中找到所需要的数据.直接从缓存上读出.而从缓存读取数据时的速度只受到电信号传播速度的影响(等于光速),因此大大高于从硬盘读数据时盘片机械转动的速度.当主机向存储设备写入数据时,先把数据写入缓存中,待主机端写入动作停止,再从缓存中将数据写入硬盘,同样高于直接写入硬盘的速度
(2)多端口并行技术,消除了I/O瓶颈.
传统的FC存储设备中控制端口与逻辑盘之间是固定关系,访问一块硬盘只能通过控制它的控制器端口.在对称式虚拟存储设备中,SAN Appliance的存储端口与LUN的关系是虚拟的,也就是说多台主机可以通过多个存储端口(最多8个)并发访问同一个LUN;在光纤通道100MB/带宽的大前提下,并行工作的端口数量越多,数据带宽就越高.
(3)逻辑存储单元提供了高速的磁盘访问速度.
在视频应用环境中,应用程序读写数据时以固定大小的数据块为单位(从512byte到1MB之间).而存储系统为了保证应用程序的带宽需求,往往设计为传输512byte以上的数据块大小时才能达到其最佳I/O性能.在传统SAN结构中,当容量需求增大时,唯一的解决办法是多块磁盘(物理或逻辑的)绑定为带区集,实现大容量LUN.在对称式虚拟存储系统中,为主机提供真正的超大容量,高性能LUN,而不是用带区集方式实现的性能较差的逻辑卷.与带区集相比,Power LUN具有很多优势,如大块的I/O block会真正被存储系统所接受,有效提高数据传输速度;并且由于没有带区集的处理过程,主机CPU可以解除很大负担,提高了主机的性能.
(4)成对的HSTD系统的容错性能.
在对称式虚拟存储系统中,HSTD是数据I/O的必经之地,存储池是数据存放地.由于存储池中的数据具有容错机制保障安全,因此用户自然会想到HSTD是否有容错保护.象许多大型存储系统一样,在成熟的对称式虚拟存储系统中,HSTD是成对配制的,每对HSTD之间是通过SAN Appliance内嵌的网络管理服务实现缓存数据一致和相互通信的.
(5)在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN.
因为系统保持了标准的SAN结构,为系统的扩展和互连提供了技术保障,所以在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN.
B.非对称式虚拟存储系统
图2
图2非对称式虚拟存储系统示意图
在图2所示的非对称式虚拟存储系统结构图中,网络中的每一台主机和虚拟存储管理设备均连接到磁盘阵列,其中主机的数据路径通过FC交换设备到达磁盘阵列;虚拟存储设备对网络上连接的磁盘阵列进行虚拟化操作,将各存储阵列中的LUN虚拟为逻辑带区集(Strip),并对网络上的每一台主机指定对每一个Strip的访问权限(可写,可读,禁止访问).当主机要访问某个Strip时,首先要访问虚拟存储设备,读取Strip信息和访问权限,然后再通过交换设备访问实际的Strip中的数据.在此过程中,主机只会识别到逻辑的strip,而不会直接识别到物理硬盘.这种方案具有如下特点:
(1)将不同物理硬盘阵列中的容量进行逻辑组合,实现虚拟的带区集,将多个阵列控制器端口绑定,在一定程度上提高了系统的可用带宽.
(2)在交换机端口数量足够的情况下,可在一个网络内安装两台虚拟存储设备,实现Strip信息和访问权限的冗余.
但是该方案存在如下一些不足:
(1)该方案本质上是带区集——磁盘阵列结构,一旦带区集中的某个磁盘阵列控制器损坏,或者这个阵列到交换机路径上的铜缆,GBIC损坏,都会导致一个虚拟的LUN离线,而带区集本身是没有容错能力的,一个LUN的损坏就意味着整个Strip里面数据的丢失.
(2)由于该方案的带宽提高是通过阵列端口绑定来实现的,而普通光纤通道阵列控制器的有效带宽仅在40MB/S左右,因此要达到几百兆的带宽就意味着要调用十几台阵列,这样就会占用几十个交换机端口,在只有一两台交换机的中小型网络中,这是不可实现的.
(3)由于各种品牌,型号的磁盘阵列其性能不完全相同,如果出于虚拟化的目的将不同品牌,型号的阵列进行绑定,会带来一个问题:即数据写入或读出时各并发数据流的速度不同,这就意味着原来的数据包顺序在传输完毕后被打乱,系统需要占用时间和资源去重新进行数据包排序整理,这会严重影响系统性能.
4 数据块虚拟与虚拟文件系统
以上从拓扑结构角度分析了对称式与非对称式虚拟存储方案的异同,实际从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统.
数据块虚拟存储方案着重解决数据传输过程中的冲突和延时问题.在多交换机组成的大型Fabric结构的SAN中,由于多台主机通过多个交换机端口访问存储设备,延时和数据块冲突问题非常严重.数据块虚拟存储方案利用虚拟的多端口并行技术,为多台客户机提供了极高的带宽,最大限度上减少了延时与冲突的发生,在实际应用中,数据块虚拟存储方案以对称式拓扑结构为表现形式.
虚拟文件系统存储方案着重解决大规模网络中文件共享的安全机制问题.通过对不同的站点指定不同的访问权限,保证网络文件的安全.在实际应用中,虚拟文件系统存储方案以非对称式拓扑结构为表现形式.
虚拟存储技术和这门课的结合点
本学期的这门课中,所涉及的虚拟存储技术,实际上是虚拟存储技术的一个方面,特指以CPU时间和外存空间换取昂贵内存空间的操作系统中的资源转换技术
基本思想:程序,数据,堆栈的大小可以超过内存的大小,操作系统把程序当前使用的部分保留在内存,而把其他部分保存在磁盘上,并在需要时在内存和磁盘之间动态交换,虚拟存储器支持多道程序设计技术
目的:提高内存利用率
管理方式
A 请求式分页存储管理
在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其他页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面
B 请求式分段存储管理
为了能实现虚拟存储,段式逻辑地址空间中的程序段在运行时并不全部装入内存,而是如同请求式分页存储管理,首先调入一个或若干个程序段运行,在运行过程中调用到哪段时,就根据该段长度在内存分配一个连续的分区给它使用.若内存中没有足够大的空闲分区,则考虑进行段的紧凑或将某段或某些段淘汰出去,这种存储管理技术称为请求式分段存储管理
现在团IDC网上有45元/年美国空间的团购,便宜有口碑
6. 存储过程
sql server存储过程语法
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。
第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
第三、有利于SQL语句的重用。
在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类:
1. 只返回单一记录集的存储过程
假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
begin
select * from dbo.[userinfo]
end
go
以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP代码如下:
'**通过Command对象调用存储过程**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
MyComm.CommandText = "getUserList" '指定存储过程名
MyComm.CommandType = 4 '表明这是一个存储过程
MyComm.Prepared = true '要求将SQL命令先行编译
Set MyRst = MyComm.Execute
Set MyComm = Nothing
存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。
在以上代码中,CommandType属性表明请求的类型,取值及说明如下:
-1 表明CommandText参数的类型无法确定
1 表明CommandText是一般的命令类型
2 表明CommandText参数是一个存在的表名称
4 表明CommandText参数是一个存储过程的名称
还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下:
'**通过Connection对象调用存储过程**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.open MyConStr 'MyConStr是数据库连接字串
Set MyRst = MyConn.Execute("getUserList",0,4) '最后一个参断含义同CommandType
Set MyConn = Nothing
'**通过Recordset对象调用存储过程**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1,4
'MyConStr是数据库连接字串,最后一个参断含义与CommandType相同
2. 没有输入输出的存储过程
请看以下存储过程:
/*SP2*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
begin
delete from dbo.[userinfo]
end
go
该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集:
'**通过Command对象调用存储过程**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
MyComm.CommandText = "delUserAll" '指定存储过程名
MyComm.CommandType = 4 '表明这是一个存储过程
MyComm.Prepared = true '要求将SQL命令先行编译
MyComm.Execute '此处不必再取得记录集
Set MyComm = Nothing
当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。
3. 有返回值的存储过程
在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下:
/*SP3*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
begin
BEGIN TRANSACTION
delete from dbo.[userinfo]
IF @@error=0
begin
COMMIT TRANSACTION
return 1
end
ELSE
begin
ROLLBACK TRANSACTION
return 0
end
return
end
go
以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用Parameters集合来声明参数:
'**调用带有返回值的存储过程并取得返回值**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
MyComm.CommandText = "delUserAll" '指定存储过程名
MyComm.CommandType = 4 '表明这是一个存储过程
MyComm.Prepared = true '要求将SQL命令先行编译
'声明返回值
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
MyComm.Execute
'取得返回值
DIM retValue
retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
Set MyComm = Nothing
在MyComm.CreateParameter("RETURN",2,4)中,各参数的含义如下:
第一个参数("RETURE")为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为"RETURE";
第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码:
adBigInt: 20 ;
adBinary : 128 ;
adBoolean: 11 ;
adChar: 129 ;
adDBTimeStamp: 135 ;
adEmpty: 0 ;
adInteger: 3 ;
adSmallInt: 2 ;
adTinyInt: 16 ;
adVarChar: 200 ;
对于返回值,只能取整形,且-1到-99为保留值;
第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下:
0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值
以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
可以简化为
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
甚至还可以继续简化,稍后会做说明。
对于带参数的存储过程,只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用,但我没有试成过)。
4. 有输入参数和输出参数的存储过程
返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数----用户ID,和一个输出参数----用户名。实现这一功能的存储过程如下:
/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int,
@UserName varchar(40) output
as
set nocount on
begin
if @UserID is null return
select @UserName=username
from dbo.[userinfo]
这样可以么?
7. 存储过程和函数的区别
一、含义不同
1、存储过程:存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
2、函数:是由一个或多个 SQL 语句组成的子程序,可用于封装代码以便重新使用。函数限制比较多,如不能用临时表,只能用表变量等
二、使用条件不同
1、存储过程:可以在单个存储过程中执行一系列 SQL 语句。而且可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
2、函数:自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。
三、执行方式不同
1、存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。
2、函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。
8. 存储过程做无限级别分类删除
这是前两天给别人做过的一个例子:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tt]
GO
CREATE TABLE [dbo].[tt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[pid] [int] NULL ,
[name] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[tt] ADD
CONSTRAINT [PK_tt] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO
CREATE PROCEDURE up_del
@id int
AS
declare @cnt int,@tmpid int
select @cnt=count(1) from tt where pid=@id
if(@cnt>0)
begin
declare ar_cursor cursor local for select id from tt where pid=@id
open ar_cursor
fetch next from ar_cursor into @tmpid
while @@fetch_status = 0
begin
---------------------------------------------------------------------------------------------------------------------------------
--调用存储过程
exec up_del @tmpid
---------------------------------------------------------------------------------------------------------------------------------
fetch next from ar_cursor into @tmpid --这句一定要写,否则麻烦大了. :) 死循环
end
close ar_cursor
deallocate ar_cursor
end
delete from tt where id=@id
GO
9. 存储过程里,分类数据每个分类显示 10 行, 用 group by 能实现吗,怎么实现,
好像不形吧,或者按分类多次查询,存入到临时表中,再进行取出。
10. 存储过程的种类
1系统存储过程
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
2本地存储过程
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
3临时存储过程
分为两种存储过程:
一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
4远程存储过程
在SQL Server2005中,远程存储过程(Remote Stored Proceres)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5扩展存储过程
扩展存储过程(Extended Stored Proceres)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。