文档库 最新最全的文档下载
当前位置:文档库 › MySQL分区实验

MySQL分区实验

MySQL分区实验
MySQL分区实验

MySQL分区(Partition)功能试验2008-07-06 20:02目录

[分区表和未分区表试验过程]

[分区命令详解]

[概述]

自5.1开始对分区(Partition)有支持,6.0应比较稳定

= 水平分区(根据列属性按行分)=

举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。

=== 水平分区的几种模式:===

* Range(范围)–这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)的数据以及任何在2000年(包括2000年)后的数据。

* Hash(哈希)–这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区,。例如DBA可以建立一个对表主键进行分区的表。

* Key(键值)–上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

* List(预定义列表)–这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA建立了一个横跨三个分区的表,分别根据2004年2005年和2006年值所对应的数据。

* Composite(复合模式)- 很神秘吧,哈哈,其实是以上模式的组合使用而已,就不解释了。举例:在初始化已经进行了Range范围分区的表上,我们可以对其中一个分区再进行hash哈希分区。

= 垂直分区(按列分)=

举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

[分区表和未分区表试验过程]

*创建分区表,按日期的年份拆分

mysql> CREATE TABLE part_tab ( c1 int default NULL, c2 varchar(30) default NULL, c3 date default NULL) engine=myisam

PARTITION BY RANGE (year(c3)) (PARTITION p0 V ALUES LESS THAN (1995),

PARTITION p1 V ALUES LESS THAN (1996) , PARTITION p2 V ALUES LESS THAN (1997) , PARTITION p3 V ALUES LESS THAN (1998) , PARTITION p4 V ALUES LESS THAN (1999) , PARTITION p5 V ALUES LESS THAN (2000) , PARTITION p6 V ALUES LESS THAN (2001) , PARTITION p7 V ALUES LESS THAN (2002) , PARTITION p8 V ALUES LESS THAN (2003) , PARTITION p9 V ALUES LESS THAN (2004) , PARTITION p10 V ALUES LESS THAN (2010), PARTITION p11 V ALUES LESS THAN MAXV ALUE );

注意最后一行,考虑到可能的最大值

*创建未分区表

mysql> create table no_part_tab (c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL) engine=myisam;

*通过存储过程灌入800万条测试数据

mysql> set sql_mode=''; /* 如果创建存储过程失败,则先需设置此变量, bug? */

mysql> delimiter // /* 设定语句终结符为//,因存储过程语句用;结束*/

mysql> CREATE PROCEDURE load_part_tab()

begin

declare v int default 0;

while v < 8000000

do

insert into part_tab

values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));

set v = v + 1;

end while;

end

//

mysql> delimiter ;

mysql> call load_part_tab();

Query OK, 1 row affected (8 min 17.75 sec)

mysql> insert into no_part_tab select * from part_tab;

Query OK, 8000000 rows affected (51.59 sec)

Records: 8000000 Duplicates: 0 Warnings: 0

* 测试SQL性能

mysql> select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

+----------+

| count(*) |

+----------+

| 795181 |

+----------+

1 row in set (0.55 sec)

mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

+----------+

| count(*) |

+----------+

| 795181 |

+----------+

1 row in set (4.69 sec)

结果表明分区表比未分区表的执行时间少90%。

* 通过explain语句来分析执行情况

mysql > explain select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'\G

/* 结尾的\G使得mysql的输出改为列模式*/

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: no_part_tab

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 8000000

Extra: Using where

1 row in set (0.00 sec)

mysql> explain select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: part_tab

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 798458

Extra: Using where

1 row in set (0.00 sec)

explain语句显示了SQL查询要处理的记录数目

* 试验创建索引后情况

mysql> create index idx_of_c3 on no_part_tab (c3);

Query OK, 8000000 rows affected (1 min 18.08 sec)

Records: 8000000 Duplicates: 0 Warnings: 0

mysql> create index idx_of_c3 on part_tab (c3);

Query OK, 8000000 rows affected (1 min 19.19 sec)

Records: 8000000 Duplicates: 0 Warnings: 0

创建索引后的数据库文件大小列表:

2008-05-24 09:23 8,608 no_part_tab.frm

2008-05-24 09:24 255,999,996 no_part_tab.MYD

2008-05-24 09:24 81,611,776 no_part_tab.MYI

2008-05-24 09:25 0 part_tab#P#p0.MYD

2008-05-24 09:26 1,024 part_tab#P#p0.MYI

2008-05-24 09:26 25,550,656 part_tab#P#p1.MYD

2008-05-24 09:26 8,148,992 part_tab#P#p1.MYI

2008-05-24 09:26 25,620,192 part_tab#P#p10.MYD

2008-05-24 09:26 8,170,496 part_tab#P#p10.MYI

2008-05-24 09:25 0 part_tab#P#p11.MYD

2008-05-24 09:26 1,024 part_tab#P#p11.MYI

2008-05-24 09:26 25,656,512 part_tab#P#p2.MYD

2008-05-24 09:26 8,181,760 part_tab#P#p2.MYI

2008-05-24 09:26 25,586,880 part_tab#P#p3.MYD

2008-05-24 09:26 8,160,256 part_tab#P#p3.MYI

2008-05-24 09:26 25,585,696 part_tab#P#p4.MYD

2008-05-24 09:26 8,159,232 part_tab#P#p4.MYI

2008-05-24 09:26 25,585,216 part_tab#P#p5.MYD

