posts - 30,  comments - 85,  trackbacks - 0

数据分区消除指的是数据库服务器根据查询谓词确定只需要访问表的一部分数据分区就可以实现查询的能力。当对分区表运行决策支持查询时,数据分区消除可以提供特定好处。

分区表使用了数据组织方案,即,表数据根据该表中一个或多个表分区键列中的值分布到多个存储对象(称为数据分区或范围)中。根据 CREATE TABLE 语句的 PARTITION BY 子句中指定的内容,给定表的数据被划分到多个存储对象中。这些存储对象可以在不同的表空间中,也可以在相同表空间中。

以下示例演示了数据分区消除所产生的性能方面的好处。如果发出以下语句:

CREATE TABLE custlist(subsdate DATE, Province CHAR(2), AccountID INT)
PARTITION BY RANGE(subsdate)
(STARTING FROM '1/1/1990' IN ts1,
STARTING FROM '1/1/1991' IN ts1,
STARTING FROM '1/1/1992' IN ts1,
STARTING FROM '1/1/1993' IN ts2,
STARTING FROM '1/1/1994' IN ts2,
STARTING FROM '1/1/1995' IN ts2,
STARTING FROM '1/1/1996' IN ts3,
STARTING FROM '1/1/1997' IN ts3,
STARTING FROM '1/1/1998' IN ts3,
STARTING FROM '1/1/1999' IN ts4,
STARTING FROM '1/1/2000' IN ts4,
STARTING FROM '1/1/2001' ENDING '12/31/2001' IN ts4);

假定您对 2000 年的客户信息感兴趣。如果发出以下查询:

SELECT * FROM custlist WHERE subsdate BETWEEN '1/1/2000' AND '12/31/2000'; 

正如图 101所显示的那样,数据库服务器确定只需要访问表空间 4(ts4)中的一个数据分区就可以解决此查询。

图 101. 分区表上数据分区消除所产生的性能方面的好处
数据库服务器确定只需要访问一部分数据分区就可以实现查询。

图 102 中显示的另一个数据分区消除示例是索引扫描,它涉及两个索引并根据以下方案进行扫描:

CREATE TABLE multi (sale_date date, region char(2))
PARTITION BY (sale_date)
(STARTING '01/01/2005' ENDING '12/31/2005' EVERY 1 MONTH);
CREATE INDEX sx ON multi(sale_date);
CREATE INDEX rx ON multi(region);

如果发出以下查询:

SELECT * FROM multi WHERE
sale_date BETWEEN '6/1/2005' AND '7/31/2005' AND REGION = 'NW';
图 102. 表分区和索引“与”(AND)的优化器决策路径
比较不使用表分区(索引“与”(AND))和使用表分区(数据分区消除)时的优化器决策路径。

在不使用表分区时,一种可能的方案是索引“与”(AND)。索引“与”(AND)执行下列任务:

  • 读取每个索引中的所有相关索引条目
  • 保存两组行标识(RID)
  • 匹配 RID 以确定哪些 RID 同时出现在这两个索引中
  • 使用 RID 来访存行

图 102 中所示,在使用表分区的情况下,读取索引以查找 region 和 sale_date 的匹配项,从而允许快速检索匹配行。

DB2 说明

还可以使用 DB2 说明来确定 DB2 优化器选择的分区消除。DP Elim Predicates 信息显示扫描了哪些数据分区来解决以下查询:

 

SELECT * FROM custlist WHERE subsdate
BETWEEN '12/31/1999' AND '1/1/2001'
Arguments:
---------
DPESTFLG: (Number of data partitions accessed are Estimated)
FALSE
DPLSTPRT: (List of data partitions accessed)
9-11
DPNUMPRT: (Number of data partitions accessed)
3
DP Elim Predicates:
------------------
Range 1)
Stop  Predicate: (Q1.A <= '01/01/2001')
Start Predicate: ('12/31/1999' <= Q1.A)
Objects Used in Access Plan:
---------------------------
Schema: MRSRINI
Name: 		 CUSTLIST
Type: 		 Data Partitioned Table
Time of creation: 		 	 2005-11-30-14.21.33.857039
Last statistics update: 		 2005-11-30-14.21.34.339392
Number of columns: 		 	 3
Number of rows: 		 	 100000
Width of rows: 		 	 19
Number of buffer pool pages: 		 1200
Number of data partitions: 		 12
Distinct row values: 		 	 No
Tablespace name: 		 	 <VARIOUS>
多列支持

在使用多个列作为表分区键的情况下,数据分区消除将起作用。

例如,如果发出以下语句:

