OceanBase 数据库SQL Hint

本文介绍了OceanBase数据库中SQL Hint的使用。阐述了Hint在语句注释中的语法格式、常用SQL Hint类型,如弱一致性读、强制走索引、设定超时时间等。还强调多个Hint可叠加使用,命令行需加参数“-c”,并给出四个使用示例及执行计划展示。

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

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

常用 SQL Hint 如下:

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

    说明

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

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

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

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

使用 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 所读取的表模式为弱一致性

  1. 查询 dws_ny 表 id 为 1011 的数据。

    obclient> SELECT /*+ READ_CONSISTENCY(WEAK) */ *
                        FROM dws_ny
                        WHERE dws_ny.id = 1011;
    +------+------+--------+-------+-----------+
    | ID   | AGE  | NAME   | SAL   | C_DATE    |
    +------+------+--------+-------+-----------+
    | 1011 |   22 | 张三   | 13.11 | 09-SEP-19 |
    +------+------+--------+-------+-----------+
    1 row in set
    
  2. 展示执行计划。

    obclient> EXPLAIN EXTENDED SELECT /*+ READ_CONSISTENCY(WEAK) */ *
              FROM dws_ny
              WHERE dws_ny.id = 1011\G
    *************************** 1. row ***************************
    Query Plan: ====================================
    |ID|OPERATOR |NAME  |EST. ROWS|COST|
    ------------------------------------
    |0 |TABLE GET|DWS_NY|1        |46  |
    ====================================
    
    Outputs & filters:
    -------------------------------------
      0 - output([DWS_NY.ID(0x7f9d9cfe02e0)], [DWS_NY.USER_ID(0x7f9d9cfe0690)], [DWS_NY.NAME(0x7f9d9cfe0980)], [DWS_NY.SAL(0x7f9d9cfe0c70)], [DWS_NY.C_DATE(0x7f9d9cfe0f60)]), filter(nil),
          access([DWS_NY.ID(0x7f9d9cfe02e0)], [DWS_NY.USER_ID(0x7f9d9cfe0690)], [DWS_NY.NAME(0x7f9d9cfe0980)], [DWS_NY.SAL(0x7f9d9cfe0c70)], [DWS_NY.C_DATE(0x7f9d9cfe0f60)]), partitions(p0),
          is_index_back=false,
          range_key([DWS_NY.ID(0x7f9d9cfe02e0)]), range[1011 ; 1011],
          range_cond([DWS_NY.ID(0x7f9d9cfe02e0) = 1011(0x7f9d9cfdfbc0)])
    
    Used Hint:
    -------------------------------------
      /*+
          READ_CONSISTENCY("WEAK")
      */
    
    Outline Data:
    -------------------------------------
      /*+
          BEGIN_OUTLINE_DATA
          FULL(@"SEL$1" "SYS.DWS_NY"@"SEL$1")
          READ_CONSISTENCY("WEAK")
          END_OUTLINE_DATA
      */
    
    Plan Type:
    -------------------------------------
    LOCAL
    
    Optimization Info:
    -------------------------------------
    
    DWS_NY:table_rows:9, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:local_storage, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback
    
    Parameters
    -------------------------------------
    
    1 row in set
    

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

  1. 通过指定 SQL 强制走索引,查询出 id > 1018 的数据。

    obclient> SELECT /*+ INDEX (dws_ny idx7)*/ id, age
                   FROM dws_ny
                   WHERE id > 1018;
    +------+------+
    | ID   | AGE  |
    +------+------+
    | 1027 |   22 |
    | 1022 |   22 |
    | 1033 |   22 |
    | 1035 |   22 |
    | 1021 |   22 |
    | 1026 |   22 |
    +------+------+
    6 rows in set
    
  2. 展示执行计划。

    obclient> EXPLAIN EXTENDED SELECT /*+ INDEX (dws_ny idx7)*/ id, age
                       FROM dws_ny
                       WHERE id > 1018\G
    *************************** 1. row ***************************
    Query Plan: ===========================================
    |ID|OPERATOR  |NAME        |EST. ROWS|COST|
    -------------------------------------------
    |0 |TABLE SCAN|DWS_NY(IDX7)|1        |92  |
    ===========================================
    
    Outputs & filters:
    -------------------------------------
      0 - output([DWS_NY.ID(0x7f9de45e0a90)], [DWS_NY.AGE(0x7f9de45e1480)]), filter([DWS_NY.ID(0x7f9de45e0a90) > 1018(0x7f9de45e0370)]),
          access([DWS_NY.ID(0x7f9de45e0a90)], [DWS_NY.AGE(0x7f9de45e1480)]), partitions(p0),
          is_index_back=true, filter_before_indexback[true],
          range_key([DWS_NY.C_DATE(0x7f9de4621fb0)], [DWS_NY.ID(0x7f9de45e0a90)]), range(MIN,MIN ; MAX,MAX)always true
    
    Used Hint:
    -------------------------------------
      /*+
          INDEX(@"SEL$1" "SYS.DWS_NY"@"SEL$1" "IDX7")
      */
    
    Outline Data:
    -------------------------------------
      /*+
          BEGIN_OUTLINE_DATA
          INDEX(@"SEL$1" "SYS.DWS_NY"@"SEL$1" "IDX7")
          END_OUTLINE_DATA
      */
    
    Plan Type:
    -------------------------------------
    LOCAL
    
    Optimization Info:
    -------------------------------------
    
    DWS_NY:table_rows:9, physical_range_rows:9, logical_range_rows:9, index_back_rows:0, output_rows:0, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[IDX7], pruned_index_name[DWS_NY], estimation info[table_id:1100611139453852, (table_type:1, version:0-1654452010335323-1654452010335323, logical_rc:0, physical_rc:0), (table_type:0, version:1654452010335323-1654452010335323-9223372036854775807, logical_rc:9, physical_rc:9)]
    Parameters
    -------------------------------------
    
    1 row in set
    

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

  1. 通过表联接,查询出 dws_ny 与 dws_yn 表的 id 相同的数据。

    obclient> SELECT /*+ ORDERED */ *
                    FROM dws_ny a,dws_yn b
                    WHERE a.id = b.id;
    +------+------+--------+-------+-----------+------+------+--------+-------+-----------+
    | ID   | AGE  | NAME   | SAL   | C_DATE    | ID   | AGE  | NAME   | SAL   | C_DATE    |
    +------+------+--------+-------+-----------+------+------+--------+-------+-----------+
    | 1011 |   22 | 张三   | 13.11 | 09-SEP-19 | 1011 |   22 | 张三   | 13.11 | 09-SEP-19 |
    | 1014 |   22 | 张三   | 22.21 | 08-AUG-20 | 1014 |   22 | 张三   | 22.21 | 08-AUG-20 |
    | 1022 |   22 | 李四   | 23.34 | 06-JUN-19 | 1022 |   22 | 李四   | 23.34 | 06-JUN-19 |
    | 1027 |   22 | 李四   | 12.22 | 05-MAY-19 | 1027 |   22 | 李四   | 12.22 | 05-MAY-19 |
    +------+------+--------+-------+-----------+------+------+--------+-------+-----------+
    4 rows in set
    
  2. 展示执行计划。

    obclient> EXPLAIN EXTENDED SELECT /*+ ORDERED */ *
                        FROM dws_ny a,dws_yn b
                        WHERE a.id = b.id\G
    *************************** 1. row ***************************
    Query Plan: ====================================
    |ID|OPERATOR   |NAME|EST. ROWS|COST|
    ------------------------------------
    |0 |MERGE JOIN |    |9        |96  |
    |1 | TABLE SCAN|A   |9        |46  |
    |2 | TABLE SCAN|B   |9        |46  |
    ====================================
    
    Outputs & filters:
    -------------------------------------
      0 - output([A.ID(0x7f9de45e0970)], [A.AGE(0x7f9de45e1010)], [A.NAME(0x7f9de45e1300)], [A.SAL(0x7f9de45e15f0)], [A.C_DATE(0x7f9de45e18e0)], [B.ID(0x7f9de45e0c60)], [B.AGE(0x7f9de45e1bd0)], [B.NAME(0x7f9de45e1ec0)], [B.SAL(0x7f9de45e21b0)], [B.C_DATE(0x7f9de45e24a0)]), filter(nil),
          equal_conds([A.ID(0x7f9de45e0970) = B.ID(0x7f9de45e0c60)(0x7f9de45e0250)]), other_conds(nil),
          merge_directions([ASC])
      1 - output([A.ID(0x7f9de45e0970)], [A.AGE(0x7f9de45e1010)], [A.NAME(0x7f9de45e1300)], [A.SAL(0x7f9de45e15f0)], [A.C_DATE(0x7f9de45e18e0)]), filter(nil),
          access([A.ID(0x7f9de45e0970)], [A.AGE(0x7f9de45e1010)], [A.NAME(0x7f9de45e1300)], [A.SAL(0x7f9de45e15f0)], [A.C_DATE(0x7f9de45e18e0)]), partitions(p0),
          is_index_back=false,
          range_key([A.ID(0x7f9de45e0970)]), range(MIN ; MAX)always true
      2 - output([B.ID(0x7f9de45e0c60)], [B.AGE(0x7f9de45e1bd0)], [B.NAME(0x7f9de45e1ec0)], [B.SAL(0x7f9de45e21b0)], [B.C_DATE(0x7f9de45e24a0)]), filter(nil),
          access([B.ID(0x7f9de45e0c60)], [B.AGE(0x7f9de45e1bd0)], [B.NAME(0x7f9de45e1ec0)], [B.SAL(0x7f9de45e21b0)], [B.C_DATE(0x7f9de45e24a0)]), partitions(p0),
          is_index_back=false,
          range_key([B.ID(0x7f9de45e0c60)]), range(MIN ; MAX)always true
    
    Used Hint:
    -------------------------------------
      /*+
          ORDERED
      */
    
    Outline Data:
    -------------------------------------
      /*+
          BEGIN_OUTLINE_DATA
          LEADING(@"SEL$1" ("SYS.A"@"SEL$1" "SYS.B"@"SEL$1" ))
          USE_MERGE(@"SEL$1" ("SYS.B"@"SEL$1" ))
          PQ_DISTRIBUTE(@"SEL$1" ("SYS.B"@"SEL$1" ) LOCAL LOCAL)
          FULL(@"SEL$1" "SYS.A"@"SEL$1")
          FULL(@"SEL$1" "SYS.B"@"SEL$1")
          END_OUTLINE_DATA
      */
    
    Plan Type:
    -------------------------------------
    LOCAL
    
    Optimization Info:
    -------------------------------------
    
    
    A:table_rows:9, physical_range_rows:9, logical_range_rows:9, index_back_rows:0, output_rows:9, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[DWS_NY], pruned_index_name[IDX7], estimation info[table_id:1100611139453851, (table_type:1, version:0-1654452010335323-1654452010335323, logical_rc:0, physical_rc:0), (table_type:0, version:1654452010335323-1654452010335323-9223372036854775807, logical_rc:9, physical_rc:9)]
    
    B:table_rows:9, physical_range_rows:9, logical_range_rows:9, index_back_rows:0, output_rows:9, est_method:local_storage, optimization_method=cost_based, avaiable_index_name[DWS_YN], estimation info[table_id:1100611139453853, (table_type:1, version:0-1654452010335323-1654452010335323, logical_rc:0, physical_rc:0), (table_type:0, version:1654452010335323-1654452010335323-9223372036854775807, logical_rc:9, physical_rc:9)]
    Parameters
    -------------------------------------
    
    1 row in set
    

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

  1. 通过 SQL Hint 指定 dws_ny 表查询超时时间为 10 秒的数据。

    obclient> SELECT /*+ query_timeout(10000000) */ id,age,name,sal
                   FROM dws_ny
                   WHERE id=1011 and age=22 AND sal=13.11;
    +------+------+--------+-------+
    | ID   | AGE  | NAME   | SAL   |
    +------+------+--------+-------+
    | 1011 |   22 | 张三   | 13.11 |
    +------+------+--------+-------+
    1 row in set
    
  2. 展示执行计划。

    obclient> EXPLAIN EXTENDED SELECT /*+ query_timeout(10000000) */ id,age,name,sal
                        FROM dws_ny
                        WHERE id=1011 and age=22 AND sal=13.11;
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Query Plan                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | ====================================
    |ID|OPERATOR |NAME  |EST. ROWS|COST|
    ------------------------------------
    |0 |TABLE GET|DWS_NY|1        |46  |
    ====================================
    
    Outputs & filters:
    -------------------------------------
      0 - output([DWS_NY.ID(0x7f9de45e1b80)], [DWS_NY.AGE(0x7f9de45e2c20)], [DWS_NY.NAME(0x7f9de45e49d0)], [DWS_NY.SAL(0x7f9de45e3cc0)]), filter([DWS_NY.AGE(0x7f9de45e2c20) = 22(0x7f9de45e2500)], [DWS_NY.SAL(0x7f9de45e3cc0) = 13.11(0x7f9de45e35a0)]),
          access([DWS_NY.ID(0x7f9de45e1b80)], [DWS_NY.AGE(0x7f9de45e2c20)], [DWS_NY.SAL(0x7f9de45e3cc0)], [DWS_NY.NAME(0x7f9de45e49d0)]), partitions(p0),
          is_index_back=false, filter_before_indexback[false,false],
          range_key([DWS_NY.ID(0x7f9de45e1b80)]), range[1011 ; 1011],
          range_cond([DWS_NY.ID(0x7f9de45e1b80) = 1011(0x7f9de45e1460)])
    
    Used Hint:
    -------------------------------------
      /*+
          QUERY_TIMEOUT(10000000)
      */
    
    Outline Data:
    -------------------------------------
      /*+
          BEGIN_OUTLINE_DATA
          FULL(@"SEL$1" "SYS.DWS_NY"@"SEL$1")
          QUERY_TIMEOUT(10000000)
          END_OUTLINE_DATA
      */
    
    Plan Type:
    -------------------------------------
    LOCAL
    
    Optimization Info:
    -------------------------------------
    
    DWS_NY:table_rows:9, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:0, est_method:local_storage, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback
    
    Parameters
    -------------------------------------
     |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set

