Table of Contents
一. 问题描述
公司目前的业务是,实时和离线的数据,都导入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的自适应游标共享的功能。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。