71 lines
2.4 KiB
Markdown
71 lines
2.4 KiB
Markdown
分区命名与查询
|
|
============================
|
|
|
|
|
|
|
|
指定分区的查询
|
|
----------------
|
|
|
|
除了根据 SQL 的查询条件进行分区裁剪以外,OceanBase 数据库也支持用户通过 SQL 语法指定需要访问的分区。下述示例语句中 `partition(p0)` 指定了只访问 p0 分区:
|
|
|
|
```sql
|
|
obclient> SELECT * FROM t1 partition (p0);
|
|
```
|
|
|
|
|
|
|
|
如果 SQL 中指定了分区,系统会将查询的范围限定在所指定的分区集合内,同时根据 SQL 的查询条件进行分区裁剪。最终访问的分区为指定分区和分区裁剪二者的交集。
|
|
|
|
分区名字规则
|
|
---------------
|
|
|
|
对于 List 和 Range 分区,因为在创建表的过程中就指定了分区的名字,所以名字就是当时指定的名字。对于 Hash/Key 分区,创建时如果没有指定分区的名字,分区的命名由系统根据命名规则完成。具体表现为,如果 Hash/Key 出现在一级分区里面,那么每个分区分别命名为 p0、p1、...、pn。如果出现在二级分区里面,那么就是 sp0、sp1、 ...、spn。
|
|
|
|
二级分区的名字由 **一级分区+二级分区** 的方式构成。例如 p0sp0,其中 p0 是一级分区的名字,sp0 是二级分区的名字。
|
|
|
|
获取二级分区的各级分区 ID
|
|
-----------------------
|
|
|
|
对于二级分区,可以在日志里面看到的分区 ID 数字很大。
|
|
|
|
下述示例展示了 t1 的实际分区 ID:
|
|
|
|
```sql
|
|
obclient> CREATE TABLE t1
|
|
(
|
|
c1 INT,
|
|
c2 INT
|
|
)
|
|
PARTITION BY hash(c1)
|
|
SUBPARTITION BY RANGE(c2)
|
|
SUBPARTITION template
|
|
(
|
|
SUBPARTITION sp0 VALUES less than(100),
|
|
SUBPARTITION sp1 VALUES less than(200)
|
|
) partitions 5
|
|
|
|
obclient> SELECT partition_id FROM __all_meta_table JOIN __all_table using(table_id)
|
|
WHERE table_name = 't1';
|
|
+---------------------+
|
|
| partition_id |
|
|
+---------------------+
|
|
| 1152921504875282432 |
|
|
| 1152921504875282433 |
|
|
| 1152921509170249728 |
|
|
| 1152921509170249729 |
|
|
| 1152921513465217024 |
|
|
| 1152921513465217025 |
|
|
| 1152921517760184320 |
|
|
| 1152921517760184321 |
|
|
| 1152921522055151616 |
|
|
| 1152921522055151617 |
|
|
+---------------------+
|
|
```
|
|
|
|
|
|
|
|
Partition-Wise 联接
|
|
--------------------------
|
|
|
|
Partition-Wise 联接(Partition-Wise Join)是指当需要联接的表是按照联接条件进行分区的时候,联接只需对联接表对应分区进行联接操作,能极大提高联接的性能。您可以在我们的 《SQL 调优》手册中查看更多关于 Partition-Wise 联接的信息。
|