【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】4.3.5
【问题描述】
以下sql,如何分别给2个表通过hint指定索引
select id from order where plat_order_id in(xxx)
union
select id from order_his where plat_order_id in(xxx)
在 UNION 语句中为每个子查询指定 INDEX Hint 的方法是,在每个子查询中单独添加 INDEX Hint。示例如下:
SELECT /*+ INDEX(order idx_plat_order_id) */ id FROM order WHERE plat_order_id IN (xxx)
UNION
SELECT /*+ INDEX(order_his idx_plat_order_id_his) */ id FROM order_his WHERE plat_order_id IN (xxx);
这里假设 order 表上的 plat_order_id 列有一个名为 idx_plat_order_id 的索引,而 order_his 表上的 plat_order_id 列有一个名为 idx_plat_order_id_his 的索引。请根据实际情况替换索引名。
详情请参考:
您可以使用 Hint 来为两个表分别指定索引,对于您的 SQL 语句,可以通过在每个查询子句中添加 Hint 来实现这一点。例如,如果想为 order 表指定名为 idx_order 的索引,为 order_his 表指定名为 idx_order_his 的索引,可以将 SQL 语句改写如下:
SELECT /*+INDEX(order idx_order)*/ id
FROM order
WHERE plat_order_id IN (xxx)
UNION
SELECT /*+INDEX(order_his idx_order_his)*/ id
FROM order_his
WHERE plat_order_id IN (xxx);
至于创建 FORMAT OUTLINE,您可以通过如下 SQL 语句实现,这里以 SQL_TEXT 创建为例:
CREATE FORMAT OUTLINE my_outline ON
SELECT /*+INDEX(order idx_order)*/ id
FROM order
WHERE plat_order_id IN (xxx)
UNION
SELECT /*+INDEX(order_his idx_order_his)*/ id
FROM order_his
WHERE plat_order_id IN (xxx);
如果您希望通过 SQL_ID 来创建 FORMAT OUTLINE,首先您需要获取到上述 SQL 语句的 SQL_ID,然后使用以下 SQL 语句创建:
CREATE FORMAT OUTLINE my_sql_id_outline ON 'SQL_ID'
USING HINT /*+INDEX(order idx_order) INDEX(order_his idx_order_his)*/;
请注意,您需要替换 'SQL_ID' 为您查询实际的 SQL_ID。
具体信息可参考以下文档:
@论坛小助手 下面的关联语句如何使用hint分别指定a表和b表的索引
select a.*
from tableA a
left join tableB b on a.item_id = b.item_id
where a.prod_id in (xxx)
要使用 Hint 分别指定 tableA 和 tableB 的索引,可以在 SQL 语句中使用 INDEX Hint。示例如下:
SELECT /*+INDEX(a idx_tableA) INDEX(b idx_tableB)*/ a.*
FROM tableA a
LEFT JOIN tableB b ON a.item_id = b.item_id
WHERE a.prod_id IN (xxx);
这里 idx_tableA 和 idx_tableB 分别是 tableA 和 tableB 上的索引名。
具体信息可参考以下文档:
学习ing