<think>好的,用户想了解如何在OceanBase数据库中绑定或关联两张表。我需要先理解“绑定”和“关联”的具体含义。通常,在数据库中,表之间的关联通常是通过外键约束或者JOIN查询实现的。不过OceanBase作为分布式数据库,可能有不同的机制。 首先,我需要回顾一下OceanBase的文档。根据引用[3],OceanBase支持分布式的数据分布联接方式,比如HASH、BROADCAST等。这可能涉及到在分布式环境下如何高效地执行表连接操作。用户提到的“绑定”可能是指将表在物理存储上关联,比如分区策略,或者通过主键-外键关系建立约束。 接下来,外键约束是传统数据库常用的方法,但OceanBase作为分布式数据库,是否支持外键需要确认。根据引用[2],OceanBase采用单机分布式一体化架构,可能在某些模式下支持类似单机数据库的特性,包括外键。但需要明确说明。 另外,JOIN操作是SQL层面的关联,用户可能需要知道如何编写有效的JOIN语句,特别是在分布式环境下如何优化。引用[3]提到的PQ_DISTRIBUTE HINT可能用于优化分布式JOIN的执行计划,比如小表广播或哈希分布,这需要详细解释。 还有,用户可能关心表结构设计,比如分区键的选择是否影响关联效率。如果两个表的分区键相同,可能减少数据重分布,提升JOIN性能。例如,如果两张表都按deptno分区,关联时可以直接在本地节点进行,减少网络传输。 此外,引用[4]提到OCP支持表级别恢复,这可能与表关联后的运维有关,但用户问题更偏向于关联方法,这部分可能不需要深入。 总结下来,回答应涵盖外键约束、JOIN查询、分区策略优化以及HINT的使用。同时需要结合OceanBase的分布式特性,说明如何利用这些方法高效关联表。需要确保每个步骤都清晰,并引用相关文档支持。</think>在OceanBase数据库中实现表之间的关联或绑定,主要通过以下方法实现: ### 一、通过外键约束建立逻辑关联 1. 在表设计阶段使用外键(FOREIGN KEY)约束: ```sql CREATE TABLE department ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ); CREATE TABLE employee ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, FOREIGN KEY (dept_id) REFERENCES department(dept_id) ); ``` *注:虽然OceanBase支持外键语法,但在分布式场景下建议谨慎使用,可能影响性能[^2]* ### 二、通过JOIN操作实现数据关联 1. 标准SQL JOIN语法: ```sql SELECT e.emp_name, d.dept_name FROM employee e JOIN department d ON e.dept_id = d.dept_id; ``` 2. 分布式环境优化技巧: - 使用相同分区键:当两个表的分区键相同时,OceanBase会自动进行本地化JOIN ```sql -- 创建分区表时指定相同分区键 CREATE TABLE department ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ) PARTITION BY HASH(dept_id) PARTITIONS 4; CREATE TABLE employee ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT ) PARTITION BY HASH(dept_id) PARTITIONS 4; ``` ### 三、使用HINT优化分布式JOIN 通过PQ_DISTRIBUTE Hint控制数据分布策略[^3]: ```sql SELECT /*+ PQ_DISTRIBUTE(emp HASH, dept BROADCAST) */ e.emp_name, d.dept_name FROM employee e JOIN department d ON e.dept_id = d.dept_id; ``` 可选策略: - `HASH`:哈希分布 - `BROADCAST`:广播小表 - `PARTITION`:按分区分布 - `NONE`:默认自动选择 ### 四、物理绑定(表组) 通过TABLEGROUP实现物理存储绑定: ```sql CREATE TABLEGROUP dept_emp_group; CREATE TABLE department (...) TABLEGROUP = dept_emp_group; CREATE TABLE employee (...) TABLEGROUP = dept_emp_group; ``` 优势:相同表组的表会自动保持相同分区分布策略,提升关联效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值