2008-05-24 09:26 8,159,232 part_tab#P#p5.MYI

2008-05-24 09:26 25,655,740 part_tab#P#p6.MYD

2008-05-24 09:26 8,181,760 part_tab#P#p6.MYI

2008-05-24 09:26 25,586,528 part_tab#P#p7.MYD

2008-05-24 09:26 8,160,256 part_tab#P#p7.MYI

2008-05-24 09:26 25,586,752 part_tab#P#p8.MYD

2008-05-24 09:26 8,160,256 part_tab#P#p8.MYI

2008-05-24 09:26 25,585,824 part_tab#P#p9.MYD

2008-05-24 09:26 8,159,232 part_tab#P#p9.MYI

2008-05-24 09:25 8,608 part_tab.frm

2008-05-24 09:25 68 part_tab.par

* 再次测试SQL性能

mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31'; +----------+

| count(*) |

+----------+

| 795181 |

+----------+

1 row in set (2.4

2 sec) /* 为原来4.69 sec 的51%*/

重启mysql ( net stop mysql, net start mysql)后,查询时间降为0.89 sec,几乎与分区表相同。

mysql> select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

+----------+

| count(*) |

+----------+

| 795181 |

+----------+

1 row in set (0.86 sec)

* 更进一步的试验

** 增加日期范围

mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < date '1997-12-31'; +----------+

| count(*) |

+----------+

| 2396524 |

+----------+

1 row in set (5.4

2 sec)

mysql> select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1997-12-31';

+----------+

| count(*) |

+----------+

| 2396524 |

+----------+

1 row in set (2.63 sec)

** 增加未索引字段查询

mysql> select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date

'1996-12-31' and c2='hello';

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set (0.75 sec)

mysql> select count(*) from no_part_tab where c3 > date '1995-01-01' and c3 < da

te '1996-12-31' and c2='hello';

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set (11.5

2 sec)

= 初步结论=

* 分区和未分区占用文件空间大致相同(数据和索引文件)

* 如果查询语句中有未建立索引字段,分区时间远远优于未分区时间

* 如果查询语句中字段建立了索引,分区和未分区的差别缩小,分区略优于未分区。

= 最终结论=

* 对于大数据量,建议使用分区功能。

* 去除不必要的字段

* 根据手册,增加myisam_max_sort_file_size 会增加分区性能

[分区命令详解]

= 分区例子=

* RANGE 类型

