一. 问题描述
公司目前的业务是,实时和离线的数据,都导入StarRocks,然后后端根据前端传入的条件来拼接SQL语句。
使用过关系型数据库的朋友应该知道,这样会导致很多类似的SQL需要重复解析,俗称硬解析,给CPU带来较大的压力。
二. 解决方案
自定义变量:
找了下官网,没有发现绑定变量相关的文档,只有一个类似MySQL在查询中使用变量的方法,感觉目前 还不能解决当前的问题。
SET @var = (select sum(c1) from tbl);
SELECT @var, v1 from test;
SQL指纹:
后来发现,StarRock支持SQL指纹
https://docs.starrocks.io/zh-cn/latest/administration/Query_planning#%E6%9F%A5%E7%9C%8B-sql-%E6%8C%87%E7%BA%B9
StarRocks 支持规范化慢查询中 SQL 语句,归类并计算各个类型 SQL 语句的 MD5 哈希值。
以下两个 SQL 语句,规范化后属于同一类SQL。
SELECT * FROM orders WHERE customer_id=10 AND quantity>20
SELECT * FROM orders WHERE customer_id = 20 AND quantity > 100
以下为规范化后 SQL 类型。
SELECT * FROM orders WHERE customer_id=? AND quantity>?
存在问题:
因为条件传参不同,查询的数据量差别很大,进而导致执行计划的差异。
而使用了SQL指纹,则两者的执行计划相同。虽然解决了硬解析的问题,但是带来了另外一个问题。
期待同Oracle的自适应游标共享的功能。