表是在表空间中创建的,表空间是在 Db2 for LUW 中的数据库分区组(或您可以根据需要创建的节点集)中创建的。
您可以使用以下查询来了解哪些表空间驻留在哪些数据库分区组中。
SELECT
-- T.TBSPACEID, T.TBSPACETYPE
CASE T.DATATYPE
WHEN 'A' THEN 'REGULAR'
WHEN 'L' THEN 'LARGE'
WHEN 'T' THEN 'SYSTEMP'
WHEN 'U' THEN 'USRTEMP'
END DATATYPE
, T.DBPGNAME
--, T.PAGESIZE
, T.TBSPACE
--, B.BPNAME
--, G.MIN_NODENUM, G.MAX_NODENUM, G.NODE_COUNT
, G.NODES_LIST
FROM SYSCAT.TABLESPACES T
JOIN SYSCAT.BUFFERPOOLS B ON B.BUFFERPOOLID=T.BUFFERPOOLID
LEFT JOIN (
SELECT
DBPGNAME
, COUNT(*) NODE_COUNT
, MIN(DBPARTITIONNUM) MIN_NODENUM
, MAX(DBPARTITIONNUM) MAX_NODENUM
, LISTAGG(DBPARTITIONNUM, ',') WITHIN GROUP (ORDER BY DBPARTITIONNUM) NODES_LIST
FROM SYSCAT.DBPARTITIONGROUPDEF
GROUP BY DBPGNAME
) G ON G.DBPGNAME=T.DBPGNAME
ORDER BY T.TBSPACEID;
假设您得到以下结果:
DATATYPE DBPGNAME TBSPACE NODES_LIST
-------- --------------- ---------- ----------
...
LARGE IBMDEFAULTGROUP USERSPACE1 0,1,2,3
...
这意味着如果您运行以下语句,则该表将在USERSPACE1
位于数据库分区(节点)0-3 上的表空间中创建,并且表数据基于根据YEAR
列值计算的哈希值在这些节点之间分布。
CREATE TABLE SALES
(
CUSTOMER VARCHAR(80)
, REGION CHAR(5)
, YEAR INTEGER
)
IN USERSPACE1
DISTRIBUTE BY HASH (YEAR);
始终建议显式指定表空间,除非在没有此类规范的情况下选择 Db2 使用的此类表空间的规则适用于您的特定语句。