請問在 Flink SQL 上能不能指定 WHERE 裡的判斷式的執行順序?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

請問在 Flink SQL 上能不能指定 WHERE 裡的判斷式的執行順序?

Tony Wei
Hi,

想請問是否有辦法在 Flink SQL 上指明 WHERE 裡的判斷式的執行順序,來做到一些特定情況下的
查詢優化?

舉例來說,在下面的 SQL,假如有個很耗時的 UDF 需要每次都去查詢資料庫。在這樣的狀況下,
如果可以確保優先執行 `!user.is_robot` 的判斷,再去執行後面的 UDF 的話,就能減少許多的資料
庫查詢。因為那些在 `user.is_robot` 裡得到 `true` 的數據就可以提早被丟棄,而不用去執行後面
較為花費時間的 UDF 了。

select *

from users

where !user.is_robot and UDF_NEED_TO_QUERY_DB(user)


謝謝大家的幫忙。

Best regards,
Tony Wei
Reply | Threaded
Open this post in threaded view
|

Re: 請問在 Flink SQL 上能不能指定 WHERE 裡的判斷式的執行順序?

lec ssmi
不太清楚能否直接实现你说的这种功能。不过,你可以换一种思路,比如用子查询:
select * from       ( select * from   (select *, if(user.is_robot,0, 1) flag  from users) tab_a  where flag=1) tab_b where  UDF_NEED_TO_QUERY_DB(user)



[hidden email]
 
发件人: Tony Wei
发送时间: 2019-07-27 00:37
收件人: user-zh
主题: 請問在 Flink SQL 上能不能指定 WHERE 裡的判斷式的執行順序?
Hi,
 
想請問是否有辦法在 Flink SQL 上指明 WHERE 裡的判斷式的執行順序,來做到一些特定情況下的
查詢優化?
 
舉例來說,在下面的 SQL,假如有個很耗時的 UDF 需要每次都去查詢資料庫。在這樣的狀況下,
如果可以確保優先執行 `!user.is_robot` 的判斷,再去執行後面的 UDF 的話,就能減少許多的資料
庫查詢。因為那些在 `user.is_robot` 裡得到 `true` 的數據就可以提早被丟棄,而不用去執行後面
較為花費時間的 UDF 了。
 
select *
 
from users
 
where !user.is_robot and UDF_NEED_TO_QUERY_DB(user)
 
 
謝謝大家的幫忙。
 
Best regards,
Tony Wei
Reply | Threaded
Open this post in threaded view
|

Re: 請問在 Flink SQL 上能不能指定 WHERE 裡的判斷式的執行順序?

Tony Wei
Hi,

非常感謝你的回覆。但我認為子查詢可能沒有辦法滿足我想要的功能,原因是 sql optimizar 會
嘗試做 where condition pushdown,其結果會跟原本的 sql 相似。

我在 user mailing list 上問了相同的問題,並得到了一個可行的解法 [1],給你參考看看。

Best,
Tony Wei

[1]
http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Is-it-possible-to-decide-the-order-of-where-conditions-in-Flink-SQL-tt29061.html#a29071