CREATE TABLE users (

uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name V ARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY RANGE (uid) (

PARTITION p0 V ALUES LESS THAN (3000000)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1 V ALUES LESS THAN (6000000)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx',

PARTITION p2 V ALUES LESS THAN (9000000)

DATA DIRECTORY = '/data4/data'

INDEX DIRECTORY = '/data5/idx',

PARTITION p3 V ALUES LESS THAN MAXV ALUE DATA DIRECTORY = '/data6/data'

INDEX DIRECTORY = '/data7/idx'

);

在这里,将用户表分成4个分区,以每300万条记录为界限,每个分区都有自己独立的数据、索引文件的存放目录,与此同时,这些目录所在的物理磁盘分区可能也都是完全独立的,可

以提高磁盘IO吞吐量。

* LIST 类型

CREATE TABLE category (

cid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY LIST (cid) (

PARTITION p0 V ALUES IN (0,4,8,12)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1 V ALUES IN (1,5,9,13)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx',

PARTITION p2 V ALUES IN (2,6,10,14)

DATA DIRECTORY = '/data4/data'

INDEX DIRECTORY = '/data5/idx',

PARTITION p3 V ALUES IN (3,7,11,15)

DATA DIRECTORY = '/data6/data'

INDEX DIRECTORY = '/data7/idx'

);

分成4个区,数据文件和索引文件单独存放。

* HASH 类型

CREATE TABLE users (

uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY HASH (uid) PARTITIONS 4 (

PARTITION p0

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx',

PARTITION p2

INDEX DIRECTORY = '/data5/idx',

PARTITION p3

DATA DIRECTORY = '/data6/data'

INDEX DIRECTORY = '/data7/idx'

);

分成4个区,数据文件和索引文件单独存放。

例子:

CREATE TABLE ti2 (id INT, amount DECIMAL(7,2), tr_date DATE) ENGINE=myisam

PARTITION BY HASH( MONTH(tr_date) )

PARTITIONS 6;

CREATE PROCEDURE load_ti2()

begin

declare v int default 0;

while v < 80000

do

insert into ti2

values (v,'3.14',adddate('1995-01-01',(rand(v)*3652) mod 365));

set v = v + 1;

end while;

end

//

* KEY 类型

CREATE TABLE users (

uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY KEY (uid) PARTITIONS 4 (

PARTITION p0

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx',

PARTITION p2

INDEX DIRECTORY = '/data5/idx',

PARTITION p3

DATA DIRECTORY = '/data6/data'

INDEX DIRECTORY = '/data7/idx'

);

分成4个区,数据文件和索引文件单独存放。

* 子分区

子分区是针对RANGE/LIST 类型的分区表中每个分区的再次分割。再次分割可以是HASH/KEY 等类型。例如:

CREATE TABLE users (

uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY RANGE (uid) SUBPARTITION BY HASH (uid % 4) SUBPARTITIONS 2( PARTITION p0 V ALUES LESS THAN (3000000)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1 V ALUES LESS THAN (6000000)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx'

);

对RANGE 分区再次进行子分区划分,子分区采用HASH 类型。

或者

CREATE TABLE users (

uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY RANGE (uid) SUBPARTITION BY KEY(uid) SUBPARTITIONS 2( PARTITION p0 V ALUES LESS THAN (3000000)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1 V ALUES LESS THAN (6000000)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx'

对RANGE 分区再次进行子分区划分,子分区采用KEY 类型。

= 分区管理=

* 删除分区

ALERT TABLE users DROP PARTITION p0;

删除分区p0。

* 重建分区

o RANGE 分区重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 V ALUES LESS THAN (6000000));

将原来的p0,p1 分区合并起来,放到新的p0 分区中。

o LIST 分区重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 V ALUES IN(0,1,4,5,8,9,12,13));

将原来的p0,p1 分区合并起来,放到新的p0 分区中。

o HASH/KEY 分区重建

ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;

用REORGANIZE 方式重建分区的数量变成2,在这里数量只能减少不能增加。想要增加可以用ADD PARTITION 方法。

* 新增分区

o 新增RANGE 分区

ALTER TABLE category ADD PARTITION (PARTITION p4 V ALUES IN (16,17,18,19)

DATA DIRECTORY = '/data8/data'

INDEX DIRECTORY = '/data9/idx');

新增一个RANGE分区。

o 新增HASH/KEY 分区

ALTER TABLE users ADD PARTITION PARTITIONS 8;

将分区总数扩展到8个。

[ 给已有的表加上分区]

alter table results partition by RANGE (month(ttime))

(PARTITION p0 V ALUES LESS THAN (1),

PARTITION p1 V ALUES LESS THAN (2) , PARTITION p2 V ALUES LESS THAN (3) , PARTITION p3 V ALUES LESS THAN (4) , PARTITION p4 V ALUES LESS THAN (5) , PARTITION p5 V ALUES LESS THAN (6) , PARTITION p6 V ALUES LESS THAN (7) , PARTITION p7 V ALUES LESS THAN (8) , PARTITION p8 V ALUES LESS THAN (9) , PARTITION p9 V ALUES LESS THAN (10) , PARTITION p10 V ALUES LESS THAN (11), PARTITION p11 V ALUES LESS THAN (12),

PARTITION P12 V ALUES LESS THAN (13) );

默认分区限制分区字段必须是主键(PRIMARY KEY)的一部分,为了去除此

限制:

[方法1] 使用ID

mysql> ALTER TABLE np_pk

-> PARTITION BY HASH( TO_DAYS(added) )

-> PARTITIONS 4;

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

However, this statement using the id column for the partitioning column is valid, as shown here:

mysql> ALTER TABLE np_pk

-> PARTITION BY HASH(id)

-> PARTITIONS 4;

Query OK, 0 rows affected (0.11 sec)

Records: 0 Duplicates: 0 Warnings: 0

[方法2] 将原有PK去掉生成新PK

mysql> alter table results drop PRIMARY KEY;

Query OK, 5374850 rows affected (7 min 4.05 sec)

Records: 5374850 Duplicates: 0 Warnings: 0

mysql> alter table results add PRIMARY KEY(id, ttime);

Query OK, 5374850 rows affected (6 min 14.86 sec)

Records: 5374850 Duplicates: 0 Warnings: 0

postgresql和oracle表分区对比

PostgreSQL和oracle表分区对比 PostgreSQL是开源数据库,完全免费,oracle是有强大厂商支持和维护的数据库,把这两个的表分区特性放在一起对比,似乎有些勉强。但对于我们多了解一些特性,在实际开发中可以更好地进行理性选择和快速入手。

总结,数据库的表分区特性优点很多,比如: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。 5、将很少用的数据可以移动到便宜的、慢一些地存储介质上。 这两种数据库的分区表都具有这些优点。 对比来说,Oracle的分区创建和管理更加方便,很多工作是由oracle的内部机制来实现的。postgreSQL的分区表其实是一个个实际存在的数据表,分区的创建和管理都需要我们用语言来控制,增加了应用人员的工作量。 但,由于oracle自身的“侵占式”硬盘存储,对过期数据进行清除时,即便是drop分区表,也不能直接释放硬盘空间,属于“占了就占了”,这个管理起来就比较麻烦,除非对每个分区表都建立各个独立的tablespace,放在独立的物理文件上,删除过期分区表时,可以同时drop tablespace including contents。而postgreSQL在truncate 分区表时,可以直接释放硬盘,会看到硬盘使用率下降了,这一点对硬盘资源紧张时,就非常好了。 两种数据库的分区表使用,各有利弊,但总的来说,比较偏向postgreSQL,毕竟硬盘有限。而且,oracle收费。 Ps,在数据量很大时,任何关系型数据库都有性能上的瓶颈,不属于我们这两种数据库分区表对比的范围了。 以上,是一些使用中的总结,还请达人们指教:)。

常用数据库对比

常用数据库对比 目前,常用于OLAP分析的数据库软件有Oracle、DB2、Teradata、Greenplum、Netezza、Exdata 几种。 1、Oracle 提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处于领先地位。1984年,首先将关系数据库转到了桌面计算机上。然后,Oracle5率先推出了分布式数据库、客户/服务器结构等崭新的概念。Oracle 6首创行锁定模式以及对称多处理计算机的支持……最新的Oracle 8主要增加了对象技术,成为关系—对象数据库系统。目前,Oracle产品覆盖了大、中、小型机等几十种机型,Oracle数据库成为世界上使用最广泛的关系数据系统之一。

2、DB2 DB2是IBM公司的产品,起源于System R和System R*。他支持从PC到UNIX,从中小型机到大型机;从IBM到非IBM(HP及SUN UNIX系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务平台可以是OS/400,AIX,OS/2,HP-UNIX,SUN-Solaris等操作系统,客户机平台可以是OS/2或Windows, Dos, AIX, HP-UX, SUN Solaris等操作系统。

3、Greenplum Greenplum的架构采用了MPP(大规模并行处理),公司专注于OLAP系统数据引擎开发,有世界级的研发团队进行高性能计算和数据库系统的前沿开发工作,宗旨是向客户提供高性能的超级数据引擎,并将强大的并行计算能力融入到大规模数据仓库分析领域中。公司具有发展趋势超前的视野和洞察力,为全球很多最大规模的数据仓库提供推动力;公司最先将SQL 和Map Reduce的功能整合到统一的数据处理框架中。

分区表和分区视图

分布式数据库内容 分区表和分区视图 sql Server 2000 分区视图的运用 分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。Microsoft? SQL Server? 2000 区分本地分区视图和分布式分区视图。在本地分区视图中,所有的参与表和视图驻留在同一个 SQL Server 实例上。在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。此外,SQL Server 2000 还区分可更新的分区视图和作为基础表只读复本的视图。分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,请参见设计联合数据库服务器。 在实现分区视图之前,必须先水平分区表。原始表被分成若干个较小的成员表。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。 成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值。每一成员表中的值范围通过分区列上的 CHECK 约束强制,并且范围之间不能重叠。例如,不能使一个表的值范围从 1 到 200000,而

创建数据库表与索引实验

实验2:创建数据库表与索引 ----表的创建与管理 1.实验目的: 掌握表和索引的建立方法及表结构的修改方法,了解表关系建立的条件和作用,并实践数据库管理系统提供的数据完整性功能,加深对数据完整性的理解。要求建立表、修改表结构、建立索引、进行数据完整性描述。 2.实验要求: ⑴在已经建立的数据库中创建表 运用Microsoft SQL Server2000企业管理器和Transact-SQL语句两种方法建立“课程信息表”、“教学任务表”、“教师档案表”、“学生档案表”、“学生选课表”、“学生成绩表”。 ⑵了解表与表之间的逻辑依赖关系 学会在Microsoft SQL Server2000企业管理器中,创建表之间的关联关系,通过外键的拖曳建立表的基本依赖关系,从而直白的表达整个数据库的表间联系,但是,注意:过程中,主键与外键对应的源数据表。 ⑶修改表结构 将学生档案表“”字段的数据类型修改为varchar(8)。为学生成绩表增减一个新的字段——“总成绩”,类型为real,默认是空值。学生成绩表“平时成绩”字段的取值为小于100的正数。 ⑷建立索引

运用Transact—SQL语句建立以下索引: ◆在学生档案表的“”字段上建立普通升序索引; ◆在学生档案表的“学号”字段上建立唯一索引; ◆在学生档案表的“学号”字段上建立聚集索引; ◆在学生档案表的“学号”(升序)、“”(升序)和“籍贯”(升序)三个字段上建立一个普通索引; ◆运用SQL企业管理器在学生档案表中的“籍贯”字段上创建普通升序索引。 3.实验环境与实验器材:计算机,网络环境,投影设备。 实验相关软件:Window xp、SQL Server 2000。 4.实验容与步骤 使用企业管理器和Transact-SQL语句创建“课程信息表”、“教学任务表”、“教师档案表”、“学生档案表”、“学生选课表”、“学生成绩表”6表,6表的具体设计容:“课程信息表”包括课程名称、课程类别、学分和学时等;“教师档案表”和“学生档案表”记录了教师和学生的基本情况;“教学任务表”包括课程ID、任课教师ID、学期和年度;“学生选课表”给出了学生与课程之间的关系;“学生成绩表”则给出了学生成绩的计算方法。 4.1 在“教学管理”数据库中使用Transact-SQL命令创建表 使用Transact-SQL命令创建“学生档案表”,包含字段“学号”、“”、“性别”、“出生日期”、“籍贯”、“专业”、“班级”。 第1步:从“开始”菜单中打开“查询分析器”,连接进入“查询”窗口。

SQLserver创建分区表

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了。 1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是1亿条。 2、但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失。只有你的数据是分段的数据,那么才要考虑到是否需要使用分区表。 3、什么叫数据是分段的?这个说法虽然很不专业,但很好理解。比如说,你的数据是以年为分隔的,对于今年的数据而言,你常进行的操作是添加、修改、删除和查询,而对于往年的数据而言,你几乎不需要操作,或者你的操作往往只限于查询,那么恭喜你,你可以使用分区表。换名话说,你对数据的操作往往只涉及到一部分数据而不是所有数据的话,那么你就可以考虑什么分区表了。 那么,什么是分区表呢? 简单一点说,分区表就是将一个大表分成若干个小表。假设,你有一个销售记录表,记录着每个每个商场的销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧。2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表。那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少。 但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度。以添加记录为例,以上5个表是独立的5个表,在不同时间添加记录的时候,程序员要使用不同的SQL 语句,例如在2011年添加记录时,程序员要将记录添加到2011年那个表里;在2012年添加记录时,程序员要将记录添加到2012年的那个表里。这样,程序员的工作量会增加,出错的可能性也会增加。 使用分区表就可以很好的解决以上问题。分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看,还是一个大表。 接着上面的例子,分区表可以将一个销售记录表分成五个物理上的小表,但是对于程序员而言,他所面对的依然是一个大表,无论是2010年添加记录还是2012年添加记录,对于程序员而言是不需要考虑的,他只要将记录插入到销售记录表——这个逻辑中的大表里就行了。SQL Server会自动地将它放在它应该呆在的那个物理上的小表里。 同样,对于查询而言,程序员也只需要设置好查询条件,OK,SQL Server会自动将去相应的表里查询,不用管太多事了。

数据库对比方案

开放性: SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时。 Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。 DB2 能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%。 可伸缩性,并行性 SQL server。 并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。 Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展windownt

的能力,提供高可用性和高伸缩性的簇的解决方案。 如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。DB2 DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境. 数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日 志。数据库分区有时被称为节点或数据库节点 安全性 SQL server 没有获得任何安全证书。 Oracle Server 获得最高认证级别的ISO标准认证。 DB2 获得最高认证级别的ISO标准认证。 性能 SQL Server 多用户时性能不佳 Oracle 性能最高,保持windowsNT下的TPC-D和TPC-C的世界记录。

MySQL自动分区扩展

MySQL实现定时建立删除分区 来源:中国自学编程网发布日期:2008-09-29 最近需要把一个oralce数据库向mysql数据库移植。oracle库用到了job和存储过程,因为mysql中没有job,所有要用新功能event代替一下,这个是5.1以后才有的新功能,所以稍微研究了一下。 原来需要实现的功能是每间隔一段时间就会建立几个分区,并删除几个分区,以保持数据库只存一段时间内的数据,以下是实现步骤 1)首先我们建立表,这个时候就遇到了一点问题,因为mysql PARTITION BY RANGE 的时候只支持按数字类型进行分区,所以不支持直接用date类型分区,而且有很多函数不能在PARTITION BY RANGE 中使用,所以我使用了到公元元年的描述作为划分分区的依据 CREATE TABLE `data_table` ( `dtime` datetime NOT NULL, `alarm_no` int(8) NOT NULL, `alarm_level` int(1) NOT NULL, `color_index` int(1) NOT NULL, `server_name` varchar(64) NOT NULL, `process_name` varchar(64) NOT NULL, `desciption` varchar(600) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 /*!50100 PARTITION BY RANGE (TO_DAYS(dtime)*24*60*60+TIME_TO_SEC(dtime)) (PARTITION p0 VALUES LESS THAN (0) ENGINE = MyISAM) */; 2)然后我们建立存储过程 这里是添加表部分的实现,第2个存储过程调用第一个存储过程,control表中存的是一些参数,值得注意的时,因为有可能插入重复的分区,所有我们进行了异常处理,如果出现重复分区异常我们会跳过这次循环继续 delimiter // CREATE PROCEDURE `gen_partion_script_proc`(spec_date DATETIME, table_name VARCHAR(64), table_space VARCHAR(64), prefix VARCHAR(64), key_type INTEGER(10), qty_day INTEGER(10)) NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT '' begin

oracle大表分区

摘要:本篇文章介绍了ORACLE数据库的新特性—分区管理,并用例子说明使用方法。 关键词:ORACLE,分区 一、分区概述: 为了简化数据库大表的管理,ORACLE8推出了分区选项。分区将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对当前社保及电信行业的大量日常业务数据,可以推荐使用ORACLE8的该选项。 二、分区的优点: 1 、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然可以使用; 2 、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少; 3 、维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多; 4 、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;

5 、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快; 6 、分区对用户透明,最终用户感觉不到分区的存在。 三、分区的管理: 1 、分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: STEP1、建立表的各个分区的表空间: CREATE TABLESPACE ts_sale1999q1 DATAFILE ‘/u1/oradata/sales/sales1999_q1.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) CREATE TABLESPACE ts_sale1999q2 DATAFILE ‘/u1/oradata/sales/sales1999_q2.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0)

sql_server数据库分区表创建和修改实例

-----------------------------建立分区表------------------------------- --建数据库 create database Tmp_db on ( name= Tmp_db_dat, filename='D:\Date\Tmp_db.mdf', size= 10, maxsize= 50, filegrowth= 5 ) log on ( name= Tmp_db_log, filename='D:\Date\Tmp_db.ldf', size= 5, maxsize= 25, filegrowth= 5 ) go use Tmp_db go --增加文件组 alter database Tmp_db add filegroup f1 alter database Tmp_db add filegroup f2 alter database Tmp_db add filegroup f3 alter database Tmp_db add filegroup f4 --将文件分配到文件组 alter database Tmp_db add file(name= N'Tmp_db_f1',filename= N'D:\Date\Tmp_db_f1.ndf',size=3072kb,filegrowth=1024kb) to filegroup f1 alter database Tmp_db add file(name= N'Tmp_db_f2',filename= N'D:\Date\Tmp_db_f2.ndf',size=3072kb,filegrowth=1024kb) to filegroup f2 alter database Tmp_db add file(name= N'Tmp_db_f3',filename= N'D:\Date\Tmp_db_f3.ndf',size=3072kb,filegrowth=1024kb) to filegroup f3 alter database Tmp_db add file(name= N'Tmp_db_f4',filename= N'D:\Date\Tmp_db_f4.ndf',size=3072kb,filegrowth=1024kb) to filegroup f4 --创建分区函数 create partition function pt_fn_test(int)

数据库的创建与表间关系的各种操作

学科实验报告 班级2010级金融姓名陈光伟学科管理系统中计算机应用实验名称数据库的创建与表间关系的各种操作 实验工具Visual foxpro 6.0 实验目的1、掌握数据库结构的创建方式 2、表间的关联关系 实验步骤一、建立数据库。 1、在项目管理器中建立数据库。首先选择数据库,然后单击“新建”建立数据库,出现的界面提示用户输入数据库的名称,按要求输入后单击“保存”则完成数据库的建立,并打开i“数据库设计器”。 2、从“新建”对话框建立数据库。单击工具栏上的“新建”按钮或者选择菜单“文件——新建”打开“新建”对话框,首先在“文件类型”组框中选择“数据库”,然后单击“新建文件”建立数据库,后面的操作和步骤与1相同。 3、用命令交互建立数据库。命令是create database【databasename ▏?】 二、表间关系的各种操作。 1、创建索引文件。可以再创建数据表时建立其结构复合索引文件,但是也可以先建立好数据表,以后再创建或修改索引文件。 2、索引的操作。A、打开与关闭。要使用索引,必须先要打开索引。一旦数据表文件关闭所有相应的索引文件也就自动关闭了。B、确定主控索引。可以使用命令确定当前主控索引。命令格式1:set order to 【tag】<索引标识>【ascending| desceding】命令格式2:use<表文件名>order【tag】<索引标识>【ascending | esceding】C、删除索引标识。要删除结构复合索引文件中的索引标识,应当打开数据表文件,并打开其表设计器对话框。在“索引”页面中选定要删除的索引标识后,单击“删除”按钮删除。 3、创建关联。在创建数据表之间的关联时,把当前数据表叫做父表,而把要关联的表叫做子表。必须保证两个要建立关系的数据表中存在能够建立联系的同类字段;同时要求每个数据表事先分别以该字段建立了索引。A、建立表间的一对一的关系。在“数据库设计器”窗口中选择M表中的字段,并按住左键拖到关联表H中对应字段上,放开鼠标左键。这是可以看到在两个表之间的相关字段上产生了一条连线,表明两个表之间已经建立了“一对一”关系。B、建立表间一对多的关系。将M表的名称字段MC设定为主索引,或者候选索引;H表中的JG字段已经设置成普通索引。在“数据库设计器”窗口中将MC字段拖到关联表中对应字段JG上,放开鼠标左键。这时可以看到在两个表之间的相关字段上产生了一条显然与“一对一”关联不同形式的连线,表明两个表之间已经建立了“一对多”关系。 4、调整或删除关联。A、删除关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明它已被选中。如果要删除可敲【del】。也可以单击鼠标右键在弹出对话框窗口中单击“删除关联”选项。B、编辑关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明已被选中。在主菜单“数据库”选项的下拉菜单中的“编辑关系”选项,也可以单击鼠标右键在弹出对话框窗口中单击“编辑关系”选项。 5、设置数据表之间的参照完整性。在对数据库表建立关联关系后,就可以设置两个相关数据表之间操作的有效性原则。这些规则可以控制相关表中的记录的插入、删除或修改。

表空间及分区表的概念

1. 表空间及分区表的概念 表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据大大提高了数据查询的速度。 2. 表分区的具体作用 ORACLE的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。 什么时候使用分区表: 1. 表的大小超过2GB。 2. 表中包含历史数据,新的数据被增加到新的分区中。 3. 表分区的优缺点 表分区有以下优点: 1)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速 度。 2)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4)均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。缺点:

