精华内容
下载资源
问答
  • 2022-03-24 18:45:47

    目录

    一、简介

    二、表分区的好处

    三、表分区的限制

    四、分区类型

    五、分区管理

    六、分区的缺点


    一、简介

    MySQL分区能够根据一些规则将表中的数据分配给不同的物理分区。MySQL支持水平分区(将表中数据分配到不同的物理分区),不支持垂直分区(将表中的列分配给不同的物理分区),将数据分区后,查找数据时不需要查找整个磁盘,只要知道数据在哪一块,然后查找那一块就好了,当一个磁盘中数据过大时,就可以将数据进行分区

    二、表分区的好处

    1. 与单个磁盘或文件系统分区相比,可以存储更多的数据。
    2. 为了更方便的管理数据,一些失去保存意义的数据,可以直接删除那个数据的分区
    3. 提高查询效率,通过给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区
    4. 涉及到例如SUM()和COUNT()这样聚合函数的查询,可以在各个分区并行处理,最终只需通过总计所有分区得到的结果

    三、表分区的限制

    1. 一个表最多只能有1024个分区,在5.7版本的时候可以支持8196个分区
    2. MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。
    3. 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来
    4. 不支持外键约束

    四、分区类型

    1. 范围分区(RANGE Partitioning)

    利用列值在给定的范围进行分区,区间要连续并且不能互相重叠,每个分区是有顺序的,要从最低到最高

    语法:

    CREATE TABLE t1 (
        id INT NOT NULL,
        store_id INT NOT NULL
    ) PARTITION BY RANGE (store_id) (
        PARTITION p0 VALUES LESS THAN (6),
        PARTITION p1 VALUES LESS THAN (11)
    );

    上面的语法是创建了一张t1表,以store_id进去范围分区,值小于6的在p0分区,值小于11的在p1分区。创建了分区后数据库的存储位置也会多出分区的数据存储文件

    如果在上述创建的分区插入store_id为12的数据会报错,因为没有定义11以上的值存放的位置,这种问题可以通过 LESS THAN MAXVALUE 来解决,MAXVALUE 表示最大的可能的整数值

    CREATE TABLE t2 (
        id INT NOT NULL,
        store_id INT NOT NULL
    ) PARTITION BY RANGE (store_id) (
        PARTITION p0 VALUES LESS THAN (6),
        PARTITION p1 VALUES LESS THAN (11),
        PARTITION p2 VALUES LESS THAN MAXVALUE
    );

    可以使用函数进行分区,如:

    
    CREATE TABLE t3 (
        id INT NOT NULL,
        separated DATE NOT NULL DEFAULT '9999-12-31'
    )
    PARTITION BY RANGE (YEAR(separated)) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1996),
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );

    2.列表分区(LIST Partitioning)

    类似于范围分区必须明确定义每个分区,区别在于列表分区是根据列值匹配一个定义好的集合中选择分区,并且没有顺序限制,如果列值无法在集合中找到分区,将会报错

    语法:

    CREATE TABLE t4 (
        id INT NOT NULL,
        store_id INT NOT NULL
    ) PARTITION BY LIST(store_id) (
        PARTITION p0 VALUES IN (3,5,6,9,17),
        PARTITION p1 VALUES IN (1,2,10,11,20,19)
    );

    3.列分区(COLUMNS Partitioning)

    列分区可以认为是范围分区和列表分区的升级版,为解决只支持整数分区的问题,支持整数,日期时间,字符串三大数据类型,但不支持表达式

    语法:

    CREATE TABLE t5 (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL
    ) PARTITION BY RANGE COLUMNS(id,name) (
        PARTITION p0 VALUES LESS THAN (1,'a'),
        PARTITION p1 VALUES LESS THAN (5,'e')
    );

    4.哈希分区(HASH Partitioning)

    哈希分区能够确保数据在预先确定个数的分区中尽可能平均分布,基于定义的表达式返回的值来选择分区,这个表达式不能产生负整数值

    语法:

    CREATE TABLE t6 (
        id INT NOT NULL,
        store_id INT
    )
    PARTITION BY HASH(store_id)
    PARTITIONS 4;

    哈希分区不适合用在分区经常变动的需求。因为新增或者减少分区时,大部分数据需要重新定义分区,为此MySQL提供了线性哈希分区(LINEAR HASH Partitioning

    语法:

    CREATE TABLE t7 (
        id INT NOT NULL,
        store_id INT
    )
    PARTITION BY LINEAR HASH(store_id)
    PARTITIONS 4;

    线性散列与常规散列的不同之处在于线性散列使用线性二次幂算法,而常规散列使用散列函数值的模数。优势:分区的添加、删除、合并和拆分速度更快,这在处理包含大量(TB)数据的表时非常有用;缺点:数据分布不太均衡

    5.key分区(KEY Partitioning)

    类似于哈希分区,不同之处在于哈希分区可以自定义表达式,key分区的hash函数由 MySQL 服务器提供,用于分区的列不限于整数或NULL

    语法:

    CREATE TABLE t8 (
        id INT NOT NULL,
        name VARCHAR(32)
    )
    PARTITION BY KEY(name)
    PARTITIONS 4;

    没有将列名指定为分区键,如果有主键的情况下,则使用表的主键用于分区键,如果没有主键但有设置为NOT NULL的唯一键,则唯一键用于分区键

    6.子分区(Subpartitioning)

    在分区的基础上再分区

    语法:

    CREATE TABLE ts (
        id INT,
        purchased DATE
    ) PARTITION BY RANGE(YEAR(purchased))
        SUBPARTITION BY HASH(TO_DAYS(purchased))
        SUBPARTITIONS 2 (
            PARTITION p0 VALUES LESS THAN (1990),
            PARTITION p1 VALUES LESS THAN (2000),
            PARTITION p2 VALUES LESS THAN MAXVALUE
        );

    五、分区管理

    1.范围分区和列表分区

    查询某分区下所有数据

     select * from t1 partition(p1);

    删除一个分区,删除一个分区后,分区下的所有数据也会被删除

    ALTER TABLE t1 DROP PARTITION p1;

    添加一个分区,添加的分区值必须严格按照递增关系,否则会报错

    ALTER TABLE t1 ADD PARTITION (
        PARTITION p2 VALUES LESS THAN (14),
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );

    拆分分区

    ALTER TABLE t1 REORGANIZE PARTITION p3 INTO (
        PARTITION s4 VALUES LESS THAN (40),
        PARTITION s5 VALUES LESS THAN MAXVALUE
    );

    合并分区

    ALTER TABLE t1 REORGANIZE PARTITION s9,s10 INTO (
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );

    2.哈希分区和key分区

    删除2个分区

    ALTER TABLE t6 COALESCE PARTITION 2;

    增加6个分区

    ALTER TABLE t6 ADD PARTITION PARTITIONS 6;

    六、分区的缺点

    1. 分区列和索引列不匹配时,由于每个分区都会有自己的索引,针对这个索引的查询会遍历所有分区的索引树
    2. 选择分区的成本可能会很高,线性搜索会随着分区数的增长代价也在上升
    3. 打开和锁定分区代价可能很高
    4. 维护分区的成本可能很高

    更多相关内容
  • MBR分区表详解

    万次阅读 多人点赞 2016-12-15 13:37:46
    在512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了 DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。

    1.MBR分区

    MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。在512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了 DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。

    2.硬盘分区DPT详解

    分区表由4项组成,每项16个字节(Byte).共4×16 = 64字节(Byte)。每项描述一个分区的基本信息。(80) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (82 C1 3B 3A)

    存贮字节位

    内容及含义

    第1字节

    引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。

    第2、3、4字节

    本分区的起始磁头号、扇区号、柱面号。其中:

        磁头号——第2字节;

        扇区号——第3字节的低6位;

        柱面号——为第3字节高2位+第4字节8位。

    第5字节

    分区类型符。

        00H——表示该分区未用(即没有指定);

        06H——FAT16基本分区;

        0BH——FAT32基本分区;

        05H——扩展分区;

        07H——NTFS分区;

        0FH——(LBA模式)扩展分区(83H为Linux分区等)。

    第6、7、8字节

    本分区的结束磁头号、扇区号、柱面号。其中:

        磁头号——第6字节;

        扇区号——第7字节的低6位;

        柱面号——第7字节的高2位+第8字节。

    第9、10、11、12字节

    逻辑起始扇区号 ,本分区之前已用了的扇区数。

    第13、14、15、16字节

    本分区的总扇区数。

    分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区 主分区 表上的4项用来表示主分区和 扩展分区 的信息。因为扩展分区最多只能有一个,所以硬盘最多可以有四个主分区或者三个主分区,一个扩展分区。
    余下的分区表是表示 逻辑分区 的。这里有必要阐述一点:逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。

    3.实例讲解

    第一项:

    (80) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (82 C1 3B 3A)

    • 80): 代表这个分区(C盘)为活动分区。即系统会从C盘启动。

    • 01 01 00) :表示这个分区(C盘)的起始扇区为(0柱面,1磁头,1扇区)。

    • 07):表示这个分区的文件系统为NTFS

    • FE FF FF):磁头号:254; 扇区号:(11 1111)2=(63)10; 柱面号:(11 1111 1111)2=(1023)10

      (FE)16=(254)10 ;(FF)16=(1111 1111)2;(FF)16=(1111 1111)2;

      故该分区(C盘)结束扇区为(1023柱面,254磁头,63扇区)

    • (3F 00 00 00) : 反向,(00 00 00 3F) 16 = (63) 10,为该分区(C盘)起始逻辑扇区号与逻辑0扇区号之差。表示该分区(C盘)前面已有63个扇区,这63个扇区为系统隐藏扇区。

    • (82 C1 3B 3A) : 反向,(3A 3B C1 82)16=(976994690)10。表明该分区(C盘)有976994690个扇区。即(0柱面,1磁头,1扇区)至(1023柱面,254磁头,63扇区)共有976994690个扇区

    • 1个扇区512字节,所以该分区(C盘)大小为976994690/2/1024/1024=465G

       
            
      GB与B的换算关系:
      1B(byte 字节)=8bit
      1KB(Kilobyte 千字节)=1024B,
      1MB(Megabyte 兆字节 简称“兆”)=1024KB,
      1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,


    第二项:(00) (FE FF FF) (07) (FE FF FF) (00 C8 3B 3A) (00 88 FF 14)
    和第一项解析一样。第三项:
    (00) (FE FF FF)(0F) (FE FF FF) (00 50 3B 4F) (00 18 35 25)

    • (0F) :表示该分区为扩展分区

    • (FE FF FF) :磁头号:(254) 10;扇区号:(11 1111) 2 = (63) 10 ; 柱面号:(11 1111 1111) 2 = (1023) 10

      (FE) 16 = (254) 10 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2;

      但这是不准确的,因为当柱面号的真实值超过1023时,表示柱面号的10位也依然是1023。

    • (00 50 3B 4F) : 反向,(4F 3B 50 00)16=(1329287168)10,表示扩展分区共的起始扇区号为1329287168扇区指向E盘的地址。

    • (00 18 35 25): 反向,(25 35 18 00)16=(624236544)10,表示扩展分区有624236544个扇区。扩展分区的大小为624236544/2/1024/1024=297G,这是这个扩展分区的大小,里面又可以分无限分区。如图,我的扩展分区又分为E盘和G盘。

    第三项

    分区表链的查找

    分区表链实际上相当于一个单向链表结构。第一个分区表,也即主分区表,可以有一项 描述扩展分区。而这一项就相当于指针,指向扩展分区。然后我们根据该指针来到扩展分 区起始柱面的0头1扇区,找到第二个分区表。对于该分区表,通常情况下:第一项描述了扩展分区中第一个分区的信息,第二项描述下一个分区,而这第二项就相当于指向第二个分 区的指针,第三项,第四项一般均为0。我们可以根据该指针来到扩展分区中第二个分区起 始柱面的0头1扇区,找到第三个分区表。以此类推,直到最后一个分区表。而最后一个分 区表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可 以推导找出其后面所有分区表。不过该分区表前面的分区表就不好推导出来了。但令人高兴 的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面,0磁头,1扇区)处, 我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。

    根据上面的信息,我们跳到1329287168扇区,这里有该分区的信息。如图

    (00) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (C1 07 40 06)

    • (07):说明是文件系统是NTFS。

    • (C1 07 40 06): 反向(06 40 07 C1)16=(104859585)10。改分区有104859585个扇区。大小为:104859585/2/1024/1024=50G。

    对这个扇区的分析和上面类似,我们可以看到这个扩展分区里面只划分了两个分区,如果超过四个,需要继续链式查找。

    展开全文
  • DB2 9表分区

    2019-12-15 22:22:36
    DB2 9表分区 开始之前 CREATE TABLE 语句的 PARTITION BY 子句指定了数据的分区。该定义中使用的列被称为表分区键列。...数据可轻易实现转入转出 对大型的管理更加轻松 灵活的索引放置 更高的业务智...

    DB2 9表分区

    开始之前

    CREATE TABLE 语句的 PARTITION BY 子句指定了表数据的分区。该定义中使用的列被称为表分区键列。

    关于该特性的详细说明可参见 “Table partitioning in DB2 9”(developerWorks,2006 年 5 月)。

    表分区特性提供以下收益:

    • 表数据可轻易实现转入和转出
    • 对大型表的管理更加轻松
    • 灵活的索引放置
    • 更高的业务智能样式查询的性能

    关于本教程

    本教程中的练习将引领您使用表分区特性,并演示了表数据的转入转出、更轻松的大型表管理、灵活的索引放置和对业务智能样式查询的性能改善。

    这些练习旨在演示上述各领域内的一个或多个任务。

    目标

    本教程的目标是在以下方面探究 DB2 9 范围分区的特性和优点:

    • 创建范围分区表

    • 分区的转入和转出

    • 分区表的管理

    • 索引管理和放置

    先决条件

    本教程的目标读者是那些技能和经验刚刚迈入中级水平的 DB2 专业人员。要学习本教程,您应该熟悉 DB2 命令行、DB2 管理工具的使用,还应具备 SQL 实践经验。

    系统需求

    要运行本教程的示例,需要具备以下条件:

    • DB2 9 Data Server
    • Microsoft® Windows® 2000 或更高版本,以及一个具有管理员权限的帐户,或具有根访问权限的 Linux®(验证版)。
    • 确保系统中的 Java Runtime Environment 是 1.4.2 或更高版本。
    • 参考 DB2 9 系统需求页面 确保您的硬件符合要求。

    可通过上面的链接获取 DB2 9 Express C。关于安装 DB2 的步骤请参考 “DB2 XML 评估指南”(developerWorks,2006 年 6 月)。若未改动 DB2 的配置,安装后 DB2 将自动启动。

    使用 partition.zip 文件提供的示例脚本和数据演示本教程的概念。将其内容解压缩到 scripts 子目录(C:\scripts 或 home/userid/scripts)。本教程中将该目录简称为 stmm_scripts。教程假设您使用的是 DB2 默认安装目录,并且所有的 DB2 练习都通过一个数据库管理员 ID 执行。

    创建分区表

    这个实验将探讨创建分区表、将数据载入分区表以及使用 describe 命令来说明表范围的方法:

    1. 您将登录并为所有的练习设置基本环境。
    2. 您将创建不同格式的分区表并加载数据。
    3. 您将使用 DB2 命令和 SQL 查看结果。
    4. 将对 DB2 9 表范围分区进行概述。

    登录和基本指令

    图 1. 基本设置

    命令窗口

    1. 登录到您的机器,如图 1 所示,使用 db2inst1。

    2. 打开终端窗口(Linux)或 DB2 命令窗口(windows)。

    3. 切换到 scripts 子目录。

      清单 1. 切换目录

      cd c:\scripts

    4. 使用db2start 命令启动 DB2,并连接到 SAMPLE 数据库。

      清单 2. StartDB2
      db2start
      db2 connect to SAMPLE
      

    创建基本分区表

    这一节将介绍分区表的基本创建和加载。您将创建不同格式的表、验证创建结果、加载数据并对表进行查询。

    1. 使用如下的数据定义语言(DDL)创建具有四个范围的 LINEITEM 表:

    清单 3. 创建表

    CREATE TABLE LINEITEM 
    ( l_orderkey         DECIMAL(10,0) NOT NULL,
      l_partkey          INTEGER,
      l_suppkey          INTEGER,
      l_linenumber       INTEGER,
      l_quantity         DECIMAL(12,2),
      l_extendedprice    DECIMAL(12,2),
      l_discount         DECIMAL(12,2),
      l_tax              DECIMAL(12,2),
      l_returnflag       CHAR(1),
      l_linestatus       CHAR(1),
      l_shipdate         DATE,
      l_commitdate       DATE,
      l_receiptdate      DATE,
      l_shipinstruct     CHAR(25),
      l_shipmode         CHAR(10),
      l_comment          VARCHAR(44))
      PARTITION BY RANGE(l_shipdate)
    ( STARTING '1/1/1992' ENDING '30/06/1992',
      STARTING '1/7/1992' ENDING '31/12/1992',
      STARTING '1/1/1993' ENDING '30/6/1993',
      STARTING '1/7/1993' ENDING '31/12/1993')
    
    1. 创建该表的 SQL 语句位于 EX1-6.sql 文件中,可使用如下命令运行该文件:

      清单 4. 运行 EX1-6

      db2 –vtf EX1-6.sql

    2. 使用下面的命令说明为 LINEITEM 表创建的分区的范围:

      清单 5. 说明

      db2 describe data partitions for table LINEITEM

      图 2. 说明为 LINEITEM 表创建的分区范围

    命令窗口

    1. 注意:创建了四个数据分区。其中的范围包括边界值。

    2. 将数据导入到 LINEITEM 表。该操作的导入命令位于 EX1-8.sql 文件中,可使用如下命令运行:

      清单 6. 带有拒绝的加载

      db2 –vtf EX1-8.sql

      图 3. 将数据导入到 LINEITEM 表

    命令窗口

    1. 注意:导入时拒绝了 729 行数据,这是因为它们不具有位于当前 LINEITEM 表的数据分区定义范围内的 l_shipdate。

    2. 标量函数可用于显示行所属的数据分区号(datapartitionnum)。执行以下示例 SQL 查看标量函数的输出:

      清单 7. 查询 - 匹配日期的分区
    db2 “select datapartitionnum(l_shipdate) as PartitionId, l_shipdate from lineitem 
            where l_shipdate between01/06/1992and31/07/1992order by l_shipdate”
    
    图 4. 标量函数的输出

    命令窗口

    1. 注意:标量函数(datapartitionnum)返回的值和 describe 命令返回的是同一个 PartitionId。该语句的子句间使用的谓词范围超出了 PartitionId 0 和 PartitionId 1 的边界

    具有全部范围的分区表

    1. 创建具有两个额外数据分区的新 LINEITEM 表,其中一个分区用来捕获低于当前范围的值,另一个分区用来捕获高于当前范围的值。首先使用下面的命令删除现有的 LINEITEM 分区表:

      清单 8. 删除表

      db2 drop TABLE LINEITEM

    然后使用如下 DDL 创建 LINEITEM 表的新版本:

    清单 9. 创建表
    CREATE TABLE LINEITEM 
    ( l_orderkey         DECIMAL(10,0) NOT NULL,
      l_partkey          INTEGER,
      l_suppkey          INTEGER,
      l_linenumber       INTEGER,
      l_quantity         DECIMAL(12,2),
      l_extendedprice    DECIMAL(12,2),
      l_discount         DECIMAL(12,2),
      l_tax              DECIMAL(12,2),
      l_returnflag       CHAR(1),
      l_linestatus       CHAR(1),
      l_shipdate         DATE,
      l_commitdate       DATE,
      l_receiptdate      DATE,
      l_shipinstruct     CHAR(25),
      l_shipmode         CHAR(10),
      l_comment          VARCHAR(44))
      PARTITION BY RANGE(l_shipdate)
    ( STARTING MINVALUE,
      STARTING '1/1/1992' ENDING '30/06/1992',
      STARTING '1/7/1992' ENDING '31/12/1992',
      STARTING '1/1/1993' ENDING '30/6/1993',
      STARTING '1/7/1993' ENDING '31/12/1993',
      ENDING MAXVALUE)
    
    1. 创建该表的 SQL 位于 EX1-10.sql 文件中,可使用下列命令运行:

      清单 10. 运行 EX1-10

      db2 –vtf EX1-10.sql

    2. 使用下面的命令说明为 LINEITEM 表创建的分区范围。

      清单 11. 说明

      db2 describe data partitions for table LINEITEM

      图 5. 说明为 LINEITEM 表创建的分区范围

    命令窗口

    1. 注意:新的 MINVALUE 范围具有一个最高值,该值和下一个数据分区开始部分的值相等,但它并不包含该值。MAXVALUE 范围具有一个最低值,该值和前一个范围结束部分的值相等,但它不包含该值。这将创建一个无间隙的连续范围。

    2. 将数据导入到 LINEITEM 表中。该操作的导入命令位于 EX1-8.sql 文件中,可使用下面的命令运行该文件:

      清单 12. 全面加载

      db2 –vtf EX1-8.sql

      图 6. 将数据导入到 LINEITEM 表中

    命令窗口

    具有生成范围的分区表

    1. 创建一个新 LINEITEM 表,它具有从 1992 年 1 月 1 日到 1998 年 12 月 31 日按月划分的数据分区生成范围。同样,添加 minvalue 和 maxvalue 范围来存放具有超过此范围的 l_shipdate 的值的行。首先使用以下命令删除现有的 LINEITEM 分区表:

      清单 13. 删除表

      db2 drop TABLE LINEITEM

      然后使用如下 DDL 创建 LINEITEM 表的新版本:

      清单 14. 创建表
    CREATE TABLE lineitem
    (l_orderkey            DECIMAL(10,0) NOT NULL,
      l_cpartkey      INTEGER,
      l_suppkey       INTEGER,
      l_linenumber    INTEGER,
      l_quantity      DECIMAL(12,2),
      l_extendedprice DECIMAL(12,2),
      l_discount      DECIMAL(12,2),
      l_tax           DECIMAL(12,2),
      l_returnflag    CHAR(1),
      l_linestatus    CHAR(1),
      l_shipdate      DATE,
      l_commitdate    DATE,
      l_receiptdate   DATE,
      l_shipinstruct  CHAR(25),
      l_shipmode      CHAR(10),
      l_comment       VARCHAR(44))
      PARTITION BY RANGE(l_shipdate)
     (STARTING MINVALUE,
     STARTING '1/1/1992' ENDING '31/12/1998' 
                    EVERY 1 MONTH,
     ENDING MAXVALUE);
    
    1. 创建该表的 SQL 位于 EX1-13.sql 文件中,可使用下面的命令运行该文件:

      清单 15. 运行 EX1-13

      db2 –vtf EX1-13.sql

    2. 使用如下命令来说明为 LINEITEM 表创建的分区范围:

      清单 16. 说明

      db2 describe data partitions for table LINEITEM

      图 7. 说明为 LINEITEM 表创建的分区范围

    命令窗口

    1. 注意:创建了 86 个数据分区,但是没有包括这些范围的最高值,因为这些最高值将和之后的数据分区的最低值重叠。

    2. 将数据导入到 LINEITEM 表。此操作的导入命令位于 EX1-8.sql 文件中,可使用下面的命令运行该文件:

      清单 17. 加载并生成

      db2 –vtf EX1-8.sql

      图 8. 将数据导入到 LINEITEM 表

    命令窗口

    使用下面的 SQL 来验证 LINEITEM 表每一个数据分区的行数:

    清单 18. 查询数据
    db2 “select year(l_shipdate) as year, month(l_shipdate) as month, 
    count(*) as count from lineitem
      group by year(l_shipdate), month(l_shipdate)
      order by 1, 2

    使用以下的 SQL 语句验证 LINEITEM 表的每一个数据分区的行数:

    清单 19. 查询数据脚本
    db2 –vtf EX1-16.sql
    
    图 9. 检验行数

    命令窗口

    1. 注意:执行加载操作后,86 个范围中有 82 个范围包含一个或多个行。

    放置分区表

    该实验探讨放置分区表以及使用 describe 命令说明表内的范围和放置情况的方法:

    1. 您将为数据放置练习创建新的表空间。
    2. 你将创建不同格式的分区表。
    3. 您将使用 db2 命令和 SQL 查看结果。

    基本环境设置

    1. 使用

      describe data partitions
      

      命令以及

      show detail
      

      方法来显示表空间的分区放置。

      清单 20. 创建表

      db2 describe data partitions for table LINEITEM show detail

      图 10. 表空间的分区放置

    命令窗口

    1. 注意:TableSpID 列给出了包含分区的表空间的 ID 号。在本例中,TableSpID 是 ‘3’。

    2. 使用

      list tablespaces
      

      命令标识与 TableSpId 相关联的表空间。

      清单 21. 说明

      db2 list tablespaces

      图 11. 标识表空间

    命令窗口

    1. 注意:相应值为 ‘2’ 的 TableSpID 是 USERSPACE1 或默认的表空间。

    2. 现在将创建五个表空间来说明不同的放置选项。使用如下命令:

      清单 22. 说明
    db2 create tablespace dms_d1 managed by database using (file 'c:\ts1' 10000);
    db2 create tablespace dms_d2 managed by database using (file 'c:\ts2' 10000);
    db2 create tablespace dms_d3 managed by database using (file 'c:\ts3' 10000);
    db2 create tablespace dms_d4 managed by database using (file 'c:\ts4' 10000);
    db2 create tablespace dms_i1 managed by database using (file 'c:\ts5' 10000);
    
    1. 创建该表空间的 SQL 位于 EX2-3.sql 文件中,可使用下面的命令运行该文件:

      清单 23. 查询数据脚本

      db2 –vtf EX2-3.sql

    2. 创建一个新的 LINEITEM 表,具有位于 dms_d1 和 dms_d2 表空间的生成分区集。首先,使用如下命令删除现有的 LINEITEM 分区表:

      清单 24. 删除表

      db2 drop TABLE LINEITEM

      然后,使用下面的 DDL 创建 LINEITEM 表的新版本:

      清单 25. 创建表
    CREATE TABLE LINEITEM
    (l_orderkey      DECIMAL(10,0) NOT NULL,
     l_partkey       INTEGER,
     l_suppkey       INTEGER,
     l_linenumber    INTEGER,
     l_quantity      DECIMAL(12,2),
     l_extendedprice DECIMAL(12,2),
     l_discount      DECIMAL(12,2),
     l_tax           DECIMAL(12,2),
     l_returnflag    CHAR(1),
     l_linestatus    CHAR(1),
     l_shipdate      DATE,
     l_commitdate    DATE,
     l_receiptdate   DATE,
     l_shipinstruct  CHAR(25),
     l_shipmode      CHAR(10),
     l_comment       VARCHAR(44))
     IN DMS_D1, DMS_D2
     PARTITION BY RANGE(l_shipdate)
    (STARTING MINVALUE,
     STARTING '1/1/1992' 
          ENDING '31/12/1998' EVERY 1 MONTH,
     ENDING MAXVALUE);
    
    1. 创建该表的 SQL 位于 EX2-4.sql 文件中,可使用下面的命令运行该文件:

      清单 26. 运行 EX2-4

      db2 –vtf EX2-4.sql

    2. 使用下面的命令说明为 LINEITEM 表创建的分区范围:

      清单 27. 说明

      db2 describe data partitions for table LINEITEM show detail

      图 12. 说明为 LINEITEM 表创建的分区范围

    命令窗口

    图 13. 分区

    命令窗口

    1. 注意:TableSpID 列给出了包含分区的表空间的 ID 号。在本例中,TableSpID 为 4(对应于 DMS_D1)或 5(对应于 DMS_D2)。本例中将生成的分区依次分配给指定的表空间。

    分区的显式放置

    1. 创建一个具有四个数据分区的新 LINEITEM 表,每一个数据分区被显式地放在表空间中。首先使用如下命令删除现有的 LINEITEM 表:

      清单 28. 删除表

      db2 drop TABLE LINEITEM

      然后使用下面的 DDL 创建 LINEITEM 表的新版本:

      清单 29. 创建表
    CREATE TABLE LINEITEM
     (l_orderkey          DECIMAL(10,0) NOT NULL,
      l_partkey           INTEGER,
      l_suppkey           INTEGER,
      l_linenumber        INTEGER,
      l_quantity          DECIMAL(12,2),
      l_extendedprice     DECIMAL(12,2),
      l_discount          DECIMAL(12,2),
      l_tax               DECIMAL(12,2),
      l_returnflag        CHAR(1),
      l_linestatus        CHAR(1),
      l_shipdate          DATE,
      l_commitdate        DATE,
      l_receiptdate       DATE,
      l_shipinstruct      CHAR(25),
      l_shipmode          CHAR(10),
      l_comment           VARCHAR(44))
     PARTITION BY RANGE(l_shipdate)
     ( STARTING MINVALUE IN DMS_D1,
       STARTING '1/1/1992' ENDING '31/12/1992' IN DMS_D2,
       STARTING '1/1/1993' ENDING '31/12/1993' IN DMS_D3,
       ENDING MAXVALUE IN DMS_D4 );
    
    1. 创建表的 SQL 位于 EX2-6.sql 文件中,可使用下面的命令运行该文件:

      清单 30. 运行 EX2-6

      db2 –vtf EX2-6.sql

    2. 使用下面的命令说明为 LINEITEM 表创建的分区范围:

      清单 31. 说明

      db2 describe data partitions for table LINEITEM show detail

      图 14. 说明为 LINEITEM 表创建的分区范围

    命令窗口

    1. 注意:在本例中,每一个分区被放置在一个不同的 TableSpID 中,这个 TableSpID 和创建表的 DDL 中指定的表空间是相对应的。

    2. 创建一个具有四个数据分区的 LINEITEM 表,每一个数据分区被显式地放在表空间并且索引被放在表空间 DMS_I1 中。 在这一步中,将引入命名分区的概念,而不是使用默认的生成名称。 首先,使用下面的命令删除现有的 LINEITEM 分区表:

      清单 32. 删除表

      db2 drop TABLE LINEITEM

      然后,使用以下的 DDL 创建 LINEITEM 表的新版本:

      清单 33. 创建表
    CREATE TABLE LINEITEM
    (l_orderkey           DECIMAL(10,0) NOT NULL,
     l_partkey            INTEGER,
     l_suppkey            INTEGER,
     l_linenumber         INTEGER,
     l_quantity           DECIMAL(12,2),
     l_extendedprice      DECIMAL(12,2),
     l_discount           DECIMAL(12,2),
     l_tax                DECIMAL(12,2),
     l_returnflag         CHAR(1),
     l_linestatus         CHAR(1),
     l_shipdate           DATE,
     l_commitdate         DATE,
     l_receiptdate        DATE,
     l_shipinstruct       CHAR(25),
     l_shipmode           CHAR(10),
     l_comment            VARCHAR(44))
    INDEX IN DMS_I1
    PARTITION BY RANGE(l_shipdate)
    ( PART JAN1992 STARTING '1/1/1992'  ENDING '30/6/1992' IN DMS_D1,
      PART JULY1992 STARTING '1/7/1992' ENDING '31/12/1992' IN DMS_D2,
      PART JAN 1993 STARTING '1/1/1993' ENDING '30/6/1993' IN DMS_D3,
      PART JULY1993 STARTING '1/7/1993' ENDING '31/12/1993' IN DMS_D4);
    
    1. 创建表的 SQL 位于 EX2-8.sql 文件中,可使用下面的命令运行该文件:

      清单 34. 运行 EX2-8

      db2 –vtf EX2-8.sql

    2. 在 LINEITEM 表中创建一个索引,并将它放置在表空间 DMS_I1 中。使用如下 SQL:

      清单 35. 索引

      db2 “create index I_LINEITEM on LINEITEM(L_SHIPDATE) in DMS_I1”

    3. 使用下面的 SQL 检验和该表相关联的索引的位置:

      清单 36. 说明

      db2 “select tabname, index_tbspace from syscat.tables where tabname = ‘LINEITEM’”

      图 15. 检验索引的位置

      命令窗口

    4. 注意:索引空间是 DMS_I1。如果没有为分区表指定表空间,那么默认情况下索引位于连接着的第一个表空间。 在 CREATE TABLE 中定义表空间是很好的实践。然而,无论您是否在创建表语句 ID 中指定索引表空间,这并不限制您将来放置索引的位置。您可以在 CREATE INDEX 语句本身显式地指定索引表空间。 同一分区表的不同索引可以放置在不同的表空间。

    管理分区表

    这个实验将查看如何管理和操作分区表:

    1. 您将添加和删除分区。
    2. 您将执行对分区的转入转出操作。
    3. 在执行查看操作时将使用 DB2 命令和 SQL。

    使用现有的表添加一个新的分区

    1. 将数据导入 LINEITEM 表。创建表空间的 SQL 位于 EX3-1.sql 文件中,可使用下面的命令运行该文件:

      清单 37. 导入数据

      db2 –vtf EX3-1.sql

      图 16. 将数据导入到 LINEITEM 表

    命令窗口

    1. 注意:分区表中的记录数,以及将进行连接和分离的记录数对于说明数据库中的数据何时可用非常重要。

    2. 创建一个名为 NP_LINEITEM 的新表。脚本 EX3-2.sql 创建一个具有 87 行的新表 NP_LINEITEM:

      清单 38. 新分区

      db2 –vtf EX3-2.sql

      图 17. 将数据导入到 NP_LINEITEM 表

    命令窗口

    使用下面的命令说明为 LINEITEM 表创建的分区范围:

    清单 39. 说明
    db2 describe data partitions for table LINEITEM show detail
    
    图 18. LINEITEM 表的分区

    命令窗口

    1. 注意:LINEITEM 表目前包含 4 个数据分区。

    2. 使用Alter语句将一个新的分区连接(转入)到现有的 LINEITEM 表。

      清单 40. 新分区
    ALTER TABLE LINEITEM ATTACH PARTITION JAN1994 
    STARTING '1/1/1994' ENDING '30/6/1994'
    FROM NP_LINEITEM
    

    可以使用以下命令运行脚本 EX3-4:

    清单 41. 新分区
    db2 –vtf EX3-4.sql
    
    图 19. 脚本 EX3-4

    命令窗口

    1. 注意:LINEITEM 表被置于 SET INTEGRITY PENDING 状态。

    2. 连接后,使用

      describe data partitions
      

      命令来说明为 LINEITEM 表创建的分区范围:

      清单 42. 说明

      db2 describe data partitions for table LINEITEM show detail

      图 20. LINEITEM 表的分区

    命令窗口

    1. 注意

      :新数据分区(JAN1994)PartitionId 4 现在连接到了 LINEITEM 表。然而连接的分区的 AccessMode 值为 ‘N’ 并且 Status 的值为 ‘A’。 AccessMode 可能的值有:

      • D = 没有数据移动
      • F = 完全访问
      • N = 不访问
      • R = 只读访问

      Status 可能的值有:

      • A = 数据分区是新连接的
      • D = 数据分区是分离的
      • I = 只有在执行异步索引清除时才对条目位于目录的分离的数据分区进行维护;当所有引用分离数据分区的索引记录删除后,将删除 STATUS 值为 ‘I’ 的行。
      • Empty string = 数据分区是可见的(普通状态)
    2. 运行两个select count语句来检查连接语句涉及的两个表中数据的可用性。

      清单 43. Count Lineitem

      db2 “select count(*) from lineitem”

      图 21. select count 语句的结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHcMiLd2-1576419249173)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s25a.jpg)]

    注意:LINEITEM 表最初的分区是可用的,但是 PartitionId 4 中的新数据仍不可见。

    清单 44. Count np-lineitem
    db2 “select count(*) from np_lineitem”
    
    图 22. select count 语句的结果

    命令窗口

    1. 注意:NP_LINEITEM 表现在是一个未定义的对象,在 LINEITEM 表内只能将其作为一个分区使用。

    2. 创建一个异常表并与 SET INTEGRITY 语句结合使用。执行该操作的 DDL 位于 EX3-7.sql 文件,可使用下面的命令运行该文件:

      清单 45. 异常表

      db2 –vtf EX3-7.sql

    3. 对 LINEITEM 分区表运行set integrity语句 。

      清单 46. 设置完整性
    SET INTEGRITY FOR LINEITEM <br>
    ALLOW WRITE ACCESS <br>
    IMMEDIATE CHECKED  <br>
    FOR EXCEPTION IN LINEITEM USE LINEITEM_EX
    

    执行该操作的 SQL 位于 EX3-8.sql 文件中,可以使用下面的命令运行该文件:

    清单 47. 设置完整性
    db2 –vtf EX3-8.sql
    
    图 23. EX3-8.sql 文件

    命令窗口

    1. 注意SET INTEGRITY 对于检查新连接的数据是否在范围内是必需的,它还执行对索引和其他独立对象(例如物化查询表)所有必需的维护工作。只有得到 SET INTEGRITY 语句的允许,新的数据才能变为可见。然而,当运行 SET INTEGRITY 时,可以对 LINEITEM 表中的现有数据进行完全访问,包括读和写操作。 用户应该执行 SET INTEGRITY 事务从而能够使用整个表。当运行 SET INTEGRITY 时,不能够对表执行 DDL 或其他实用类型的操作。 在这个练习中,在 NP_LINEITEM 表中创建并被连接到 LINEITEM 表的所有的行,都在连接语句指定的范围内。如果这些行中存在超出此范围的行,则需要在 SET INTEGRITY 语句中创建一个异常表来防止语句发生错误。所以推荐您始终在 SET INTEGRITY 语句中包含一个异常表。如果没有提供异常表的话,SET INTEGRITY 语句发现的错误将导致语句失败并且所有的工作都必须从头做起。如果使用大量数据时,这可能是一个长期操作。有一点值得注意,如果 SET INTEGRITY 操作失败,所有工作都需要重做,与之相比较,LOAD 仅仅抛弃存在问题的行。

    2. 对 LINEITEM 表运行select countSQL 以检查连接的分区中数据的可用性:

      清单 48. Count Lineitem

      db2 “select count(*) from lineitem”

      图 24. select count 语句的结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ReUztOvx-1576419249176)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s26b.jpg)]

    1. 注意:成功执行 SET INTEGRITY 操作后,LINEITEM 表应包含 PartitionId 4 的数据。

    从分区表中分离一个分区

    1. 使用describe data partitions show detail
      命令来标识一个分区的 PartitionName,您将把这个分区从 LINEITEM 分区表中分离(转出)出来。

      清单 49. 说明表

      db2 describe data partitions for table LINEITEM show detail

      图 25. LINEITEM 表的分区

    命令窗口

    1. 注意:将分离最早的分区范围 PartitionId 0。该分区的 PartitionName 是 JAN1992。将在 DETACH 操作中使用它来标识被转出的分区。同样还需注意成功执行了 SET INTEGRITY 操作后,分区 JAN1994 的 AccessMode 的值为 ‘F’,Status 值为空。TableSpId、PartObjId 和 LongTblSpId 的结果可能和这里显示的不一样。

    2. 使用

      Alter
      

      语句将 JAN1992 从 LINEITEM 表中分离(转出)。

      清单 50. Alter 表

      ALTER TABLE LINEITEM DETACH PARTITION JAN1992 INTO LINEITEM_JAN1992

      创建文件的 SQL 位于 EX3-11.sql 文件中,可使用下面的命令运行该文件:

      清单 51. Alter 表

      db2 –vtf EX3-11.sql.

      注意:将 JAN1992 成功分离后,将创建一个新的表 LINEITEM_JAN1992。在DETACH操作中没有涉及数据移动,并且位于相同表空间的新表的行为和它作为 LINEITEM 分区表的一部分时是一样的。此时不需要对 LINEITEM 表运行SET INTEGRITY语句,因为没有对 LINEITEM 表定义的 MQTs。 还有一点值得注意,如果从 Multi-Dimensional Clustering(MDC)分离一个分区从而创建了一个新表时,这个表也将是一个 MDC。这个规则同样适用于下面这个情况:从一个分布式表中分离分区从而在相同的分区组创建分布式表。执行DETACH操作后产生的表使用 MDC 索引定义而不是其他的索引。对于 MDC,在首次访问连接的表时将重新构建索引。在这种情况下,将自动对分离的分区进行索引清除操作。将从执行DETACH操作的用户 ID 继承索引的模式、权限和表空间。

    3. 运行两个select count语句检查DETACH语句涉及的两个表中的数据的可用性。

      清单 52. Count Lineitem_jan1992

      db2 “select count(*) from lineitem_jan1992”

      图 26. select count 语句的结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgIPyQFS-1576419249177)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s28a.jpg)]

    注意:创建的 LINEITEM_JAN1992 表包含 38 行,它被包含在 LINEITEM 分区表的 JAN1992 分区中。

    清单 53. Count lineitem
    db2 “select count(*) from lineitem”
    
    图 27. select count 语句的结果

    命令窗口

    1. 注意:此时 LINEITEM 表完全可用,并且不包括 PART0 中的数据。

    2. 当数据被移动到分区表中,或当希望将数据加载到或直接插入分区表中时,一个更合适的方法是向现有的分区表添加一个空的分区。使用下面的命令向现有的 LINEITEM 表添加一个空的分区:

      清单 54. 说明
    db2 “ALTER TABLE LINEITEM ADD PARTITION JULY1994 
    STARTING '1/7/1994' ENDING '31/12/1994'
    图 28. 向现有的 LINEITEM 表添加一个空的分区

    命令窗口

    使用 describe data partitions show detail 命令来检验 PartitionName 为 JULY1994 的分区是否被添加到 LINEITEM 中:

    清单 55. 说明
    db2 describe data partitions for table LINEITEM show detail
    
    图 29. LINEITEM 表的分区

    命令窗口

    分区表的访问计划

    本实验将研究如何在访问计划中描述分区表:

    1. 您将更新分区表中的统计信息。

    2. 您将使用 db2expln 命令并分析结果。

    3. 您将在执行查看的操作中使用 DB2 命令和 SQL 。

    4. 对 LINEITEM 表执行RUNSTATS操作:

      清单 56. Runstats

      db2 runstats on table db2inst1.lineitem

    5. 说明以下 SQL 语句并检查说明输出:

      清单 57. 说明

      db2 “select l_shipdate,sum(l_quantity) from LINEITEM group by l_shipdate”

      要进行说明的 SQL 位于 EX4-2.sql 文件,可以使用下面的命令运行该文件:

      清单 58. 说明输出

      db2expln –d SAMPLE –t –f EX4-2.sql

      图 30. 说明输出

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PqTV96B-1576419249179)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s30.jpg)]

    1. 注意:该 SQL 执行了 LINEITEM 表的索引扫描。说明输出中有一个关于表分区的要点需要注意,所访问的表是被分区的,并且在扫描过程中所有数据分区都将被访问。

    2. 说明下面的 SQL 语句并检查说明输出:

      清单 59. 说明
    db2 “select l_shipdate, l_partkey, l_returnflag
    from LINEITEM
    where l_shipdate between '01/01/1993' and '31/08/1993'
    and l_partkey = 49981

    要进行说明的 SQL 语句位于 EX4-3.sql 文件中,可使用下面的命令运行该文件:

    清单 60. 说明输出
    db2expln –d SAMPLE –t –f EX4-3.sql
    
    图 31. 说明输出

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wvYnGp1-1576419249180)(https://www.ibm.com/developerworks/cn/education/data/dm0612read/s31.jpg)]

    1. 注意:这个 SQL 语句执行了 LINEITEM 表的索引扫描。在本例中,可以看到优化器能够执行数据分区排除操作。在说明输出中要注意的是关于表分区,访问的表是被分区的,将执行分区排除功能以及删除活动数据分区的值。 在本例中,活动的数据分区为 1-2。这里引用的是 syscat.datapartitions 中的序列号(seqno)而不是 describe data partitions 命令中的 PartitionId。

    2. 使用下面的 SQL 确定在前面说明示例中活动的分区的名称:

      清单 61. 说明
    db2 “select seqno,datapartitionname
    from syscat.datapartitions
    where tabname = ‘LINEITEM’ order by seqno”
    
    图 32. 分区名称

    命令窗口

    1. 注意:序列号 1 和 2 分别映射的是 JAN1993 和 JULY1993 分区名称。

    结束语

    本教程基于 IBM DB2 9 Data Partitioning 特性。您已在以下几个方面获得了第一手的经验:

    • 如何定义分区表
    • 如何将分区表放置在底层磁盘子系统
    • 如何维护分区表
    • 如何使用 DB2 Explain 说明分区表

    范围分区将数据映射到基于关键值范围的分区,用户为每一个分区建立关键值范围。例如,企业通常希望以月份为单位,将销售数据划分到各月的分区中。与 MDC 功能集合使用时,范围分区将更加方便地定位数据,从而加快通过复杂查询检索信息的速度。

    下载资源

    本文的示例脚本和数据 (exfiles.zip | 60KB)
    链接:https://pan.baidu.com/s/1cDtoMvkfUQZ_tmhHrcrocA
    提取码:7zev

    参考

    https://www.ibm.com/developerworks/cn/education/data/dm0612read/dm0612read.html?from=singlemessage&isappinstalled=0#ibm-pcon

    展开全文
  • 我将在分区表和分区表之间进行性能测试。 这里有两个表都包含2亿个数据。 1)hashvalue_pt(每月分区表) 2)哈希(非Partiton表) PS请访问PostgreSQL中的分区表(创建分区)–第1部分。如果您不知道如何...

    我将在分区表和非分区表之间进行性能测试。

    这里有两个表都包含2亿个数据。

    1)hashvalue_pt(每月分区表)
    2)哈希值(非Partiton表)

    PS请访问PostgreSQL中的分区表(创建分区)–第1部分。如果您不知道如何在PostgreSQL中进行表分区,请访问PostgreSQL中的分区表(模拟数百万数据)–第2部分,以模拟数百万个数据进行测试。

    指定日期的性能测试

    
    --partition table
    SELECT * FROM hashvalue_PT WHERE hashtime = DATE '2008-08-01'
    
    --non partition table
    SELECT * FROM hashvalue WHERE hashtime = DATE '2008-08-01'
    

    这是从100万到2亿个数据的性能测试结果。 请点击图片放大性能结果。

    分区表性能测试PostgreSQL 1

    当两者都包含2亿个数据时,在指定日期进行搜索,分区表要比非分区表快144.45%

    在指定的日期搜索“ 2008-08-01”
    检索记录= 741825
    分区表= 359.61秒
    非分区表= 879.062秒

    范围日期同月的性能测试

    
    --partition table
    SELECT * FROM hashvalue_PT WHERE  hashtime >= DATE '2008-05-01' AND hashtime <= '2008-05-15'; 
    
    --non partition table
    SELECT * FROM hashvalue WHERE hashtime >= DATE '2008-05-01' AND hashtime <= '2008-05-15'; 
    

    这是从100万到2亿个数据的性能测试结果。 请点击图片放大性能结果。

    分区表性能测试PostgreSQL 2

    当两者都包含2亿个数据时,在同月的范围日期中进行搜索,分区表比非分区表要快约209.84%

    搜索从“ 2008-05-01”到“ 2008-05-15”的当月范围日期;
    检索记录= 11112338
    分区表= 603.328秒
    非分区表= 1869.375秒

    范围日期跨月性能测试

    
    --partition table
    SELECT * FROM hashvalue_PT WHERE  hashtime >= DATE '2008-06-20' AND hashtime <= '2008-07-10'; 
    
    --non partition table
    SELECT * FROM hashvalue WHERE hashtime >= DATE '2008-06-20' AND hashtime <= '2008-07-10';
    

    这是从100万到2亿个数据的性能测试结果。 请点击图片放大性能结果。

    分区表性能测试PostgreSQL 3

    当两者都包含2亿个数据时,在范围日期和跨月搜索中,分区表要比非分区表快39.97%

    搜索范围日期和跨月范围从“ 2008-06-20”到“ 2008-07-10”;
    检索记录= 12220658
    分区表= 1310.766秒
    非分区表= 1834.743秒

    结论

    经过分区和非分区表之间的一些性能测试后,结果显然是,分区表在该性能测试中完全获胜。

    翻译自: https://mkyong.com/database/performance-testing-on-partition-table-in-postgresql-part-3/

    展开全文
  • 本文介绍了MBR与GPT这两种不同硬盘分区方案,对不同的情况下,如何正确选择MBR分区方案还是GPT分区方案,给出了建议。本文还介绍了BIOS与EFI的一些基础知识,并示例了与MBR及GPT格式分区相关的一些基础操作。你可以...
  • 一、分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间性能的消耗都非常大。 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中。如果查询的where...
  • 一、分区存储模式下使用 MediaStore 修改图片、 二、分区存储模式下使用 MediaStore 删除图片、 三、相关文档资料、
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JanzVMIN-1628242050249)(2021-08-04-20-38-29.png )] create table emp( empno int, ename string, job string, mgr i
  • 【对象管理】分区表

    千次阅读 2013-08-15 22:34:35
    进行分区后,逻辑上仍然是一张完整的,只是将中的数据在物理上存放到多个空间(物理文件上),这样查询数据时,不至于每次都扫描整张。 第一,改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,...
  • MySQl的分区与分表1 分区的认识1) 情景假设假如有1000万条数据,放...所以我们直接使用mysql的分区技术.2) 分区的示意图图片.png1 虽然内部分成了四个区,但是对外提供服务的依旧是一张.2 存到哪里以及从哪里取,这个...
  • 文章目录系列文章目录前言1.Hive的分桶1.1 分桶原理1.2 作用1.3 案例演示:创建分桶2.Hive数据导入2.1 直接向中插入数据(强烈不推荐使用)2.2 通过load加载数据(必须掌握)2.3 通过查询加载数据(必须掌握...
  • Oracle之表分区分区索引(一)

    千次阅读 2019-05-14 08:55:59
    对于ORACLE来讲,分区是咱们开发中最常用的,什么样的场景下要进行分区,主要是针对于大数据量的,频繁查询的, 我只是说数据量大的,并没有说物理的这个大,比如你搞一个文件,数据库文件,里面来一个file文件,你搞...
  • 数据库设计 数据库结构设计方法及原则(li)  数据库设计的三大范式:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则...如果数据库中的所有字段都是不可分解的原子,就说明该数...
  • 数据库分区、分表、分库、分片

    万次阅读 2021-02-05 09:46:53
    另外,分区可以做到将的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力分区的优点如下: 1、相对于单个文件系统或是硬盘,分区可以存储更多的数据; 2、数据管理比较方便,比如要清理或...
  • ClickHouse MergeTree引擎建表语句

    千次阅读 2022-02-03 13:09:48
    PARTITION BY 定义分区字段,hive一样,MergeTree的不同分区数据也是存在不同的目录中,hive每个分区数据是有不同的小文件组成不同,MergeTree的分区数据一般是有不同的列数据文件组成的,后面会详细介绍。...
  • 系统找不到硬盘分区的原因问:我有一个二手硬盘。前一段时间我很好用,但有一天我打开它,突然显示硬盘错误。...如果损坏不严重,则可以使用系统的内置命令MBR重写分区表和引导文件以进行尝试。如果无法...
  • 在栅格数据分析中,使用最多的无疑是邻域分析、局域分析和分区运算了,其中局域运算又分为单一栅格局域运算多个栅格的局域运算,分区运算是邻域运算的特例,区分这三者的不同之处可以加深我们对栅格数据分析的理解...
  • /home目录挂载到新分区步骤: 1. 给/home目录分配新分区 2. 挂载新分区到临时目录/mnt/home 3. 同步/home目录数据到新分区 4. 重命名/home目录,新建空/home目录 5. 卸载新分区 6. 挂载新分区到/home目录 7. 修改...
  • DiskGenius 编辑 锁定 讨论999 DiskGenius是一款硬盘分区及数据恢复软件。它是在最初的DOS版的基础上开发而成的。...如:已删除文件恢复、分区复制、分区备份、硬盘复制等功能。另外还增加了...
  • 目录一. 关键问题:如何管理空闲空间二. 假设三 . 底层机制1. 分割2. 合并3. 追踪分配内存大小4. 如何在空闲内存内部建立列表四. 分配算法1. 最优匹配(best fit)2....基本的接口就像 malloc() free()
  • 内容摘要:本文主要讨论分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构默认的分区大小,硬盘整数分区、4K对齐、起始扇区、恢复分区、ESP分区、MSR分区,哪些分区是必要的,删除...
  • SQLServer海量数据处理 - 3 表分区

    千次阅读 2013-12-23 09:44:42
    关于SQLServer表分区,这里有篇文章写的很好,我就不多废话了,转载原地址: http://www.cnblogs.com/lyhabc/p/3350121.html =====================...网上表分区的文章成千上万,但是分区之后数据的分布流向都没
  • ![图片说明]...我已经设置了每个文件组,分区的边界,但是这个数值是按ID行数来分区的,那么如果我想修改每个文件组分区边界,怎么修改呢????
  • 数据库分区概念及简单运用

    千次阅读 2021-07-15 08:36:43
    分类:分为水平分区(Horizontal Paritioning)垂直分区(Vertical Partitioning) 水平分区:是对表的行进行分区,通过这种方式不同分组里面的物理列分隔的数据集得以组 合,从而进行个体分隔(单分区)或集体分隔(1个...
  • Linux(一): 磁盘分区

    千次阅读 2019-12-11 21:27:52
    如何进行磁盘分区的,一个磁盘可以分多少区,主分区和逻辑分区分区挂载目录是怎么样的。BIOSUEFI分别是啥?MSDOS与GPT又是啥? 1. 磁盘连接方式与设备文件名的关系 现在主流使用的磁盘有两种,SATA接口与SAS接口...
  • 使用Hive SQL插入动态分区的ParquetOOM异常分析 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右...
  • 如何优化MySQL千万级大,我写了6000字的解读

    万次阅读 多人点赞 2019-10-21 20:03:03
    千万级大如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充梳理,想大家做一些这方面的经验总结,也欢迎大家提出建议。 从一开始脑海里开始也是...
  • oracle数据库和分区

    千次阅读 2013-12-30 16:49:11
    分析、约束及间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区3  海量数据库及分区4  高级SQL优化(一)  高级SQL优化(二)  高级SQL优化(三) ...
  • 深入理解 Hive 分区分桶 (Inceptor)

    万次阅读 2019-03-25 15:02:00
    下面介绍一下动态分区,因为按照上面的方法向分区表中插入数据,如果源数据量很大,那么针对一个分区就要写一个insert,非常麻烦。况且在之前的版本中,必须先手动创建好所有的分区后才能插入,这就更麻烦了,你...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,057
精华内容 11,222
关键字:

和值号码分区表图片