一个大一个面,C语言,求助。。

基于SQL SERVER的分布式数据库设计与实现_文库下载
1亿文档 免费下载
当前位置: &
& 基于SQL SERVER的分布式数据库设计与实现
基于SQL SERVER的分布式数据库设计与实现
基于SQL SERVER的分布式数据库设计与实现
刘竞,初文科
青岛农业大学信息科学与工程学院,山东青岛(266109)
要:提出了如何充分利用MS SQL Server 2000的数据库管理特性,采用链接服务器、分布式分区视图和存储过程构建分布式数据库,以及基于数据库复制技术实现混合式的数据分布。实验实现了分布式数据库的水平分片、垂直分片和混合式数据分布。 关键词: 分布式数据库;分布式分区视图;链接服务器;存储过程 中图分类号: TP392
随着网络与数字通信技术的飞速发展,应用的数据再也不是存储在一个单一的场地,而是可能分布在全球的任何位置。对这样由多个分散数据库组成的管理信息系统,如何以最小代价将其整合成分布式数据库系统也就成为了迫切需要解决的问题。
MS SQL Server 2000分布式数据库功能允许用户把多个不同场地的数据库当作一个完整的数据库看待,允许用户透明地查询和操作远程数据库实例的数据,并使应用程序看起来只有一个大型的集中式数据库,用户可以在任何一个场地执行全局应用,具有数据分布透明性和逻辑整体性等特点。
2. 分布式数据库系统的设计
1.创建和使用数据库链接(链接服务器)
数据库链接是定义一个从某一数据库服务器到另一数据库服务器的单向通信路径指示器。可以使用企业管理器或者T-SQL代码来建立链接服务器。链接服务器可以是SQL Server或者任何其他的OLE DB和ODBC数据源,只要相应的驱动程序支持,分布式查询就可以检索和修改相应数据源中的数据。使用创建好的链接服务器,对用户来说,数据分布就是透明的,用户就好像使用本地集中式数据库一样,同时使用链接服务器的查询代码具有更好的移植性,也更加易于维护。
2.采用分布式分区视图实现水平分片
将表分区就是将表按照分区键划分为两个或两个以上更小的分段。分区键通常选择一个经常被用来选取特定范围的数据字段,这样分区的效率最高。通过创建分区视图合并所有分区表,实现对整个数据集的访问。
SQL Server支持两种类型的分区视图:本地的和分布的。分布式分区视图,也称为联合数据库,将分区表分布在多个场地的服务器上。使用链接服务器和分布式分区视图方法可以构建以水平分片的分布式数据库系统。
3.采用存储过程实现垂直分片
SQL Server没有提供现成的技术实现垂直分片的分布式数据库系统,但可以使用链接服务器和存储过程相结合的方法,将用户提交的全局操作转变为对多个场地的垂直分片表的局部操作,使用存储过程可以保证分布式事务的ACID特性。
存储过程是存储在服务器上的预编译好的SQL语句集。使用存储过程将对多个场地的垂直分片表的操作放在一个分布式事务内,要么全部提交,要么全部回退,保证了分布式数据库系统数据的一致性。
Word文档免费下载:(下载1-5页,共5页)
Server 2000服务器注册和构建链接服务器的步骤,讨论了SQL Server 2000数据库分布存储的数据分区概念、分区设计和实现,以及分布式分区视图的创建及其在分布式查询中的...基于SQL SERVER的分布式数据库体系结构_专业资料。当今社会,网络与信息技术的发展,对数据库技术的发展提出了更高的要求。如何实现跨地域的分散数据库的统一管理与...JSP技术访问SQL Server数... 47人阅读 4页 2.00基于SQLServer的分布式教学数...一种基于SQL SERVER的分布式网络数据库体系结构_专业资料。随着网络技术的广泛...结合SQL Server而设计与实现的一种基于Web的分布式网络的数据库系统,就其中的...(Cumulatively No.120) 基于分布式数据库的病例系统设计与实现杨光祖(长沙环境...采用 SQL Server 2000 的链接服务器技术,在部门服 务器之间,互相建立链接服务...基于SQL Server2000的分布式数据库的架构_计算机软件...各 分校 区之间如何实现学生德育工 本传 输瓶颈 ...数据库 系统 的设计 分1创建和使用数据 库链 接 ...SQL Server数据库安全监控系统的设计与实现_IT/计算机_专业资料。SQL Server...同时也实现了系统的分布式结构设计,集中控制与多层管理。整个系统由检测系统、分析...分布式数据库发展趋势 分布式数据库的安全与管... 分布式数据库设计 分布式数据... 精妙的SQL语句 7页 免费 基于SQL SERVER的分布式... 5页 免费 常用SQL语句...数据 表 数据库 SQL Server 2000 数据模型 现实世界的抽象 分布式数据库系统...数据库, 接受和完成用户程序或命令提出的访问数据库 的各种请求,对共享数据实现...SQL Server数据库程序设计认证试题 1.你是一家...SQL_DMO是SQL分布式管理对象的缩写,允许用支持自动化...这个培训 中心希望通过开发一个数据库录入信息来实现...查看: 4300|回复: 4
SQL Server2005 表分区操作详解
论坛徽章:18
SQL Server2005 表分区操作详解
你是否在千方百计优化SQL Server 数据库的性能?如果你的数据库中含有大量的表格,把这些表格分区放入独立的文件组可能会让你受益匪浅。SQL Server 2005引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能。
  SQL Server数据库表分区操作过程由三个步骤组成:
  1. 创建分区函数
  2. 创建分区架构
  3. 对表进行分区
  下面将对每个步骤进行详细介绍。
  步骤一:创建一个分区函数
  此分区函数用于定义你希望SQL Server如何对数据进行分区的参数值(how)。这个操作并不涉及任何表格,只是单纯的定义了一项技术来分割数据。
  我们可以通过指定每个分区的边界条件来定义分区。例如,假定我们有一份Customers表,其中包含了关于所有客户的信息,以一一对应的客户编号(从1到1,000,000)来区分。我们将通过以下的分区函数把这个表分为四个大小相同的分区:  
CREATE PARTITION FUNCTION customer_partfunc (int)
  AS RANGE RIGHT
  FOR VALUES ()
  这些边界值定义了四个分区。第一个分区包括所有值小于250,000的数据,第二个分区包括值在250,000到49,999之间的数据。第三个分区包括值在500,000到之间的数据。所有值大于或等于750,000的数据被归入第四个分区。
  请注意,这里调用的&RANGE RIGHT&语句表明每个分区边界值是右界。类似的,如果使用&RANGE LEFT&语句,则上述第一个分区应该包括所有值小于或等于250,000的数据,第二个分区的数据值在250,001到500,000之间,以此类推。
  步骤二:创建一个分区架构
  一旦给出描述如何分割数据的分区函数,接着就要创建一个分区架构,用来定义分区位置(where)。创建过程非常直截了当,只要将分区连接到指定的文件组就行了。例如,如果有四个文件组,组名从&fg1&到&fg4&,那么以下的分区架构就能达到想要的效果:  
CREATE PARTITION SCHEME customer_partscheme
  AS PARTITION customer_partfunc
  TO (fg1, fg2, fg3, fg4)
  注意,这里将一个分区函数连接到了该分区架构,但并没有将分区架构连接到任何数据表。这就是可复用性起作用的地方了。无论有多少数据库表,我们都可以使用该分区架构(或仅仅是分区函数)。
  步骤三:对一个表进行分区
  定义好一个分区架构后,就可以着手创建一个分区表了。这是整个分区操作过程中最简单的一个步骤。只需要在表创建指令中添加一个&ON&语句,用来指定分区架构以及应用该架构的表列。因为分区架构已经识别了分区函数,所以不需要再指定分区函数了。
  例如,使用以上的分区架构创建一个客户表,可以调用以下的Transact-SQL指令:  
CREATE TABLE customers (FirstName nvarchar(40), LastName nvarchar(40), CustomerNumber int)
  ON customer_partscheme (CustomerNumber)
  关于SQL Server的表分区功能,你知道上述的相关知识就足够了。记住!编写能够用于多个表的一般的分区函数和分区架构就能够大大提高可复用性。
[此贴子已经被作者于 11:19:44编辑过]
--------------------------------------------------------------------------------
--&&作者:admin
--&&发布时间: 11:19:04
数据库性能调优是每一个优秀SQL Server管理员最终的责任。虽然保证数据的安全和可用性是我们的最高的目标,但是假如数据库应用程序无法满足用户的要求,那么DBA们会因为性能低下的设计和实现而受到指责。SQL Server 2005在数据库性能方面得到了很多提高,尤其是表分区的技术。如果你还没不了解表分区的特征,那么请你花点时间读这篇文章。
  表分区的概念不是一个新的概念;只要你当过一段时间的SQL Server DBA,那么你可能已经对一些频繁访问的表进行过归档,当这个表中的历史数据变的不再经常被访问的时候。比如,假设你有一个打印时间报表的应用,你的报告很少会查询1995年的数据,因为绝大部分的预算规划会基于最近几年的数据。
  在SQL Server的早期版本中,你可以创建多个表。每一个表都具有相同的列结构,用来保存不同年份的数据。这样,当存在着对历史数据访问的必要的时候,你可以创建一个视图来对这些表进行查询处理。将数据保存在多个表中是很方便的,因为相对于查询时扫描整个大表,扫描小表会更快。但是这种好处只有在你预先知道哪些时间段的数据会被访问。同时,一旦数据过期,你还需要创建新表并且转移新产生的历史数据。
  SQL Server 7和SQL Server 2000支持分布式分区视图(distributed partitioned views,又称为物化视图,materialized views).分布式分区视图由分布于多台服务器上的、具有相同表结构的表构成,而且你还需要为每一个服务器增加链接服务器定义(linked server definitions),最后在其中一台服务器上创建一个视图将每台服务器上返回的数据合并起来。这里的设计思想是数据库引擎可以利用多台服务器的处理能力来满足查询。
  但是,分布式分区视图(DPV)受到很多限制,你可以在SQL Server的在线帮助文档中阅读到。虽然DPV在一些情况下能够提供性能上的提高,但是这种技术不能被广泛的应用。已经被证明它们不能满足逐步增长的企业级应用的要求。何况,DPV的实现是一个费力的过程,需要DBA进行很多工作。
  SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上。每一个表分区都和在某个文件组(filegroup)中的单个文件关联。同样的一个文件/文件组可以容纳多个分区表。
  在这种设计架构下,数据库引擎能够判定查询过程中应该访问哪个分区,而不用扫描整个表。如果查询需要的数据行分散在多个分区中,SQL Server使用多个处理器对多个分区进行并行查询。你可以为在创建表的时候就定义分区的索引。 对小索引的搜索或者扫描要比扫描整个表或者一张大表上的索引要快很多。因此,当对大表进行查询,表分区可以产生相当大的性能提升。
  现在让我们通过一个简单的例子来了解表分区是如何发挥作用的。在这篇文章中,我不想深入到分区的语法细节当中,这些你可以在SQL Server的在线帮助文档中找到。下面的例子基于存储着一个时间报表系统的数据的数据仓库。除了默认的文件组,我另外创建了7个文件组,每一个文件组仅包含一个文件,这个文件将存储由分区函数定义的一部分数据。
  为了测试表分区的性能提升,我向这个分区表中插入了一千五百万行,同时向另外一个具有相同表结构、但是没有进行分区的表插入了同样的数据。对分区表执行的INSERT语句运行的更快一些。甚至在我的内存不到1G的笔记本电脑上,对分区表的INSERT语句比不分区的表的INSERT语句要快上三倍。当然,查询的执行时间依据硬件资源的差异而所有变化,但是你还是能够在你的环境中感到不同程度的提升。
  我将检查更深入了一步,通过分别检查同一条返回所有行的、简单SELECT语句在分区表和非分区表上的执行计划,返回的数据范围通过WHERE语句来指定。同一条语句在这两个不同的表上有不同的执行计划。对于分区表的查询显示出一个嵌套的循环和索引的扫描。从本质上来说,SQL Server将两个分区视为独立的表,因此使用一个嵌套循环将它们连接起来。对非分区的表的同一个查询则使用索引扫描来返回同样的列。当你使用同样的分区策略创建多个表,同时在查询中连接这些表,那么性能上的提升会更加明显
你可以使用下面的查询来了解每一个分区中的行的个数:
  SELECT $PARTITION.TimeEntryDateRangePFN(time_entry_date) AS Partition,
  COUNT(*) AS [COUNT] FROM fact_time_entry
  GROUP BY $PARTITION.TimeEntryDateRangePFN(time_entry_date)
  ORDER BY Partition
  表分区对交易环境和数据仓库环境来说,都是一个重要的特征。数据仓库用户最主要的抱怨是移动事实表(fact table)会花费太多时间。当装载数据到事实表的时候,用户查询(立方体处理查询)的性能会明显下降,甚至是完全无法成功。因此,装载大量的数据到事实表的时候常常需要停机。如果使用表分区,就不再出现这样的情况——确切的讲,你一眨眼的工夫就可以移动事实表。为了演示这是如何生效的,我使用上面例子中相同的分区函数和表结构来创建一个新的表,这个表叫做fact_time_entry2。表的主键从五千万开始,这样fact_time_entry2就不会包含表fact_time_entry中已经有的数据。
  现在我把2007年的数据移动到这张fact_time_entry2中。同时让我们假设fact_time_entry表中包含着2007年之前的数据。在fact_time_entry2表完成数据的转移,我执行下面的语句:
  ALTER TABLE fact_time_entry2
  SWITCH PARTITION 8 TO fact_time_entry PARTITION 8
  这条语句将编号为8的分区,这个分区恰好包含着2007年的数据,从fact_time_entry2移动到了fact_time_entry表中,在我的笔记本电脑上,这个过程只花费了3毫秒。在这短短的3毫秒中,我的事实表就增加了五百万条记录!的确,我需要在交换分区之前,将数据移动到中间表,但是我的用户不需要担心——事实表随时都可以查询!在这幕后,实际上没有数据移动——只是两张表的元数据发生了变化。
  我可以使用类似的查询删除事实表中不在需要的数据。例如,假设我们决定我们不再关心2004年的记录。下面的语句可以将这些记录转移到我们创建的工作表中:
  ALTER TABLE fact_time_entry
  SWITCH PARTITION 2 TO fact_time_entry2 PARTITION 2
  这样的语句依旧在毫秒级内完成了。现在,我可以删除fact_time_entry2或者将它移到其他的服务器上。我的事实表不会包含2004年的任何记录。这个分区还是需要在目的表中存在,而且它必须是空的。你不能将分区转移到一个包含重复数据的表中。源表和目的表的分区必须一致,同时被转移的数据必须在同一个文件组中。即使受到这么多的限制,转换分区和无需停机就可以移动数据表的功能必将让数据仓库的实现变的前所未有的轻松。
--------------------------------------------------------------------------------
--&&作者:admin
--&&发布时间: 11:20:05
SQL Server 表分区(partitioned table/Data Partitioning)
  Partitioned Table
  可伸缩性性是数据库管理系统的一个很重要的方面,在SQL Server 2005中可伸缩性方面提供了表分区功能。
  其实对于有关系弄数据库产品来说,对表、数据库和服务器进行数据分区的从而提供大数据量的支持并不是什么新鲜事,但 SQL Server 2005 提供了一个新的体系结构功能,用于对数据库中的文件组进行表分区。水平分区可根据分区架构,将一个表划分为几个较小的分组。表分区功能是针对超大型数据库(从数百吉字节到数千吉字节或更大)而设计的。超大型数据库 (VLDB) 查询性能通过分区得到了改善。通过对广大分区列值进行分区,可以对数据的子集进行管理,并将其快速、高效地重新分配给其他表。
  设想一个大致的电子交易网站,有一个表存储了此网站的历史交易数据,这此数据量可能有上亿条,在以前的SQL Server版本中存储在一个表中不管对于查询性能还是维护都是件麻烦事,下面我们来看一下在SQL Server2005怎么提高性能和可管理性:
  -- 创建要使用的测试数据库,Demo
  USE [master]
  IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N\'DEMO\')
  DROP DATABASE [DEMO]
  CREATE DATABASE [DEMO]
  --由于表分区使用使用新的体系结构,使用文件组来进行表分区,所以我们创建将要用到的6个文件组,来存储6个时间段的交易数据[&2000],[ 2001], [2002], [2003], [2004], [&2005]
  ALTER DATABASE Demo ADD FILEGROUP YEARFG1;
  ALTER DATABASE Demo ADD FILEGROUP YEARFG2;
  ALTER DATABASE Demo ADD FILEGROUP YEARFG3;
  ALTER DATABASE Demo ADD FILEGROUP YEARFG4;
  ALTER DATABASE Demo ADD FILEGROUP YEARFG5;
  ALTER DATABASE Demo ADD FILEGROUP YEARFG6;
  -- 下面为这些文件组添加文件来进行物理的数据存储
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF1\', FILENAME = \'C:\\ADVWORKSF1.NDF\') TO FILEGROUP YEARFG1;
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF2\', FILENAME = \'C:\\ADVWORKSF2.NDF\') TO FILEGROUP YEARFG2;
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF3\', FILENAME = \'C:\\ADVWORKSF3.NDF\') TO FILEGROUP YEARFG3;
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF4\', FILENAME = \'C:\\ADVWORKSF4.NDF\') TO FILEGROUP YEARFG4;
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF5\', FILENAME = \'C:\\ADVWORKSF5.NDF\') TO FILEGROUP YEARFG5;
  ALTER DATABASE Demo ADD FILE (NAME = \'YEARF6\', FILENAME = \'C:\\ADVWORKSF6.NDF\') TO FILEGROUP YEARFG6;
  -- HERE WE ASSOCIATE THE PARTITION FUNCTION TO
  -- THE CREATED FILEGROUP VIA A PARTITIONING SCHEME
  USE DEMO;
  -------------------------------------------------------
  -- 创建分区函数
  -------------------------------------------------------
  CREATE PARTITION FUNCTION YEARPF(datetime)
  RANGE LEFT FOR VALUES (\'01/01/2000\'
   ,\'01/01/2001\'
   ,\'01/01/2002\'
   ,\'01/01/2003\'
   ,\'01/01/2004\')
  -------------------------------------------------------
  -- 创建分区架构
  -------------------------------------------------------
  CREATE PARTITION SCHEME YEARPS
  AS PARTITION YEARPF TO (YEARFG1, YEARFG2,YEARFG3,YEARFG4,YEARFG5,YEARFG6)
  -- 创建使用此Schema的表
  CREATE TABLE PARTITIONEDORDERS
  ID INT NOT NULL IDENTITY(1,1),
  DUEDATE DATETIME NOT NULL,
  ) ON YEARPS(DUEDATE)
  --为此表填充数据
  declare @DT datetime
  SELECT @DT = \'\'
  --start looping, stop at ending date
  WHILE (@DT &= \'\')
   INSERT INTO PARTITIONEDORDERS VALUES(@DT)
   SET @DT=dateadd(yy,1,@DT)
  -- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition
  SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
  --我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布
  SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID(\'PARTITIONEDORDERS\')
  --现在我们设想一下,如果我们随着时间的流逝,现在已经到了2005年,按照我们先前的设定,我们想再想入一个分区,这时是不是重新创建表分区架构然后重新把数据导放到新的分区架构呢,答案是完全不用。下面我们就看如果新加一个分区。
  --更改分区架构定义语言,让下一个分区使用和现在已经存在的分区YEARFG6分区中,这样此分区就存储了两段partition的数据。
  ALTER PARTITION SCHEME YEARPS
  NEXT USED YEARFG6;
  --更改分区函数
  ALTER PARTITION FUNCTION YEARPF()
  SPLIT RANGE (\'01/01/2005\')
  --现在我们可以看一下我们刚才插入的行都分布在哪个Partition?
  SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
  --我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布
  SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID(\'PARTITIONEDORDERS\')
SQL Server 表分区(partitioned table/Data Partitioning) Partitioned Table 可伸缩性性是数据库管理系统的一个很重要的方面,在SQL Server 2005中可伸缩性方面提供了表分区功能。 其实对于有关系弄数据库产品来说,对表、数据库和服务器进行数据分区的从而提供大数据量的支持并不是什么新鲜事,但 SQL Server 2005 提供了一个新的体系结构功能,用于对数据库中的文件组进行表分区。水平分区可根据分区架构,将一个表划分为几个较小的分组。表分区功能是针对超大型数据库(从数百吉字节到数千吉字节或更大)而设计的。超大型数据库 (VLDB) 查询性能通过分区得到了改善。通过对广大分区列值进行分区,可以对数据的子集进行管理,并将其快速、高效地重新分配给其他表。 设想一个大致的电子交易网站,有一个表存储了此网站的历史交易数据,这此数据量可能有上亿条,在以前的SQL Server版本中存储在一个表中不管对于查询性能还是维护都是件麻烦事,下面我们来看一下在SQL Server2005怎么提高性能和可管理性: -- 创建要使用的测试数据库,Demo USE [master] IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N\'DEMO\') DROP DATABASE [DEMO] CREATE DATABASE [DEMO] --由于表分区使用使用新的体系结构,使用文件组来进行表分区,所以我们创建将要用到的6个文件组,来存储6个时间段的交易数据[&2000],[ 2001], [2002], [2003], [2004], [&2005] ALTER DATABASE Demo ADD FILEGROUP YEARFG1; ALTER DATABASE Demo ADD FILEGROUP YEARFG2; ALTER DATABASE Demo ADD FILEGROUP YEARFG3; ALTER DATABASE Demo ADD FILEGROUP YEARFG4; ALTER DATABASE Demo ADD FILEGROUP YEARFG5; ALTER DATABASE Demo ADD FILEGROUP YEARFG6; -- 下面为这些文件组添加文件来进行物理的数据存储 ALTER DATABASE Demo ADD FILE (NAME = \'YEARF1\', FILENAME = \'C:\\ADVWORKSF1.NDF\') TO FILEGROUP YEARFG1; ALTER DATABASE Demo ADD FILE (NAME = \'YEARF2\', FILENAME = \'C:\\ADVWORKSF2.NDF\') TO FILEGROUP YEARFG2; ALTER DATABASE Demo ADD FILE (NAME = \'YEARF3\', FILENAME = \'C:\\ADVWORKSF3.NDF\') TO FILEGROUP YEARFG3; ALTER DATABASE Demo ADD FILE (NAME = \'YEARF4\', FILENAME = \'C:\\ADVWORKSF4.NDF\') TO FILEGROUP YEARFG4; ALTER DATABASE Demo ADD FILE (NAME = \'YEARF5\', FILENAME = \'C:\\ADVWORKSF5.NDF\') TO FILEGROUP YEARFG5; ALTER DATABASE Demo ADD FILE (NAME = \'YEARF6\', FILENAME = \'C:\\ADVWORKSF6.NDF\') TO FILEGROUP YEARFG6; -- HERE WE ASSOCIATE THE PARTITION FUNCTION TO -- THE CREATED FILEGROUP VIA A PARTITIONING SCHEME USE DEMO; GO ------------------------------------------------------- -- 创建分区函数 ------------------------------------------------------- CREATE PARTITION FUNCTION YEARPF(datetime) AS RANGE LEFT FOR VALUES (\'01/01/2000\' ,\'01/01/2001\' ,\'01/01/2002\' ,\'01/01/2003\' ,\'01/01/2004\') ------------------------------------------------------- -- 创建分区架构 ------------------------------------------------------- CREATE PARTITION SCHEME YEARPS AS PARTITION YEARPF TO (YEARFG1, YEARFG2,YEARFG3,YEARFG4,YEARFG5,YEARFG6) -- 创建使用此Schema的表 CREATE TABLE PARTITIONEDORDERS ( ID INT NOT NULL IDENTITY(1,1), DUEDATE DATETIME NOT NULL, ) ON YEARPS(DUEDATE) --为此表填充数据 declare @DT datetime SELECT @DT = \'\' --start looping, stop at ending date WHILE (@DT &= \'\') BEGIN INSERT INTO PARTITIONEDORDERS VALUES(@DT) SET @DT=dateadd(yy,1,@DT) END -- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS --我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布 SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID(\'PARTITIONEDORDERS\') -- --现在我们设想一下,如果我们随着时间的流逝,现在已经到了2005年,按照我们先前的设定,我们想再想入一个分区,这时是不是重新创建表分区架构然后重新把数据导放到新的分区架构呢,答案是完全不用。下面我们就看如果新加一个分区。 --更改分区架构定义语言,让下一个分区使用和现在已经存在的分区YEARFG6分区中,这样此分区就存储了两段partition的数据。 ALTER PARTITION SCHEME YEARPS NEXT USED YEARFG6; --更改分区函数 ALTER PARTITION FUNCTION YEARPF() SPLIT RANGE (\'01/01/2005\') --现在我们可以看一下我们刚才插入的行都分布在哪个Partition? SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS --我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布 SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID(\'PARTITIONEDORDERS\')
--------------------------------------------------------------------------------
--&&作者:evv
--&&发布时间: 12:59:42
有点复杂.有时间再研究下...顶起.
--------------------------------------------------------------------------------
--&&作者:admin
--&&发布时间: 15:21:05
这就是对数据库的横向分割,把一个大表表分割成不同的小表,并把小表并分步到不同的物理文件(由不同的物理磁盘构成)组上。这是做海量数据查询的基础理论,sql2000以前不支持这个技术,不过有个分区视图有类似的功能。但是sql2005直接有这个功能,我想ax应该很快会支持这个功能。
&&其实,googl的查询原理也是这样的,它把每次查询同时提交给googl的50万台服务器,每个服务器上只保留了不多的信息,这个每个服务器能很快的返回自己找到的数据,并提供给集群服务器整理排序后显示给用户。理论上讲,若有经济条件,把数据分割成无限多个节点,这样每个节点查询自己的数据时的速度几乎是不耗时的,这样速度就会大大的加快。
论坛徽章:18
Msg 7736, Level 16, State 1, Line 1
Partition function can only be created in Enterprise edition of SQL Server. Only Enterprise edition of SQL Server supports partitioning.
论坛徽章:18
sql7 sql2000使用分布式视图 (物化视图)&&也是oracle的数据仓库经常用到的
2005之后拥有自己的大表分区
论坛徽章:18
oracle最近在做一个客户关系管理系统,项目做的到不是非常成功,可还是学到了不少的知识,由于数据量很大,没有专门的oracle数据库人员支持,对数据库优化管理等也只有我这个约懂一点的人上了。在对数据库优化上有一点点心得写出来希望能同大家一起学习和交流。
  数据库大表的优化:采用蔟表(clustered tables)及蔟索引(Clustered Index)
  蔟表和蔟索引是oracle所提供的一种技术,其基本思想是将几张具有相同数据项、并且经常性一起使用的表通过共享数据块(data block)的模式存放在一起。各表间的共同字段作为蔟键值(cluster key),数据库在访问数据时,首先找到蔟键值,以此同时获得若干张表的相关数据。蔟表所能带来的好处是可以减少I/O和减少存储空间,其中我更看重前者。采用表分区(partition)
  表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。而这种分区对于应用来说是透明的。通过对表进行分区,可以获得以下的好处:
  1)减少数据损坏的可能性。
  2)各分区可以独立备份和恢复,增强了数据库的可管理性。
  3)可以控制分区在硬盘上的分布,以均衡IO,改善了数据库的性能。
  蔟表与表分区技术的侧重点各有不同,前者侧重于改进关联表间查询的效率,而表分区侧重于大表的可管理性及局部查询的性能。而这两项对于我的系统来说都是极为重要。由于本人技术限制,目前尚不确定两者是否可以同时实现,有那位在这方面有经验的给点指导将不胜感激。
  在两者无法同时实现的情况下,应依照需实现的功能有所取舍。综合两种模式的优缺点,我认为采用表分区技术较为适用于我们的应用。
  Oracle的表分区有以下几种类型:
  1)范围分区:将表按某一字段或若干个字段的取值范围分区。
  2)hash分区:将表按某一字段的值均匀地分布到若干个指定的分区。
  3)复合分区:结合了前面两种分区类型的优点,首先通过值范围将表进行分区,然后以hash模式将数据进一步均匀分配至物理存储位置。
  综合考虑各项因素,以第三种类型最为优越。(本人实在技术有限仅采用了第1种范围分区,因为比较简单,便于管理)
  优化的具体步骤:
  1.确定需要优化分区的表:
  经过对系统数据库表结构和字段,应用程序的分析,现在确定那些大表需要进行分区:
  如帐户交易明细表acct_detail.
  2.确定表分区的方法和分区键:
  分区类型:采用范围分区。
  分 区 键:
  按trans_date(交易时间)字段进行范围分区.
  3.确定分区键的分区范围,及打算分多少分区:
  如:帐户交易明细表acct_detail.
  根据字段(trans_date)分成一下分区:
  1).分区1:09/01/2003
  2).分区2:10/01/2003
  3).分区3:11/01/2003
  4).分区4:12/01/2003
  5).分区5:01/01/2004
  6).分区6:02/01/2004
  该表明显需要在以后增加分区。
  4.建立分区表空间和分区索引空间
  1).建立表的各个分区的表空间:
  1.分区1:crm_detail_200309
  CREATE TABLESPACE crm_detail_200309 DATAFILE
  ‘/u1/oradata/orcl/crm_detail_.dbf’
  SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
  其它月份以后同以上(我在此采用oracle的表空间本地管理的方法)。
  2). 建立分区索引表空间
  1.分区1:index_detail_200309
  CREATE TABLESPACE index_detail_200309 DATAFILE
  ‘/u3/oradata/orcl/index_detail_.dbf’
  SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
  5.建立基于分区的表:
  create table table name
  ........
  enable row movment --此语句是能修改行分区键值,也就是如不添加该 句不能修改记录的分区键值,不能使记录分区迁移
  PARTITION BY RANGE (TRANS_DATE)
  PARTITION crm_detail_200309 VALUES LESS THAN
  (TO_DATE (‘09/01/2003’,’mm/dd/yyyy’
  TABLESPACE crm_detail_200309,
  其他分区.....
  6.建立基于分区的索引:
  create index index_name on table_name (分区键+…)
  global --这里是全局分区索引,也可以建本地索引
  PARTITION BY RANGE (TRANS_DATE)
  PARTITION index_detail_200309 VALUES LESS THAN
  (TO_DATE ('09/01/2003','mm/dd/yyyy' )
  TABLESPACE index_detail_200309,
  其他索引分区...
  对表的分区就这样完成了,第一次主要确定表分区的分区策约是最重要的,可我觉得对表分区难在以后对表分区的管理上面,因为随着数据量的增加,表分区必然存在删除,扩容,增加等。在这些过程中还牵涉到全局等索引,因为对分区表进行ddl操作为破坏全局索引,故全局索引必须在ddl后要重 rebuild.
  以上写的很乱也很差,希望大家多多谅解和指点。
论坛徽章:18
create&&table&&tb_data_history(
id& && && &&&number(10)& &&&not null,
stationid& & number(10)& &&&not null,
deviceid& &&&number(10)& &&&not null,
value& && &&&number& && && &not null,
time& && && &date& && && &&&not null
)pctused 60 pctfree 10&&
partition& &by&&range(time)
(partition&&part_1& &values&&less&&than&&(to_date('01-06-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history01,
partition&&part_2& &values&&less&&than&&(to_date('01-07-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history02,
partition&&part_3& &values&&less&&than&&(to_date('01-08-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history03,
partition&&part_4& &values&&less&&than&&(to_date('01-09-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history04,
partition&&part_5& &values&&less&&than&&(to_date('01-10-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history05,
partition&&part_6& &values&&less&&than&&(to_date('01-11-2004','dd-mm-yyyy'))&&tablespace&&tb_data_history06);
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号

我要回帖

更多关于 好大一个家 电视剧 的文章

 

随机推荐