在db2上建立数据库分区的步骤和命令

本文简单介绍了在DB2上建立数据库分区的步骤和涉及到的命令等,供大家参考! AD:创建database partition 1、创建需要建立数据库分区的db instance 可使用命令建立db instance: db2icrt -s ESE -u db2admin,aaa123456 -h ANWENHAO DBINSTANCENAME 创建完成对应的instance 后需要重启DB2。 2、将新建的db instance加入到DB2中: CATALOG LOCAL NODE DB2INST1 INSTANCE DB2INST1 SYSTEM ANWENHAO OSTYPE NT; 3、在命令行中设置当前需要操作的dbInstance。 set db2instance=db2inst1 db2 get instance

db2 attach to db2inst1 4、创建DBPartition db2start dbpartitionnum 1 ADD DBPARTITIONNUM HOSTNAME ANWENHAO PORT 1 COMPUTER ANWENHAO USER db2admin PASSWORD aaa123456 WITHOUT TABLESPACES 5、创建完成后需要重新启动db2。DB2在此时会增加一个database partition并进行redistribution。 以上操作即完成database partition。 创建database partition group CREATE DATABASE PARTITION GROUP "NODE1" ON DBPARTITIONNUMS (1); COMMENT ON DATABASE PARTITION GROUP "NODE1" IS 'ANWENHAO _1';

