数据仓库中的表记录太多怎么办?已经超过5000W条了,读写操作变得很慢,应该怎么解决呢?

解决方案 »

  1.   

    一、创建分区函数
    分区函数定义了把数据进行分区的边界条件,它与表、索引、索引视图等数据库的逻辑结构不相关,也和文件组等物理结构不相关,甚至不涉及所有现实的数据。
    创建分区函数的语法是:
    [Copy to clipboard]CODE:
    CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
    AS RANGE [ LEFT | RIGHT ] 
    FOR VALUES ( [ boundary_value [ ,...n ] ] ) 
    [ ; ]分区函数名必须符合标识符的规则。指定分区依据列时,仅可以指定一列。而input_parameter_type就是那一列的类型。boundary_value就是分区时的边界值,LEFT | RIGHT指的是边界值本身是放在左边的分区还是右边的分区中。边界值不能重复,可以不按次序指定,SQL Server会自动进行排序。
    QUOTE:在计划分区函数时,需要考虑下列两个因素:其值确定如何对表进行分区的列(称为分区依据列)及每个分区的分区依据列的值范围。此值范围将确定组成表的分区数。一张表最多可以有 1000 个分区。
    可以对分区依据列和值范围所做的选择主要是由区确定的,可以按逻辑方式(如按日期)将数据分组到区上,此逻辑分组是否足够用来管理数据的子集也是主要决定因素。
    参与分区函数的计算列必须显式标记为 PERSISTED。
    用作索引列时有效的所有数据类型都可以用作分区依据列,timestamp 除外。无法指定 ntext、text、image、xml、varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型。此外,无法指定 Microsoft .NET Framework 公共语言运行时 (CLR) 用户定义类型和别名数据类型列。如下面的例子创建一个名为partfunc的分区函数:
    CREATE PARTITION FUNCTION partfunc (int) AS
    RANGE LEFT FOR VALUES (1000, 2000, 3000, 4000, 5000);
    这个分区函数对int类型进行分区,它把int类型的所有可能的值分为6个区:
    负无穷大——1000,1001——2000,2001——3000,3001——4000,4001——5000,5001——正无穷大
    注意,因为我们指定了LEFT(默认也是LEFT),所以边界值如1000是包含在边界值左边的分区中。(当然,这里的负无穷大和正无穷大实际应该是int类型的最小值和最大值。)[ 本帖最后由 天使之手 于 2006-11-19 08:12 PM 编辑 ]二、创建分区方案
    分区方案将分区函数生成的分区映射到您定义的一组文件组。
    创建分区方案时,根据分区函数的参数,定义映射表分区的文件组。必须指定足够的文件组来容纳分区数。可以指定所有分区映射到不同文件组、某些分区映射到单个文件组或所有分区映射到单个文件组。如果您希望在以后添加更多分区,还可以指定其他“未分配的”文件组。在这种情况下,SQL Server 用 NEXT USED 属性标记其中一个文件组。这意味着该文件组将包含下一个添加的分区。 
    一个分区方案仅可以使用一个分区函数。但是,一个分区函数可以参与多个分区方案。
    语法:
    [Copy to clipboard]CODE:
    CREATE PARTITION SCHEME partition_scheme_name
    AS PARTITION partition_function_name
    [ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
    [ ; ]执行语句时,分区函数,文件组必须都已经存在于数据库中。如果指定了ALL,则只能指定一个文件组打接受所有分区;文件组列表中的文件组可以重复出现(即一个文件组接受多个分区),如果使用[PRIMARY],则指定主文件组接受某个分区(注意PARIMARY左右的方括号不能少)。指定的文件组数目不能比分区函数指定的分区少,但可以多,此时未用的文件组在以后分区函数更改后如果增加了分区将会自动被依次使用。
    注意,分区方案不涉及数据库的逻辑结构如表,索引,索引视图。
    如根据上面的分区函数创建分区方案:
    CREATE PARTITION SCHEME partscheme AS
    PARTITION partfunc TO
    (FG1, FG2, FG3, FG4, FG5, FG6)
    GO
    这个分区方案就是指定分区函数partfunc规定的6个分区依次存放在6个文件组中。[ 本帖最后由 天使之手 于 2006-11-19 01:54 PM 编辑 ]三、创建分区表或分区索引
    准备好分区函数和分区方案,现在可以对表、索引、索引视图进行分区了。对表和索引进行分区是在创建表或索引时指定的,对索引视图进行分区是在对视图创建索引时指定的。
    CREATE TABLE
    [ database_name . [ schema_name ] . | schema_name . ] table_name
    ( { <column_definition> | <computed_column_definition> }
    [ <table_constraint> ] [ ,...n ] )
    [ ON { partition_scheme_name ( partition_column_name ) | filegroup
    | "default" } ]
    [ { TEXTIMAGE_ON { filegroup | "default" } ] [ ; ]CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name)
    | filegroup_name | default } ][ ; ]上面是创建表或索引时的SQL语句。其中的ON子句实现分区。继续上面的例子,创建分区表:
    [Copy to clipboard]CODE:CREATE TABLE dbo.CustomerAddress
    (CustomerAddressID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    AddressTypeID tinyint NOT NULL,
    PrimaryAddressFlag bit NOT NULL,
    AddressLine1 varchar(30) NOT NULL,
    AddressLine2 varchar(30) NULL,
    AddressLine3 varchar(30) NULL,
    City varchar(50) NOT NULL,
    StateProvinceID int NULL,
    PostalCode char(10) NULL,
    CountryID int NULL)
    ON partscheme(CustomerAddressID);在创建CustomerAddress表时指定按照partscheme的分区方案,分区依据列是CustomerAddressID。即CustomerAddressID小于等于1000的将被放入FG1文件组中,CustomerAddressID大于1000小于等于2000的将放入FG2中,...CustomerAddressID大于5000的将放入FG6中。下面在CustomerAddress表上建立一个分区索引:
    [Copy to clipboard]CODE:CREATE NONCLUSTERED INDEX idx_CustomerAddress_City ON dbo.CustomerAddress(City)
    ON partscheme(CustomerAddressID);使用这个语句建立的索引,其指向CustomerAddressID小于等于1000时的行那部分索引将放在FG1中...
    这里需要指出的是,如果基表已经分区,则其后创建的索引会自动按基表的分区依据进行分区(如果没有为索引指定另外的分区方案或文件组的话,此时称为索引与基表分区对齐),因此上面的分区索引例子在基表未分区或者基表分区依据列不是CustomerAddressID时才有必要执行,此时称为索引与基表不对齐。
    QUOTE:当索引与基表不对齐时,无法进行分区切换。因此尽量使索引与基表对齐。
    在下列情况下,独立于基表而单独设计已分区索引(不对齐)很有用: 
      基表未分区。
      索引键是唯一的,不包含表的分区依据列。
      您希望基表与使用不同联接列的多个表一起参与组合联接。如何对已经存在的表和索引进行分区
    如果你在已经存在的表上删除现有的聚集索引,又在创建聚集索引且指定聚集索引放在另外的文件组中,则整个表的内容将同聚集索引一起移动到另外的文件组中。用这个办法,我们可以把已经存在的表进行分区。
    步骤:创建分区函数,创建分区方案,删除聚集索引,使用分区方案创建聚集索引。
    如果非聚集索引要按另外的分区方案进行分区,则删除原有的,再创建即可。
      

  2.   

    事实上5000W条记录的表不是一个两个,是一坨阿~~~T_T
      

  3.   

    haoyuzhou009(要回家了~ 拜年~哈~) ( ) 信誉:100    Blog  2007-02-08 14:31:44  得分: 0  
     
     
       用Oracle数据库
      
     
    什么嘛?
    Oracle面对5000W数据就不慢了?
      

  4.   

    我现在手里有1000w的数据库 要我在2秒钟显示出需要的东西来 我整部出来 就跟我们老大说:
    听说Oracle增加了新的搜索功能 不建索引都跑的嗷嗷的快  呵呵  笑过~~不过说实在的 为什么百度等搜索引擎怎么能在很短的恶时间里面搜索出我们想要的东西来呢  他的数据不也是上亿了么~
      

  5.   

    根据逻辑建视图,使用存储过程,建索引
    优化数据库  检查sql语句的效率性
      

  6.   

    学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:32801051