GaussDB(DWS) inlist2join优化介绍
Inlist2join优化
目前很多场景中,大量使用Inlist语法作为查询条件场景,例如视频云场景:Inlist通常使用在车牌号、手机号、人脸特征值等等,这些都含有大量的inlist元素。在这种场景下,应用inlist优化能够极大提升查询效率。
1.什么是inlist
要解释什么是inlist优化,首先要明白什么是inlist。在查询过程中,可以在WHERE子句中使用IN(list)取出符合过滤条件的值,其范围是list列表中的所有元素。In可以理解为一个范围比较操作符,这个范围被指定为IN之后的list列表中的所有元素。参数list表示值列表,当查询匹配到list列表中的任何一个值时,则条件为TRUE,查询匹配成功。这种语法被称为inlist。
2.什么是inlist2join优化?为什么要用到inlist2join优化?
在路径生成的过程中,目标是选择一条代价最小的最优路径。Inlist2join优化是在生成路径过程中进行的优化。对于一条inlist查询,从语义层面上查询解释器会将inlist转换成多个等值条件的OR操作或者是inlist内元素类型的数组,时间复杂度为O(n),这种情况下数据库的查询效率是很低的。而inlist2join优化要做的是,在SQL语句中,当inlist元素数量到达一定程度满足我们设定的阈值条件,此时会将inlist内元素看成一个集合并且换成一个hashjoin,将其临时构建成一张临时表,inlist内的元素作为hashjoin的内表,则此时原来的条件就会被转换成hash匹配,时间复杂度将会从O(n)变成O(1),大大提升效率,从而实现性能的提升。
3.结果展示
我们通过TPCDS中的一个查询,进行inlist2join优化的效果展示。查询中我们主要关注查询代价和WHERE子句中的inlist查询,对比当inlist元素较多时,采用inlist2join优化和未采用时计划的区别。
查询语句:
select s_store_name,sum(ss_net_profit)
from store_sales,date_dim,store,
(select ca_zip
from (
select substr(ca_zip,1,5) ca_zip
from customer_address
where substr(ca_zip,1,5) in (‘89436’,‘30868’,‘65085’…‘18586’,‘79307’,‘15492’) intersect
select ca_zip
from (SELECT substr(ca_zip,1,5) ca_zip,count( * )
from customer_address, customer
where ca_address_sk = c_current_addr_sk and c_preferred_cust_flag=‘Y’
group by ca_zip
having count( * ) > 10)A1)A2) V1
where ss_store_sk = s_store_sk and ss_sold_date_sk = d_date_sk and d_qoy = 1 and d_year = 2002 and (substr(s_zip,1,2) = substr(V1.ca_zip,1,2))
group by s_store_name
order by s_store_name
limit 100;
(注:list内元素数量为400,由于list内元素过多,不一一展示)
未进行inlist转换为join优化,由于inlist元素过多,查询时间复杂度较高,所以代价较大。
当采取inlist2join优化时,将inlist转换为join优化,构建hashjoin,查询效率提升,查询代价大大降低。
总结:
当inlist的元素足够多的时候,适宜使用inlist转换为join优化,会极大提升查询效率。而当inlist元素较少时,使用inlist2join优化,进行hashjoin的构建的代价则会高于直接进行查询,这种情况下则不适宜使用inlist2join优化。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
- 点赞
- 收藏
- 关注作者
评论(0)