sqlserver2005+创建分区表+分区索引+注意事宜+分区索引

、分区索引 1. 分区表简介 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。 大型表:数据量巨大的表。? ?访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式。 分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的。 注意:只能在SQL Server Enterprise Edition 中创建分区函数。只有SQL Server Enterprise Edition 支 持分区。 2. 创建分区表或分区索引的步骤 可以分为以下步骤: 1. 确定分区列和分区数 2. 确定是否使用多个文件组 3. 创建分区函数 4. 创建分区架构(Schema) 5. 创建分区表 6. 创建分区索引 下面详细描述的创建分区表、分区索引的步骤。 2.1. 确定分区列和分区数 在开始做分区操作之前,首先要确定待分区表的访问模式,该模式决定了什么列适合做分区键。例如,对于销售数据,一般会先根据日期把数据范围限定在一个范围内,然后在这个基础上做进一步的查询,这样, 就可以把日期作为分区列。 确定了分区列之后,需要进一步确定分区数,亦即分区表中需要包含多少数据,每个分区的数据应该限定 在哪个范围。 2.2. 确定是否使用多个文件组 为了有助于优化性能和维护,应该使用文件组分离数据。一般情况下,如果经常对分区的整个数据集操作,则文件组数最好与分区数相同,并且这些文件组通常应该位于不同的磁盘上,再配合多个CPU,则SQL Server 可以并行处理多个分区,从而大大缩短处理大量复杂报表和分析的总体时间。 2.3. 创建分区函数 分区函数用于定义分区的边界条件,创建分区函数的语法如下: CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ] 参数说明: ?partition_function_name

