sql server需要存储1000万条数据该怎么办?

公司一个大型业务体统,数据量庞大,主要的几项数据每项数据量均超过1000万条记录。采用的是sqlserver,小弟琢磨了很久,一直找不到一种可以高效率存储和处理数据的好方法,各位高手有何高见和经验请指点迷津!不胜感激!(每日活动数据量也会上百万) 根据在Oracle上的应用经验,通常在一张表中保存超过2,000,000条以上记录,则应当考虑对数据表进行分区。如果要使用SQL Server;可以对数据按月进行水平分区,即一个月一张表,对于历史数据可以移出当前数据库磁盘系统到磁带、光盘等介质保存。当然,使用和维护起来会有一定的麻烦;关于数据存储以及I/O方面的建议,楼上已经作的简单说明。

   我的经验,以前我在处理每天证券交易行情数据时候,是每天让JOB自己建立一个表,每个表存放当天的数据。每天数据量也是几百万的数据,没有出什么问题。 最大数据量的数据库记录是sqlserver保持的,这点数据量没问题的,我曾比较过sqlserver和oracle ,两亿五千多万吧,查询速度都差不多,缺点:sqlserver在维护索引、建立自动增一的列方面比oracle要差, oracle可以利用分区表简化对索引的维护,也提高了查询速度, sqlserver 建立索引也可以,但只能对全表的索引进行整理,比较费劲还有我在sqlserver上建立identity的时候,没成功,说异常了,机器性能很好的,哎~~~做些实验吧粗知拙见,大家讨论讨论

      1.避免IO冲突 a.多文件组 b.分开存放数据文件(mdf/ndf)和日志文件(ldf) c.有条件采用raid5

      2.数据库优化 a.适当优化表结构 b.大表建立合理索引包括(索引/分区)视图、 c.经常做DB备份 在一定条件下设置DB模式为简单(如果是生产服务器又不行:( ) d.日志文件和数据文件大小应指派一个默认值否则频繁增长影响性能 有条件分开存放

     3.硬件优化内存、处理器等等 ..大家补充 分区将数据库分区可提高其性能并易于维护。通过将一个大表拆分成更小的单个表,只访问一小部分数据的查询可以执行得更快,因为需要扫描的数据较少。而且可以更快地执行维护任务(如重建索引或备份表)。 实现分区操作时可以不拆分表,而将表物理地放置在个别的磁盘驱动器上。例如,将表放在某个物理驱动器上并将相关的表放在与之分离的驱动器上可提高查询性能,因为当执行涉及表之间联接的查询时,多个磁头同时读取数据。可以使用 Microsoft® SQL Server™ 2000 文件组指定将表放置在哪些磁盘上。

     硬件分区硬件分区将数据库设计为利用可用的硬件构架。硬件分区的示例包括: 允许多线程执行的多处理器,使得可以同时执行许多查询。换句话说,在多处理器上可以同时执行查询的各个组件,因此使单个查询的速度更快。例如,查询内引用的每个表可同时由不同的线程扫描。 RAID(独立磁盘冗余阵列)设备允许数据在多个磁盘驱动器中条带化,使更多的读/写磁头同时读取数据,因此可以更快地访问数据。在多个驱动器中条带化的表一般比存储在一个驱动器上的相同的表扫描速度要快。换句话说,将表与相关的表分开存储在不同的驱动器上可以显着提高联接那些表的查询的性能。 水平分区水平分区将一个表分段为多个表,每个表包含相同数目的列和较少的行。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表代表特定年份内一个月的数据。任何需要特定月份数据的查询只引用相应月份的表。 具体如何将表进行水平分区取决于如何分析数据。

       将表进行分区是为了使查询引用尽可能少的表。否则,查询时须使用过多的 UNION 查询来逻辑合并表,而这会削弱查询性能。有关查询水平分区的表的更多信息,请参见视图使用方案。 常用的方法是根据时期/使用对数据进行水平分区。例如,一个表可能包含最近五年的数据,但是只定期访问本年度的数据。在这种情况下,可考虑将数据分区成五个表,每个表只包含一年的数据。 垂直分区垂直分区将一个表分段为多个表,每个表包含较少的列。垂直分区的两种类型是规范化和行拆分。

      规范化是个标准数据库进程,该进程从表中删除冗余列并将其放到次表中,次表按主键与外键的关系链接到主表。 行拆分将原始表垂直分成多个只包含较少列的表。拆分的表内的每个逻辑行与其它表内的相同逻辑行匹配。例如,联接每个拆分的表内的第十行将重新创建原始行。 与水平分区一样,垂直分区使查询得以扫描较少的数据,因此提高查询性能。

     例如有一个包含七列的表,通常只引用该表的前四列,那么将该表的后三列拆分到一个单独的表中可获得性能收益。 应谨慎考虑垂直分区操作,因为分析多个分区内的数据需要有联接表的查询,而如果分区非常大将可能影响性能。 请参见 使用分区视图 使用分区视图分区视图允许将大型表中的数据拆分成较小的成员表。根据其中一列中的数据值范围,将数据在各个成员表之间进行分区。每个成员表的数据范围都在为分区列指定的 CHECK 约束中定义。

     然后定义一个视图,以使用 UNION ALL 将选定的成员表组合成单个结果集。引用该视图的 SELECT 语句为分区列指定搜索条件后,查询优化器将使用 CHECK 约束定义确定哪个成员表包含这些行。 例如,记录 1998 年销售额的 sales 表分区成 12 个成员表,每个月是一个成员表。每个成员表在 OrderMonth 列上都定义了约束: CREATE TABLE May1998Sales (OrderID INT PRIMARY KEY, CustomerID INT NOT NULL, OrderDate DATETIME NULL CHECK (DATEPART(yy, OrderDate) = 1998), OrderMonth INT CHECK (OrderMonth = 5), DeliveryDate DATETIME NULL, CHECK (DATEPART(mm, OrderDate) = OrderMonth) ) 填充 May1998Sales 的应用程序必须确保所有行在 OrderMonth 列中均为 5,并且订购日期指定 1998 年 5 月的某个日期。该表上定义的约束强制实现这一要求。 然后定义一个视图,以使用 UNION ALL 选定全部 12 个成员表中的数据作为单个结果集: CREATE VIEW Year1998Sales AS SELECT * FROM Jan1998Sales UNION ALL SELECT * FROM Feb1998Sales UNION ALL SELECT * FROM Mar1998Sales UNION ALL SELECT * FROM Apr1998Sales UNION ALL SELECT * FROM May1998Sales UNION ALL SELECT * FROM Jun1998Sales UNION ALL SELECT * FROM Jul1998Sales UNION ALL SELECT * FROM Aug1998Sales UNION ALL SELECT * FROM Sep1998Sales UNION ALL SELECT * FROM Oct1998Sales UNION ALL SELECT * FROM Nov1998Sales UNION ALL SELECT * FROM Dec1998Sales 例如,下面的 SELECT 语句查询特定月的信息。 SELECT * FROM Year1998Sales WHERE OrderMonth IN (5,6) AND CustomerID = 64892 SQL Server 查询优化器识别出此 SELECT 语句中的搜索条件只引用 May1998Sales 和 Jun1998Sales 表中的行,从而将其搜索范围限制在这些表上。

       分区视图返回正确的结果并不一定非要 CHECK 约束。但是,如果未定义 CHECK 约束,则查询优化器必须搜索所有表,而不是只搜索符合分区列上的搜索条件的表。如果不使用 CHECK 约束,则视图的操作方式与带有 UNION ALL 的任何其它视图相同。查询优化器不能对存储在不同表中的值作出任何假设,也不能跳过对参与视图定义的表的搜索。 如果分区视图所引用的所有成员表都在同一服务器上,则该视图是本地分区视图。如果成员表在多台服务器上,则该视图是分布式分区视图。分布式分区视图可用于在一组服务器间分布系统的数据库处理工作量。 分区视图使独立地维护成员表变得更容易。例如,在某个阶段结束时: 可以更改当前结果的分区视图定义以添加最新的阶段和除去最早的阶段。 可以更改以前结果的分区视图定义以添加刚从当前结果视图中除去的阶段。

      也可以更新以前的结果视图以删除或存档该视图所包含的最早阶段。 将数据插入到分区视图中后,就可以使用 sp_executesql 系统存储过程创建 INSERT 语句,该语句带有在有许多并发用户的系统中重新使用几率较高的执行计划。 创建分区视图分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。Microsoft® SQL Server™ 2000 区分本地分区视图和分布式分区视图。在本地分区视图中,所有的参与表和视图驻留在同一个 SQL Server 实例上。在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。此外,SQL Server 2000 还区分可更新的分区视图和作为基础表只读复本的视图。

      分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,请参见设计联合数据库服务器。 在实现分区视图之前,必须先水平分区表。原始表被分成若干个较小的成员表。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。 成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值。每一成员表中的值范围通过分区列上的 CHECK 约束强制,并且范围之间不能重叠。例如,不能使一个表的值范围从 1 到 200000,而另一个表的值范围从 150000 到 300000,因为这样将不清楚哪个表包含 150000 与 200000 之间的值。 例如,正在将一个 Customer 表分区成三个表。这些表的 CHECK 约束为: -- On Server1: CREATE TABLE Customer_33 …………

 

本文摘自于凌晓web部落