会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 GreatSQL 在SQL中使用 HINT 语法修改会话变量!

GreatSQL 在SQL中使用 HINT 语法修改会话变量

时间:2025-11-05 02:14:23 来源:益强数据堂 作者:数据库 阅读:239次

在 GreatSQL 支持一种新的使用优化Hint,名字叫SET_VAR,语法这个特性支持用户在查询语句里修改 GreatSQL 数据库的修改一些会话变量,当然修改只是变量对当前查询会话生效,不会影响到其他会话。使用

SET_VAR语法

SET_VAR这个hint用于临时设置系统变量的语法会话值(在单个语句的持续时间内有效)

GreatSQL 在SQL中使用 HINT 语法修改会话变量

SET_VAR的用法: SET_VAR(var_name=value)

var_name是被临时修改的会话变量名,value是修改会话变量的取值

复制greatsql> SELECT @@unique_checks;SELECT /*+ SET_VAR(unique_checks=OFF) */ @@unique_checks;SELECT @@unique_checks; SELECT /*+ SET_VAR(sort_buffer_size = 16M) */ name FROM people ORDER BY name; INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2); SELECT /*+ SET_VAR(optimizer_switch = mrr_cost_based=off) */ 1;1.2.3.4.

GreatSQL 8.0 之前的操作方法

在 GreatSQL 8.0 之前要对一个查询进行会话变量修改,需要怎么操作:

1.查询之前的变量系统变量

复制greatsql> SELECT @@optimizer_switch;1.

2.备份系统变量

复制greatsql> SET @old_optimizer_switch = @@optimizer_switch;1.

3.设置新的变量

复制greatsql> SET optimizer_switch=index_merge=off;1.

4.运行查询语句

复制greatsql> SELECT empno,ename,deptno from emp limit 1;1.

5.恢复之前的系统变量

复制greatsql> SET optimizer_switch = @old_optimizer_switch;1.

是不是香港云服务器有点繁琐,现在我们使用SET_VAR这个新特性,使用很方便的语法就可以做这个操作了。

GreatSQL 8.0 的修改操作方法

复制greatsql>explain SELECT empno,ename,deptno FROM emp WHERE deptno=10 or ename=CLARK; +----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+--------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+--------------------------------------------+ | 1 | SIMPLE | emp | NULL | index_merge | deptno,idx_ename | deptno,idx_ename | 5,63 | NULL | 4 | 100.00 | Using union(deptno,idx_ename); Using where | +----+-------------+-------+------------+-------------+------------------+------------------+---------+------+------+----------+--------------------------------------------+ 1 row in set, 1 warning (0.01 sec)1.2.3.4.5.6.7.

从执行计划上看,SQL语句使用了索引合并(type=index_merge),变量如果不想该sql使用索引合并,使用则可以通过SET_VAR进行控制。语法

复制greatsql>explain SELECT /*+ SET_VAR(optimizer_switch=index_merge=off) */ empno,修改ename,deptno FROM emp WHERE deptno=10 or ename=CLARK; +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | emp | NULL | ALL | deptno,idx_ename | NULL | NULL | NULL | 14 | 38.10 | Using where | +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec1.2.3.4.5.6.7.

这个新特性是不是很方便呢,之前由于优化器的某些设置,少量sql语句选择了错误的执行计划,导致查询语句性能低下,又不能随意更改线上数据库的变量,有了SET_VAR这个新特性,对于这种情况,可以考虑在查询语句中使用set_var优化这条语句。

我们知道,IT技术网使用hash jion时,会使用到join buffer,join buffer的大小由join_buffer_size控制,其默认值为256k,哈希连接不能使用超过此数量的内存。当哈希连接所需的内存超过可用量时,GreatSQL将使用磁盘上的文件来处理此问题,使用到了磁盘文件,性能会下降,如果只想针对单条语句设置join buffer就可以使用SET_VAR。

复制CREATE TABLE t1 (c1 INT, c2 INT); CREATE TABLE t2 (c1 INT, c2 INT); CREATE TABLE t3 (c1 INT, c2 INT);1.2.3.

分别对t1,t2,t3 插入100万,200万,300万数据

复制greatsql> SET @@cte_max_recursion_depth = 99999999; greatsql> INSERT INTO t1 WITH recursive t AS ( SELECT 1 AS c1 ,1 AS c2 UNION ALL SELECT t.c1+1,t.c1*2 FROM t WHERE t.c1 <1000000 ) SELECT * FROM t; Query OK, 1000000 rows affected (10.63 sec) Records: 1000000 Duplicates: 0 Warnings: 0 greatsql> SELECT @@join_buffer_size; +--------------------+ | @@join_buffer_size | +--------------------+ | 262144 | +--------------------+ 1 row in set (0.00 sec) greatsql> SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1); Empty set (6.91 sec) greatsql> SELECT /*+ SET_VAR(join_buffer_size=16777216) */ * FROM t1 JOIN t2 ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1); Empty set (5.87 sec)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.

注意事项

1、并非所有会话变量都允许与SET_VAR一起使用。如果设置不支持用SET_VAR更改的系统变量,则会出现警告。

复制greatsql> SELECT /*+ SET_VAR(collation_server = utf8mb4) */ 1; +---+ | 1 | +---+ | 1 | +---+ 1 row in set, 1 warning (0.01 sec) greatsql> SHOW WARNINGS\G

b2b信息网

(责任编辑:数据库)

推荐内容
  • 蓝牙错误(排除蓝牙连接问题的常见解决方法)
  • Redis 的内存淘汰策略和过期删除策略,你别再搞混了!
  • 死灰复燃!QakBot 恶意软件仍在运行中
  • 建立安全运营中心(SOC)​日志来源
  • 电脑驱动重装教程(轻松学会电脑驱动重装,解决设备冲突和性能问题)
  • 详解Linux下SSH远程文件传输命令scp