MYSQL分区表测试

MYSQL分区表测试 MYSQL分区表测试 一、mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。 MYSQL的分区主要有两种形式:水平分区和垂直分区 水平分区(Horizontal Partitioning) 这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。 所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。水平分区一定要通过某个属性列来分割。常见的比如年份,日期等。 垂直分区(Vertical Partitioning) 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区

都包含了其中的列所对应所有行。 可以用show variables like '%partition%'; 命令查询当前的mysql数据库版本是否支持分区。 分区的作用:数据库性能的提升和简化数据管理 在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。 分区技术使得数据管理变得简单,删除某个分区不会对另外的分区造成影响,分区有系统直接管理不用手工干预。mysql从5.1版本开始支持分区。每个分区的名称是不区分大小写。同个表中的分区表名称要唯一。 二、mysql分区类型 根据所使用的不同分区规则可以分成几大分区类型。RANGE 分区: 基于属于一个给定连续区间的列值,把多行分配给分区。LIST 分区: 类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH分区: 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。KEY

数据库建立索引的原则

数据库建立索引的原则 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如employee 表的姓(lname)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。 在数据库关系图中,您可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。 建立索引的优点 1.大大加快数据的检索速度; 2.创建唯一性索引,保证数据库表中每一行数据的唯一性; 3.加速表和表之间的连接; 4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。 索引的缺点 1.索引需要占物理空间。 2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。有关数据库所支持的索引功能的详细信息,请参见数据库文档。 提示尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。有关这些约束的更多信息,请参见主键约束和唯一约束。 唯一索引

