【发布时间】:2021-12-15 23:45:26
【问题描述】:
我们的系统是基于 SAAS 的系统,我们使用 ClientID 作为数据提取的掩码。 数据库负载基于公司的规模。所以我们根据 ClientID 对 DB 进行了分区
示例:分区前
客户端表
| clientid | clientname | clientaddress |
|---|---|---|
| 1 | ABC | ... |
| 2 | EMN | ... |
| 3 | XYZ | ... |
可雇佣
| clientid | employeeid | employeename |
|---|---|---|
| 1 | 123 | AAA |
| 1 | 124 | BBB |
| 2 | 125 | CCC |
| 2 | 126 | DDD |
| 3 | 127 | EEEE |
工作表
| clientid | jobid | jobname |
|---|---|---|
| 1 | 234 | YTR |
| 1 | 235 | DER |
| 2 | 236 | SWE |
| 3 | 237 | VFT |
| 3 | 238 | GHJ |
示例:分区后
客户端
| clientid | clientname | clientaddress |
|---|---|---|
| 1 | ABC | ... |
| 2 | EMN | ... |
| 3 | XYZ | ... |
可雇佣
employeetable_1
| clientid | employeeid | employeename |
|---|---|---|
| 1 | 123 | AAA |
| 1 | 124 | BBB |
employeetable_2
| clientid | employeeid | employeename |
|---|---|---|
| 2 | 125 | CCC |
| 2 | 126 | DDD |
employeetable_3
| clientid | employeeid | employeename |
|---|---|---|
| 3 | 127 | EEE |
工作表
jobtable_1
| clientid | jobid | jobname |
|---|---|---|
| 1 | 234 | YTR |
| 1 | 235 | DER |
jobtable_2
| clientid | jobid | jobname |
|---|---|---|
| 2 | 236 | SWE |
jobtable_3
| clientid | jobid | jobname |
|---|---|---|
| 3 | 237 | VFT |
| 3 | 238 | GHJ |
当我们编写选择查询时:
Select employeeid,employeename from employeetable where clientid=2;
此查询在分区后运行得更快。我们面临的问题是我们有一些用户定义的函数来操作一些数据。
CREATE OR REPLACE FUNCTION GET_JOB_COUNT(NUMERIC, NUMERIC) RETURNS NUMERIC AS $BODY$
DECLARE
p_client_id ALIAS FOR $1;
p_employee_id ALIAS FOR $2;
v_is_count NUMERIC := 0;
BEGIN
SELECT COUNT(JOB_ID) INTO v_is_count FROM JOBTABLE where CLIENTID=p_client_id AND CREATEDBY=p_employee_id;
RETURN v_is_count;
END; $BODY$
LANGUAGE plpgsql;
Select employeeid,employeename,GET_JOB_COUNT(2,employeeid) from employeetable where clientid=2;
分区后这个查询很慢。这是否意味着 GET_JOB_COUNT 函数是跨 Partition 运行的?
是不是这个问题,那么我们不能在分区后的Select查询中使用这样的函数?
【问题讨论】:
-
该函数将为每一行调用一次(对于使用
clientid = 2选择的所有行 -
您是如何对表进行分区的?您使用的是哪个 Postgres 版本?
-
我们在 x86_64-pc-linux-gnu 上使用 PostgreSQL 13.4
-
我们根据“ClientID”进行分区,请参阅问题中的“分区后部分”
-
列的类型有哪些?如果您将整数与数字进行比较,则可能会抑制分区修剪。
标签: postgresql spring-boot hibernate database-partitioning