一. 問題描述
公司目前的業(yè)務(wù)是庐橙,實(shí)時(shí)和離線的數(shù)據(jù)腕窥,都導(dǎo)入StarRocks,然后后端根據(jù)前端傳入的條件來拼接SQL語句揩抡。
使用過關(guān)系型數(shù)據(jù)庫的朋友應(yīng)該知道,這樣會導(dǎo)致很多類似的SQL需要重復(fù)解析镀琉,俗稱硬解析峦嗤,給CPU帶來較大的壓力。
二. 解決方案
自定義變量:
找了下官網(wǎng)滚粟,沒有發(fā)現(xiàn)綁定變量相關(guān)的文檔寻仗,只有一個(gè)類似MySQL在查詢中使用變量的方法,感覺目前 還不能解決當(dāng)前的問題凡壤。
SET @var = (select sum(c1) from tbl);
SELECT @var, v1 from test;
SQL指紋:
后來發(fā)現(xiàn)署尤,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 支持規(guī)范化慢查詢中 SQL 語句,歸類并計(jì)算各個(gè)類型 SQL 語句的 MD5 哈希值亚侠。
以下兩個(gè) SQL 語句曹体,規(guī)范化后屬于同一類SQL。
SELECT * FROM orders WHERE customer_id=10 AND quantity>20
SELECT * FROM orders WHERE customer_id = 20 AND quantity > 100
以下為規(guī)范化后 SQL 類型硝烂。
SELECT * FROM orders WHERE customer_id=? AND quantity>?
存在問題:
因?yàn)闂l件傳參不同箕别,查詢的數(shù)據(jù)量差別很大,進(jìn)而導(dǎo)致執(zhí)行計(jì)劃的差異。
而使用了SQL指紋串稀,則兩者的執(zhí)行計(jì)劃相同除抛。雖然解決了硬解析的問題,但是帶來了另外一個(gè)問題母截。
期待同Oracle的自適應(yīng)游標(biāo)共享的功能到忽。