初次使用 OceanBase 的用户,经常会用大表测试各种查询,有时会感觉性能不是很快,此时需要在查询中使用 SQL Hint。

关于 SQL Hint

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

  1. /*+ hint_text */

常用 SQL Hint 有:

  • read_consistency(weak):弱一致性读,指引SQL读取相关表的分区的备副本。
  • index(table_name, index_name):指引SQL使用某个表的某个索引读取数据。
  • query_timeout(int_num):设置当前SQL的查询超时时间,单位是us。

其他常用 SQL Hints请参考附录“OceanBase 常用 SQL Hints”。

使用 SQL Hint

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

  1. SELECT /*+ hint_text [, hint_text] */ select_items FROM table_name

注意

  • 多个 SQL Hint可以叠加使用,注意功能不要冲突。

  • 在 obclient 命令行环境下,默认会忽略注释语法,导致 SQL Hint 不起作用,所以启动 obclient 时需要增加参数“-c”。

示例:在查询 SQL 中使用 SQL Hint,下面 SQL 指定查询超时时间为 10 秒。

  1. obclient> select /*+ query_timeout(10000000) */ o_id,o_c_id,o_carrier_id,o_ol_cnt,o_all_local,o_entry_d
  2. from ordr partition (p5)
  3. where o_w_id=1 and o_d_id=2 and o_id=2100;
  4. +------+--------+--------------+----------+-------------+---------------------+
  5. | O_ID | O_C_ID | O_CARRIER_ID | O_OL_CNT | O_ALL_LOCAL | O_ENTRY_D |
  6. +------+--------+--------------+----------+-------------+---------------------+
  7. | 2100 | 8 | 8 | 11 | 1 | 2020-02-15 18:57:10 |
  8. +------+--------+--------------+----------+-------------+---------------------+
  9. 1 row in set (0.01 sec)
  10. obclient>
  11. obclient> SELECT /*+ parallel(16) */ count(*) FROM big_table ;