返回首页

gbase数据、南大通用产品文档:GBase8a两表like 条件关联使用limit 和limit offset 性能差

更新日期:2024年09月11日

异大
问题现象
两表like 条件关联使用limit 和limit offset 性能差异大,如下示例,该SQL 执行
时跑了几万秒没有结果,但把最后的limit 0,500 换成limit 500,20 秒左右就可

GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
94
以执行完毕。
SELECT a.*
,b.addr_full_name
,b.gridcode
FROM gd_eda.temp_wyj_obd_01 a
,gd_lx.address_grid b
WHERE b.addr_full_name LIKE a.address || '%'
AND a.address IS NOT NULL
AND b.gridcode IS NOT NULL limit 0,500
解决方法

Limit 0,500 时,在默认set _t_gcluster_limit_optimize=1;的情况下,执行器会
先去各个节点评估本节点结果集行数,该语句2 表关联条件为b.addr_full_na
me like a.address||'%',左表(小表,数据量为140 多万)拉复制表后,与右
表的分片按nest-loop 方式join,2 表数据量都很大,join 执行的时间长,导致
长时间评估不完;

limit 500 时,不按照上述优化执行,直接下发到第一个节点执行,虽然也是
nest-loop join,但是当结果集行数到500 时就退出了,对外表现性能更好;

性能差异的根本原因是在sql 的join 上面,建议请用户核查下sql 的逻辑是否
有问题;或session 级设置上述参数值为0。
改造业务逻辑或者执行该sql 时设置set _t_gcluster_limit_optimize=0。

如果 DBA 使用 DBA 关键字创建例程,
则数据库服务器自动地仅将 Execute 权限授予有
DBA 权限的其他用户。然而,DBA 可显式地将 DBA 例程上的 Execute 权限授予没有
DBA 权限的用户。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 327 -
当用户执行以 DBA 关键字注册了的例程时,
该用户假设在例程持续期间持有 DBA 权限。
如果没有 DBA 权限的用户运行 DBA 例程,则数据库服务器隐式地将临时的 DBA 权限
授予调用者。在退出 DBA 例程之前,数据库服务器隐式地撤销该临时的 DBA 权限。
执行 DBA 例程的用户拥有在运行该 DBA 例程期间创建的对象,
除非例程中的语句显式
地命名其他用户作为所有者。 例如,假设 tony 以 DBA 关键字注册 promo() 例程,如下:

CREATE DBA PROCEDURE promo()
. . .
CREATE TABLE catalog
. . .
CREATE TABLE libby.mailers
. . .
END PROCEDURE;
虽然 tony 拥有该例程,但如果 marty 运行它,那么 marty 拥有 catalog 表,但由于用
户 libby 的名称限定 libby.mailers 表名称,使得她成为该表的所有者,因此它拥有该表。
被调用的例程未继承 DBA 权限。如果 DBA 例程执行未以 DBA 关键字创建了的例程,
则 DBA 权限不影响被调用的例程。
如果未以 DBA 关键字注册的例程调用 DBA 例程,则调用者对于被调用的 DBA 例程必
须有 Execute 权限。该 DBA 例程内的语句执行如同任何 DBA 例程内的语句一样。
下列示例展示当 DBA 与非 DBA 例程相互作用时发生的情况。假设过
程 dbspc_cleanup() 执行另一过程 clust_catalog()。还假设 clust_catalog()创建索引,
且 clust_catalog() 的 SPL 源代码包括下列语句:
CREATE CLUSTER INDEX c_clust_ix ON catalog (catalog_num);
DBA 过程 dbspc_cleanup() 以下列语句调用其他例程:
EXECUTE PROCEDURE clust_catalog(catalog);
假设 tony 注册了 dbspc_cleanup() 作为 DBA 过程,而未以 DBA 关键字注
册 clust_catalog(),如下列语句所示:
CREATE DBA PROCEDURE dbspc_cleanup(loc CHAR)
CREATE PROCEDURE clust_catalog(catalog CHAR)
GRANT EXECUTE ON dbspc_cleanup(CHAR) to marty;
假设用户 marty 运行 dbspc_cleanup()。由于通过非 DBA 例程创建索引 c_clust_ix,因此,
同时拥有两个例程的 tony 也拥有 c_clust_ix。相对地,如果 clust_catalog() 为 DBA 过程,
则 marty 会拥有索引 c_clust_ix,如下列注册和授权语句所示:
CREATE PROCEDURE dbspc_cleanup(loc CHAR);
CREATE DBA PROCEDURE clust_catalog(catalog CHAR);
GRANT EXECUTE ON clust_catalog(CHAR) to marty;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 328 -
请注意,dbspc_cleanup() 无需 DBA 过程来调用 DBA 过程。

功能说明
TRUNCATE TABLE 在功能上与不带WHERE 子句的DELETE 语句相同,
二者均
删除表中的全部行。
但TRUNCATE TABLE 比DELETE 速度快,
且使用的系统资
源和事务日志资源少。
TRUNCATE TABLE 属于DDL 语法,
DELETE FROM table_name 属于DML 语法。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不
变。
语法格式
TRUNCATE TABLE [vc_name.][database_name.]table_name
表5- 59 参数说明
参数名称


vc_name
虚拟集群名称,可选项;
database_name
是要删除表隶属的数据库名称,可选项;省略此参数,即为
USE database_name 后的数据库名称。
table_name
是要删除其全部行的表的名称。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
978
示例
示例1:删除表t 中的所有数据。
gbase> USE test;
Query OK, 0 rows affected
gbase> CREATE TABLE t (a decimal(12,5) DEFAULT NULL, KEY idx_a (a)
USING HASH global);
Query OK, 0 rows affected
gbase> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected
Records: 3
Duplicates: 0
Warnings: 0
gbase> SELECT * FROM t;
+---------+
| a
|
+---------+
| 1.00000 |
| 2.00000 |
| 3.00000 |
+---------+
3 rows in set
gbase> TRUNCATE TABLE t;
Query OK, 3 rows affected
gbase> SELECT * FROM t;
Empty set