创建与可路由查询 API 一起使用的表和投影
对于可路由查询,客户端必须确定适用于获取数据的节点。客户端通常以下方法执行此操作:比较对表可用的所有投影,然后确定可用于查找包含数据的单个节点的最佳投影。您必须在至少一个表上创建按键列分段的投影,以充分利用可路由查询 API。联接到此表的其他表必须具有未分段投影,或者必须具有按下文所属进行分段的投影。
注意
可路由查询的表必须用哈希值分段。请参阅哈希分段子句。其他分段类型不受支持。创建与可路由查询结合使用的表
若要创建可以与可路由查询 API 结合使用的表,请按均匀分布的列对表进行分段(使用哈希算法)。通常,可以按主键进行分段。为提高查找速度,请按用作分段依据的相同列对投影进行排序。例如,若要创建非常适用于可路由查询的表,请执行下列操作:
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY,
username VARCHAR(32),
email VARCHAR(64),
business_unit VARCHAR(16))
ORDER BY id
SEGMENTED BY HASH(id)
ALL NODES;
此表基于 id
列进行分段(并按 id
进行排序以提高查找速度)。若要使用可路由查询 API 为此表构建查询,您只需要为 id
列提供单个谓词,当您查询该列时,将返回单个行。
不过,您可以向分段子句添加多个列。例如:
CREATE TABLE users2 (
id INT NOT NULL PRIMARY KEY,
username VARCHAR(32),
email VARCHAR(64),
business_unit VARCHAR(16))
ORDER BY id, business_unit
SEGMENTED BY HASH(id, business_unit)
ALL NODES;
在本例中,您需要在查询 users2
表时提供两个谓词,因为它按以下两列分段:id
和 business_unit
。但是,如果您在执行查询时知道 id
和 business_unit
,则同时按这两个列进行分段会有帮助,因为这样可使客户端更容易确定该投影是可用于确定正确节点的最佳投影。
针对单节点 JOIN 设计表
如果打算在可路由查询期间使用 VerticaRoutableExecutor 类并联接表,则您必须按同一个分段键对要联接的所有表进行分段。通常,此键是要联接的所有表上的主键/外键。例如,customer_key 可能是客户维度表中的主键,并且同一个键是销售事实数据表中的外键。使用这些表的 VerticaRoutableExecutor 查询的投影必须使用哈希算法按每个表中的客户键进行分段。
如果要与小型维度表(例如日期维度)联接,则使这些表保持未分段可能是合适做法,以使 date_dimension
数据存在于所有节点上。请务必注意,在联接未分段的表时,您仍必须在 createRoutableExecutor()
调用中指定已分段的表。
验证表的现有投影
如果已使用哈希算法对表进行分段(例如按 ID 列),则您可以通过使用 Vertica 函数
GET_PROJECTIONS
查看该表的投影,确定需要使用哪些谓词来查询该表。例如:
=> SELECT GET_PROJECTIONS ('users');
...
Projection Name: [Segmented] [Seg Cols] [# of Buddies] [Buddy Projections] [Safe] [UptoDate] [Stats]
----------------------------------------------------------------------------------------------------
public.users_b1 [Segmented: Yes] [Seg Cols: "public.users.id"] [K: 1] [public.users_b0] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]
public.users_b0 [Segmented: Yes] [Seg Cols: "public.users.id"] [K: 1] [public.users_b1] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]
对于每个投影,仅指定 public.users.id
列,表示您的查询谓词应包含此列。
如果表按多个列(例如 id
和 business_unit
)进行分段,则您需要将这两个列作为谓词提供给可路由查询。