1. 建索引

1.1 INVERTED, 倒序索引,经常 = < > like 的字段

假设你有一张表叫 user_orders,你想对 order_status(订单状态)和 user_id 加索引,加速查询。 SQL 命令如下:

ALTER TABLE 表名_user_orders ADD INDEX idx_索引名 (字段名) USING INVERTED, ADD INDEX idx_索引名 (字段名) USING INVERTED;

可以跟布隆过滤一起用:

比如:

ALTER TABLE my_table ADD INDEX idx_id (order_id) USING INVERTED, SET ("bloom_filter_columns" = "order_id");

-- 两个一起用,完美

1.2 BITMAP,位图索引,字段类型少,经常过滤的情况

ALTER TABLE 表名 ADD INDEX idx_索引名 (字段名) USING BITMAP;

1.3 bloom_filter_columns,布隆过滤器,判断是否属于或 不属于的场景。

另外布隆过滤器,在判断是否属于,!= 这种场景下很有用。 万金油,可以跟其他任务索引组合,先用布隆过滤,再倒序定位,属于高配。

比如:

ALTER TABLE my_table ADD INDEX idx_id (order_id) USING INVERTED, SET ("bloom_filter_columns" = "order_id");

-- 两个一起用,完美

用法:

ALTER TABLE realtime_dwi.dwi_pub_clients_owner SET ("bloom_filter_columns" = "cstid,ownerid,system_code");

ALTER TABLE dwr_gk_dws.dwr_qms_cust_vend_hdr SET ("bloom_filter_columns" = "biz_no,src_sys,system_code,mdm_sys_code,mdm_t_code,cust_vend_hdr_id");

ALTER TABLE dwr_gk_dws.dwr_qms_cust_vend_hdr SET ("bloom_filter_columns" = "biz_no,system_code,mdm_t_code,mdm_sys_code");

ALTER TABLE realtime_dwi.dwi_pub_clients SET ("bloom_filter_columns" = "cstcode,system_code,cstid");

ALTER TABLE realtime_dwi.dwi_mdm_co_ent SET ("bloom_filter_columns" = "tenant_code,send_system");

ALTER TABLE realtime_dwi.dwi_pub_clients_owner SET ("bloom_filter_columns" = "system_code,cstid");

ALTER TABLE realtime_dwi.dwi_org_rel_contrast SET ("bloom_filter_columns" = "tenant_code,sys_code");

1 Bitmap 索引 (in )

CREATE INDEX idx_dwr_rebate_goods_gross_profit_pirce_policy_owner_code ON dwr_rebate_goods_gross_profit_pirce_policy (owner_code) USING BITMAP COMMENT '货主code ';

2 BloomFilter 索引 ( = !)

ALTER TABLE table_name SET ("bloom_filter_columns" = "column_name1,column_name2,column_name3");

3 NGram BloomFilter (like )

CREATE INDEX idx_column_name2 ON realtime_dwi.dwi_mdm_co_ent (send_system_details) USING INVERTED PROPERTIES("parser" = "none") COMMENT 'username inverted index';

2.执行计划优化

是用hint 来优化查询计划,/*   */  中的内容会被执行计划解析的

2.1 强行指定顺序:

SELECT /*+ LEADING(小表名, 中表名, 大表名) */ ...

2.2 强制广播小表(解决大表 Join 小表变慢的问题):

SELECT /*+ BROADCAST(小表名) */ ...

2.3 强制大表对大表 Hash Join(解决内存溢出问题):

SELECT /*+ SHUFFLE_HASH(左表, 右表) */ ...

2.4 临时增大查询内存

SELECT /*+ SET_VAR(exec_mem_limit=4294967296) */ -- 4GB

* FROM huge_table;

2.5 可以指定多次hint:

/*+ 全局Hint: 对整个查询生效 */

WITH

-- CTE中的Hint: 只影响这个CTE的执行

cte1 AS (

SELECT /*+ BROADCAST(small_table) */ * FROM large_table l JOIN small_table s ON l.id = s.id

),

cte2 AS (

SELECT /*+ SHUFFLE_HASH(t1, t2) */ * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id

)

/*+ 主查询Hint: 影响最终查询执行 */

SELECT /*+ LEADING(c1, c2, base) */ * FROM cte1 c1 JOIN cte2 c2 ON c1.id = c2.id JOIN base_table base ON c1.id = base.id;

2.6 运行时过滤(默认就开启的,所以不需要手动声明)

SELECT

/*+ SET_VAR(runtime_filter_mode="GLOBAL") */

a.*, b.*

FROM big_table a JOIN small_table b ON a.id = b.id;

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