暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在查询中使用 SQL Hint

SQL新手 2022-12-08
1658

初次使用 OceanBase 数据库的用户,经常会用大表测试各种查询,可以在查询中使用 SQL Hint 来控制 SQL 执行时的一些参数设置,例如设置一致性级别和 SQL 超时时间等。

关于 SQL Hint

OceanBase 数据库 SQL 的执行性能跟 SQL 的执行计划有关,执行计划跟表的联接方式、查询条件和表的索引都有关系,通常这属于数据库的 SQL 引擎内部逻辑。通过在 SQL 里添加 Hint 注释,您可以改变执行计划的内容,从而改变 SQL 的执行性能。

一条语句只能包含一个 Hint 注释,并且该注释必须跟随 SELECTUPDATEINSERTREPLACE 或 DELETE 关键字。

Hint 在语句注释中的语法格式如下:

{DELETE|INSERT|SELECT|UPDATE|REPLACE} /*+ [hint_text]... */
复制

常用 SQL Hint 如下:

  • READ_CONSISTENCY Hint 弱一致性读,指定某条 SQL 所读取的表模式为弱一致性(指定参数 WEAK)或强一致性(指定参数 STRONG),指引 SQL 读取相关表的分区的备副本。

    说明

    READ_CONSISTENCY Hint 仅仅是使当前查询可以进行弱一致性读,完全的读写分离还是要有路由等的支持。OceanBase 数据库的读写分离功能依赖 OBProxy 的 LDC 功能,如果需要使用读写分离功能,建议先进行 LDC 配置。有关读写分离的详细信息,请参见 读写分离

  • INDEX Hint 指示优化器对指定的表使用索引扫描。

  • QUERY_TIMEOUT Hint 指示服务器设定某条 SQL 执行时的超时时间,单位是 us。

有关其他常用 SQL Hint 的详细信息,请参考 注释 章节。

使用 SQL Hint

SQL Hint 通常用在 SQL 语句里,并不限于查询 SQL。这里以查询 SQL 为例,简单的语法格式如下:

SELECT /*+ hint_text [, hint_text] */ select_items FROM table_name;
复制

说明

  • 多个 SQL Hint 可以叠加使用,注意功能不要冲突。
  • 在 obclient 命令行环境下,默认会忽略注释语法,导致 SQL Hint 不起作用,所以启动 obclient 时需要增加参数"-c"。

示例 1:指定 SQL 所读取的表模式为弱一致性

obclient> SELECT /*+ READ_CONSISTENCY(WEAK) */ * 
    FROM employees 
    WHERE employees.department_id = 1001;
Query OK, 0 row affected 
复制

示例 2:指定 SQL 强制走索引

obclient> SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id
FROM employees 
WHERE department_id > 50;
复制

示例 3:指定数据库按照表在 FROM 子句中出现的顺序进行表联接

obclient> SELECT /*+ ORDERED */ * 
    FROM employees t1,department t2
    WHERE t1.department_id = t2.department_id;
Query OK, 0 row affected 
复制

示例 4:使用 SQL Hint 指定查询超时时间为 10 秒

obclient> SELECT /*+ query_timeout(10000000) */ o_id,o_c_id,o_carrier_id,o_ol_cnt,o_all_local,o_entry_d 
    FROM ordr   
    WHERE o_w_id=1 and o_d_id=2 AND o_id=2100;
+------+--------+--------------+----------+-------------+------------+
| o_id | o_c_id | o_carrier_id | o_ol_cnt | o_all_local | o_entry_d  |
+------+--------+--------------+----------+-------------+------------+
| 2100 |      8 |            8 |       11 |           1 | 2020-02-15 |
+------+--------+--------------+----------+-------------+------------+
1 row in set 
复制

示例 5:在执行 SQL 语句时避免使用并行查询模式

obclient> SELECT /*+ no_use_px parallel(8) */ * FROM(
    SELECT /*+ no_use_px parallel(8) */ no_w_id, no_d_id, MAX(no_o_id) max_no_o_id, MIN(no_o_id) min_no_o_id, COUNT(*) count_no
    FROM nord
    GROUP BY no_w_id, no_d_Id
    ) x
   WHERE max_no_o_id - min_no_o_id+ 1!= count_no;
Empty set 
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论