当前数据库数据量比较大,有些表每个月几乎有100万的数据量;这给数据库带来的压力是不堪设想的,而且查询数据乃至报表的速度特慢,甚至发生死锁;想请教高手有没处理过这方面的问题?或者有数据转移或建立历史数据库的好方法?在线等待!

解决方案 »

  1.   

    硬件方法1:使用RAID技术
    RAID(独立磁盘冗余阵列)是包含多个磁盘驱动器的磁盘系统(称为阵列),可提供更高的性能、可靠性、存储容量和更低的成本。容错阵列分为六个 RAID 级别,从 0 到 5。每个级别使用不同的算法实现容错。
    虽然 RAID 不是 SQL Server 的一部分,但它的实现直接影响 SQL Server 的执行方式。SQL Server 一般使用 RAID 级别 0、1 和 5。
     注意: RAID 仅适用于 Microsoft Windows 2000 及更高版本。 
    硬件磁盘阵列可以提高 I/O 性能,因为可以在固件内高效地处理 I/O 功能,例如条带化和镜像。相反,基于操作系统的 RAID 提供较低的成本,但要使用较长的处理器周期。当成本是考虑因素之一且需要冗余和高性能时,RAID-5 卷是不错的解决方案。
    数据条带化 (RAID 0) 是具有最佳性能的 RAID 配置,但是如果一个磁盘出现故障,条带集上的所有数据都将不可访问。关系数据库管理系统的常见安装方法是在 RAID 0 驱动器上配置数据库,而将事务日志放在镜像驱动器 (RAID 1) 上通过镜像事务日志,可以为数据库获得最佳的磁盘 I/O 性能并维护数据的可恢复性(假定执行定期数据库备份)。
    如果必须快速恢复数据,可以考虑镜像事务日志并将数据库放在 RAID 5 磁盘上。RAID 5 提供了阵列中所有数据的冗余。这允许单个磁盘出现故障,并允许在除系统关闭之外的大部分时间内替换出现故障的磁盘。与 RAID 0 或 RAID 1 相比,RAID 5 提供的性能较差,但可以提供更好的可靠性和更快的恢复。
    在基于硬件的解决方案中,通常都实现 RAID(独立磁盘冗余阵列)等级 0、1、3 和 5。
    基于硬件的 RAID 使用智能驱动器控制器和冗余磁盘驱动器阵列来帮助保护数据不在媒体发生故障时丢失并提高读操作和写操作的性能。对于运行 SQL Server 2005 的计算机,磁盘阵列是有效的磁盘存储解决方案。
    基于硬件的 RAID 等级 1 到 5 自动实现硬件级的冗余和容错。所有等级(0 到 5)在系统处理器上都没有开销。各数据文件一般都分布在一个以上的磁盘中。可以实现基于硬件的 RAID 解决方案来为系统提供无缝的、不间断的媒体故障恢复能力。
    通常,基于硬件的 RAID 所提供的性能优于基于 Microsoft Windows® 2000 或更高版本软件的 RAID 提供的性能。例如,通过基于不使用系统软件资源的硬件实现 RAID 5,可以显著提高数据吞吐量。通过使用比传统存储解决方案更多的特定容量的磁盘可以实现这一目的。使用多个控制器可以进一步提高读写性能和总存储大小。
    基于硬件的 RAID 通常提供较好的性能,具体取决于配置情况。它还使管理多个磁盘变得更加容易。这使您可以将一个磁盘阵列视为一个磁盘。甚至能够在不关闭系统的情况下替换发生故障的驱动器。基于硬件的解决方案的缺点是开销较大。它还可能将您限制于某一个供应商。
    分区   发送反馈  请参阅  全部折叠全部展开数据库(数据库引擎) > 优化数据库 > 关于基于硬件的解决方案 > 
    将数据库分区可提高其性能并易于维护。通过将一个大表拆分成更小的单个的表,只访问小部分数据的查询可以执行得更快,因为需要扫描的数据少了。维护任务(例如,重新生成索引或备份表)也可以更快地运行。
    可以通过不拆分表、而是将表放置在不同的磁盘驱动器上的方法来实现分区。例如,将表放在某个物理驱动器上并将相关的表放在不同的驱动器上可以提高查询性能,因为在运行涉及表间联接的查询时,多个磁头可以同时读取数据。可以使用 SQL Server 文件组来指定放置表的磁盘。
     硬件分区
    硬件分区将数据库设计为利用可用的硬件体系结构。以下是硬件分区示例: 
    • 可以执行多线程操作的多处理器,使得可以同时运行许多查询。换句话说,在多处理器上可以同时运行查询的各个组件,因此使单个查询的速度更快。例如,查询内引用的每个表可以同时由不同的线程扫描。
    • RAID(独立磁盘冗余阵列)设备使得数据在多个磁盘驱动器中条带化,使更多的读写磁头同时读取数据,因此可以更快地访问数据。在多个驱动器中条带化的表通常比存储在单个驱动器上的相同的表扫描速度要快。换句话说,将表与相关的表分开存储在不同的驱动器上可以显著提高联接那些表的查询的性能。有关详细信息,请参阅 RAID。
     水平分区
    水平分区将表分为多个表。这样,每个表包含的列数相同,但是行更少。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。
    具体如何将表进行水平分区取决于如何分析数据。您应将表进行分区,以便查询引用的表尽可能少。否则,查询时需要使用过多的 UNION 查询来逻辑合并表,这会影响查询性能。有关查询水平分区的表的详细信息,请参阅使用视图的情况。
    常用的方法是根据时期和使用对数据进行水平分区。例如,一个表可能包含最近五年的数据,但是只定期访问本年度的数据。在这种情况下,可考虑将数据分区成五个表,每个表只包含一年的数据。
    有关详细信息,请参阅已分区表和已分区索引。
     垂直分区
    垂直分区将一个表分为多个表,每个表包含较少的列。垂直分区的两种类型是规范化和行拆分。
    规范化是标准的数据库进程,该进程从表中删除冗余列并将其放到辅助表中,辅助表按主键与外键的关系链接到主表。
    行拆分将原始表垂直分成多个只包含较少列的表。拆分的表内的每个逻辑行与其他表内的相同逻辑行匹配。例如,联接每个拆分的表内的第十行将重新创建原始行。
    与水平分区一样,垂直分区使得查询需要扫描的数据变少了。这将提高查询性能。例如,某个表包含七列,通常只引用该表的前四列,那么将该表的后三列拆分到一个单独的表中将有利于提高性能。
    应谨慎考虑垂直分区操作,因为分析多个分区内的数据需要查询联接这些表。如果分区过大的话,也会影响性能。
    SQL Server 2005 联机丛书 RAID 级别和 SQL Server   发送反馈  请参阅  全部折叠全部展开数据库(数据库引擎) > 优化数据库 > 关于基于硬件的解决方案 > 
    SQL Server 2005 实现的 RAID(独立磁盘冗余阵列)级别一般是 0、1 和 5。
     级别 0
    由于此级别使用称为条带集的磁盘文件系统,因此该级别也称为“磁盘条带化”。数据分成块并在阵列内的所有磁盘中按固定顺序展开。通过跨多个磁盘分散操作,RAID 0 可以提高读写性能。随后,不同的操作可以同时独立地执行。
    RAID 0 与 RAID 5 相似,但 RAID 5 还提供容错能力。 
     
     级别 1
    由于此级别使用称为“镜像集”的磁盘文件系统,因此此级别也称为“磁盘镜像”。磁盘镜像提供选定磁盘的完全相同的冗余副本。写入主磁盘的所有数据也将写入镜像磁盘。RAID 1 提供容错功能,通常可以提高读取性能,但可能会降低写入性能。
     
     级别 2
    该级别通过使用在所有磁盘中展开奇偶信息的纠正错误方法获得冗余。该级别还使用磁盘条带化策略,将文件分成字节并在多个磁盘中展开。相对于镜像 (RAID 1) 策略,该策略只在磁盘的使用以及读写性能上有很小的改进。RAID 2 不如其他 RAID 级别高效,而且不常使用。
     级别 3
    该级别使用与 RAID 2 相同的条带化方法,但纠正错误方法只需要一个磁盘存储奇偶数据。磁盘空间的使用因数据磁盘数目的不同而异。RAID 3 在一些读写性能上有改进。
     级别 4
    与 RAID 2 或 RAID 3 相比,此级别中条带化数据的块或段要大得多。与 RAID 3 相似,纠正错误方法只需要一个磁盘存储奇偶数据。该级别将用户数据和纠正错误数据分开。RAID 4 不如其他 RAID 级别高效,而且不常使用。
     级别 5
    该级别也称为带奇偶的条带化,是在新设计中最常用的策略。与 RAID 4 相似,该级别在阵列内的磁盘中将数据条带化成大块。不同的是,该级别是在所有磁盘中写入奇偶信息。数据冗余通过这些奇偶信息提供。数据和奇偶信息排列在磁盘阵列上,以使两者始终位于不同的磁盘上。带奇偶的条带化的性能优于磁盘镜像 (RAID 1)。但是,如果条带成员丢失(例如磁盘发生故障时),读取性能将下降。 
     
     级别 10 (1+0)
    该级别也称为带条带化的镜像。该级别使用条带化磁盘阵列,然后将该阵列镜像到另一组完全相同的条带化磁盘上。例如,可以使用五个磁盘创建一个条带化阵列。然后使用另一组五个条带化磁盘镜像该条带化磁盘阵列。RAID 10 提供了磁盘条带化与磁盘镜像冗余这两种性能上的好处。在所有 RAID 级别中,RAID 10 的读写性能最佳,但代价是使用两倍数目的磁盘。
    高于 10 (1 + 0) 的 RAID 级别可以提供额外的容错能力或性能增强。这些通常是专有系统。有关这些 RAID 系统类型的详细信息,请与硬件供应商联系。
      

  2.   

    --将数据表分离
    --建合里的index
    --查询优化
      

  3.   

    如果是SQL2005,可以考虑分区表~