doris学习3:查询优化,索引与执行计划
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;
更多推荐
所有评论(0)