唯一索引是不允许其中任何两行具有相同索引值的索引。 当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee 表中职员的姓(lname) 上创建了唯一索引,则任何两个员工都不能同姓。 有关唯一索引的更多信息,请参见创建唯一索引。 主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。有关主键的更多信息,请参见定义主键。 聚集索引 在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。 一、索引 1. 概念:索引是揭示文献内容出处,提供文献查考线索的工具书。 2. 类型:种类很多,从不同的角度可以划分出不同的类型。按文种分,可以分为中文索引的外文索引;按收录范围分,可以分为综合性索引和专题性索引;按收录文献的时间分,可以分为近期索引和回溯性索引;按索引款目的标目分,可以分为题名索引、著者索引、语词索引、主题索引、分类索引等。 3. 功能:揭示文献的内容和指引读者查找信息 4. 作用:索引揭示了一书、一刊的基本情况,如篇目、文句。可以深入、完整、详细、系统地为读者提所需文献的具体线索。 铁律一:天下没有免费的午餐,使用索引是需要付出代价的。 索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本。若数据库管理员能够对索引所需要付出的代价有一个充分的认识,也就不会那么随意到处建立索引了。

SQL Server 2005中的分区表

(一):什么是分区表?为什么要用分区表?如何创建分区表? 如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了。 1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、 一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是100万条。 2、但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一 千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失。只有你的数据是分段的数据,那么才要考虑到是否需要使用分区表。 3、什么叫数据是分段的?这个说法虽然很不专业,但很好理解。比如说,你的数据是 以年为分隔的,对于今年的数据而言,你常进行的操作是添加、修改、删除和查询,而对于往年的数据而言,你几乎不需要操作,或者你的操作往往只限于查询,那么恭喜你,你可以使用分区表。换名话说,你对数据的操作往往只涉及到一部分数据而不是所有数据的话,那么你就可以考虑什么分区表了。 那么,什么是分区表呢? 简单一点说,分区表就是将一个大表分成若干个小表。假设,你有一个销售记录表,记录着每个每个商场的销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧。2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表。那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少。 但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度。以添加记录为例,以上5个表是独立的5个表,在不同时间添加记录的时候,程序员要使用不同的SQL 语句,例如在2011年添加记录时,程序员要将记录添加到2011年那个表里;在2012 年添加记录时,程序员要将记录添加到2012年的那个表里。这样,程序员的工作量会增加,出错的可能性也会增加。 使用分区表就可以很好的解决以上问题。分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看,还是一个大表。 接着上面的例子,分区表可以将一个销售记录表分成五个物理上的小表,但是对于程序员而言,他所面对的依然是一个大表,无论是2010年添加记录还是2012年添加记录, 对于程序员而言是不需要考虑的,他只要将记录插入到销售记录表——这个逻辑中的大表里就行了。SQL Server会自动地将它放在它应该呆在的那个物理上的小表里。