CREATE TABLE sales (year INT, month INT)
PARTITION BY RANGE(year, month)
(STARTING FROM (2001, 1) ENDING AT(2001,3) IN ts1,
ENDING AT(2001,6) IN ts2,
ENDING AT(2001,9) IN ts3,
ENDING AT(2001,12) IN ts4,
ENDING AT(2002,3) IN ts5,
ENDING AT(2002,6) IN ts6,
ENDING AT(2002,9) IN ts7,
ENDING AT(2002,12) IN ts8)

接着,发出以下查询:

	SELECT * FROM sales WHERE year = 2001 AND month < 8

查询优化器推断只需要访问 ts1、ts2 和 ts3 中的数据分区就可以解决此查询。

注:
在多个列组成表分区键的情况下,只有当拥有组合键的前导列上的谓词时才能实现数据分区消除,因为用于表分区键的非前导列不是独立的。

 

多范围支持

可以使用多个范围在数据分区上实现数据分区消除(即,一起执行“或”(OR)运算)。通过使用上一个示例中创建的表,执行下列查询:

	SELECT * FROM sales
WHERE (year = 2001 AND month <= 3) OR (year = 2002 and month >= 10)

数据库服务器只访问 2001 年的第一季度和 2002 年的最后一个季度的数据。

生成列

可以将生成列用作表分区键。

例如,可以发出以下语句:

CREATE TABLE sales(a INT, b INT GENERATED ALWAYS AS (a / 5))
IN ts1,ts2,ts3,ts4,ts5,ts6,ts7,ts8,ts9,ts10
PARTITION BY RANGE(b)
(STARTING FROM (0) ENDING AT(1000) EVERY (50))

在此示例中,将生成列上的谓词用于数据分区消除。此外,当用来生成列的表达式是单调的时,数据库服务器会将源列上的谓词转换为生成列上的谓词,从而在生成列上启用数据分区消除。

例如,如果具有以下查询:

	SELECT * FROM sales WHERE a > 35

数据库服务器根据(a > 35)在 b(b > 7)上生成额外谓词,从而允许数据分区消除。

连接谓词

如果将连接谓词下推到表访问级别,则也可以在数据分区消除中使用连接谓词。连接谓词仅在嵌套循环连接(NLJN)的内部才下推到表访问级别。

请考虑下列表:

CREATE TABLE T1(A INT, B INT)
PARTITION BY RANGE(A, B)
(STARTING FROM (1, 1)
ENDING (1,10) IN ts1, ENDING (1,20) IN ts2,
ENDING (2,10) IN ts3, ENDING (2,20) IN ts4,
ENDING (3,10) IN ts5, ENDING (3,20) IN ts6,
ENDING (4,10) IN ts7, ENDING (4,20) IN ts8)
CREATE TABLE T2 (A INT, B INT)

使用的谓词有:

P1: T1.A = T2.A
P2: T1.B > 15

在此示例中,由于不知道连接的外值,因此不能确定将在编译时访问的额外数据分区。在这种情况下,以及在使用主变量或参数标记的情况下,当绑定必需的值时,就会发生数据分区消除。

在运行时,当 T1 是 NLJN 的内部表时,会根据 T2.A 的每个外值的谓词自动进行数据分区消除。在运行时,对外值 T2.A = 3 应用谓词 T1.A = 3 和 T1.B > 15,这样就限定了访问的表空间 ts6 和 ts7 中的数据分区

考虑表 T1 和 T2 中的列 A 具有下列值:

外部表 T2:列 A 内部表 T1:列 A 内部表 T1:列 B 内部表 T1:数据分区位置
2 3 20 ts6
3 2 10 ts3
3 2 18 ts4
3 15 ts6
1 40 ts3

要执行嵌套循环连接(假定对内部表进行表扫描),数据库管理器执行下列步骤:

  1. 读取 T2 中的第一行。A 的值是 2。
  2. 在连接谓词 T1.A = T2.A 中将 T2.A 值(它是 2)绑定到列 T2.A。该谓词就变成 T1.A = 2。
  3. 使用谓词 T1.A = 2 和 T1.B > 15 应用数据分区消除。这将限定表空间 ts4 和 ts5 中的数据分区
  4. 在应用 T1.A = 2 和 T1.B > 15 之后,扫描表 T1 的表空间 ts4 和 ts5 中的数据分区,直到找到一行为止。找到的第一个合格行是 T1 的行 3。
  5. 连接匹配的行。
  6. 扫描表 T1 的表空间 ts4 和 ts5 中的数据分区,直到找到下一个匹配项(T1.A = 2 和 T1.B > 15)为止。再也找不到其他行。
  7. 对 T2 的下一行(将 A 的值替换为 3)重复步骤 1 至 6,直到用完 T2 中的所有行为止。
posted on 2007-08-21 10:44 安文豪 阅读(1182) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(6)

随笔档案(28)

文章分类(3)

文章档案(4)

最新随笔

搜索

  •  

积分与排名

  • 积分 - 86197
  • 排名 - 665

最新评论

阅读排行榜

评论排行榜