Sql 2008 数据库分文件组(指定磁盘),映射分区表使用不同的文件组详解

Sql 2008 : 数据库分文件组(指定磁盘), 映射分区表使用不同的文件组详解(阻止保存要求重新创建表的更改?) Posted on 2011-01-25 11:09 且行且思阅读(2753) 评论(1) 编辑收藏 SQL Server 2008阻止保存要求重新创建表的更改 新建数据表以后,若再对该表进行更改,则会出现警告信息“不允许保存更改阻止保存要求重新创建表的更改”, 等等,需要进行一下设置:工具--->选项--->Designers--->表设计器和数据库设计器--->组织保存要求重新创建表的更改,去掉复选框。 分区请三思 1.虽然分区可以带来众多的好处,但是同进也增加了实现对象的管理费用和复杂性。因此在进行分区之前要首先仔细的考虑以确定是否应为对象进行分区。 2.在确定了为对象进行分区后,下一步就要确定分区键和分区数。要确定分区数据,应先评估您的数据中是否存在逻辑分组和模式。 3.确定是否应使用多个文件分组。为了有助于优化性能和维护,应使用文件组分离数据。文件组是数据库数据文件的逻辑组合,它可以对数据文件进行管理和分配,以便提高数据库文件的并发访问效率。 为了简化操作,SQL Server 2008中为表分区提供了相关的操作 操作的顺序: 1、先定义文件组 2、指定哪些辅助数据库文件属于这个文件组 3、将表放入到文件组中 数据库分文件组(指定磁盘): 数据实际上是依附于表来存在的,我们将表放入到文件组中,而文件组是一个逻辑的概念,其实体是辅助数据库文件(ndr),所以就等于将我们指定的数据放入到了指定的辅助数据库文件中,然后如果将这些辅助数据库文件放入在不同的磁盘分区中,就可以最终实现有针对性的对相应的数据实现性能的优化。

MySQL分区的简单实例,用于解决大数据表的问题

MySQL分区的简单实例,用于解决大数据表的问题 MySQL分区的简单实例 mysql数据库的分区 mysql数据库分区也叫mysql数据库分表,即当一个表中数据库非常大时,查询速度非常慢影响效率,同时也增加了io的压力,这样我们就可以用分表的形式将一个表根据一定的规则将他分成多个表,主要的分表类型有range,list,hash,key等,详细说明可以参考mysql5.1以上版本参考手册 mysql分区支持主要在5.1以上版本,如果你的mysql是5.1以上版本,查看是否支持分区的方式是:mysql> show variables like ?h%‘; +————————-+———————–+ | Variable_name | Value | +————————-+———————–+ | have_community_features | YES | | have_compress | YES | | have_crypt | YES | | have_csv | YES | | have_dynamic_loading | YES | | have_geometry | YES | | have_innodb | NO | | have_ndbcluster | NO | | have_openssl | NO | | have_partitioning | YES | –>>此项为yes说明支持表分区功能,如果为No则需要重新编译 | have_query_cache | YES | | have_rtree_keys | YES | | have_ssl | NO | | have_symlink | YES | | hostname | localhost.localdomain | +————————-+———————–+ 15 rows in set (0.02 sec) 如果不支持,则需要下载mysql5.1及以上版本,重新编译安装,这里以mysql-5.1.30.tar.gz来编译安装 1.下载mysql-5.1.30.tar.gz源码, 2.解压 tar xvzf mysql-5.1.30.tar.gz cd mysql-5.1.30 ./configure –prefix=/usr/local/mysql \ –localstatedir=/data \ –datadir=/data \ –with-plugins=partition //添加分区功能 make && make install cd /usr/local/mysql/bin ./mysql_install_db

在 Oracle 数据库 11g 中操作分区

在 Oracle 数据库 11g中操作分区 目的 本教程演示了如何在 Oracle 数据库 11g中使用各种分区技术。 所需时间 大约 50 分钟 主题 本教程包括下列主题: 概述 前提条件 使用引用分区 使用基于虚拟列的分区 总结 概述 在Oracle 数据库11g中,可以使用多种新技术对表数据进行分区,以提高数据的检索性能、优化数据组织。这些技术包括: 返回主题列表 前提条件 开始本教程之前,您应该: 1.安装 Oracle 数据库 11g。 2. 将partition.zip文件下载并解压缩到您的工作目录中。

3.打开一个终端窗口,执行以下命令: sqlplus / as sysdba @setup 返回主题列表 使用引用分区 引用分区通过从父表继承分区键(而非复制键列),使得具有父-子关系的表能 够在逻辑上均分。分区键通过现有的父-子关系解析,由现行的主键或外键约束 实施。逻辑相关性还可以自动级联分区维护操作,从而使应用程序开发更轻松且 更不易出错。 执行以下步骤,进一步了解引用分区的用法: 1. 打开一个终端窗口,以SH用户身份登录 SQL*Plus。执行create_orders.sql脚本,

创建按范围分区的ORDERS表。 @create_orders 2. 执行create_order_items.sql脚本,创建按引用分区的ORDER_ITEMS表。 @create_order_items

3. 执行query_dict_1.sql脚本,查看按引用分区的ORDER_ITEMS表的相关信息。 @query_dict_1 4. 执行insert_orders.sql脚本,将数据插入ORDERS表。

相关文档
相关文档 最新文档