首页 文章 精选 留言 我的

精选列表

搜索[策略模式],共10009篇文章
优秀的个人博客,低调大师

Databend join reorder 策略

作者:王旭东 Databend 研发工程师 https://github.com/xudong963 join order 的重要性 Join order 是指在执行SQL查询时,决定多个表进行 join 的顺序。它是数据库查询优化的一个重要方面,对查询性能和效率有着重要的影响, 不同的 join order 对性能可能有数量级的影响。 优化器优化 join order 的核心流程 join plan 枚举 根据统计信息估算结果的大小 (cardinality estimation) 把 2 中的结果带入到代价模型计算枚举 plan 的 代价 (cost model) 本文中我们只关心第一步 join plan enumeration, 也就是 join reorder 算法。 join reorder 算法 贪心启发式算法 当需要 join 的表都数量过多时(通常超过10个),适合用贪心算法,其优势在于能够较快的找到还不错的 join order. 核心思想:从一张表拓展到 N 张表,每次选出使当前代价最小的一张表,加入到 join tree中,构建出 left-deep tree. 贪心算法也有很多拓展,主要拓展点是围绕如果 避免局部最优以及产生 bushy tree 枚举算法(top-down & bottom-up) 主流的两种 基于规则变换的 Top-down 枚举,可以结合 Top-down cascasde 框架通过记忆化的方式来实现 基于 DP 的 bottom-up 枚举, 典型代表 DPhyp 算法,其优势在于可以高效的产生 bushy tree 一般情况下,数据库系统会把贪心和枚举有效的结合,从而对任意数量的表 join 都能够在合理的时间内得到有效的 join order Databend join reorder 现状 databend 优化器基于 Rule 进行优化,每条 Rule 通过 pattern 来匹配 plan 中的 sub-tree。主要分为两个阶段,启发式优化和基于 cascades 框架的代价优化,两个阶段共用一套 Rule。 在启发式阶段优化结束后,会对优化后的 plan 执行 DPhyp 算法来尝试得到最优的 join order, 如果 Dphyp 优化失败,会在 CBO 中找到最优的 left-deep tree. (CBO 中不尝试进行 bushy tree 优化,因为如果 Dphyp 已经优化失败,那么尝试在 CBO 中进行 bushy tree 优化,搜索空间很有可能爆炸,如 tpcds 64) Databend 目前没有支持贪心算法 (下一阶段的 roadmap 会做相关支持来处理极端情况下的 case),首先会利用 dphyp 算法来得到最优解,如果 dphyp 失败(query 中存在不适合 dphyper 算法的 pattern),会在 cascades 框架中利用基于规则变换的 Top-down 枚举得到 left-deep tree. 如果表的数量过多,如超过十个,会在 dphyp 算法中放弃部分搜索空间来做 tradeoff。 Dphyp 的核心定义及算法 hypergraph 一个超图是一个由节点集合 V 和超边集合 E 组成的二元组 H = (V,E),其中: V是非空节点集合。 E是超边集合,超边是V的非空子集(u ⊂ V)和(v ⊂ V)的无序对(u,v),并且满足额外条件 u∩v = ∅。 有了超图就可以描述多节点之间连接。 对于上图,它们的 join condition 是 R1.a + R2.b + R3.c = R4.d + R5.e + R6.f 所以 hyperedge 就是 {R1, R2, R3} — {R4, R5, R6} csg-cmp-pair csg: connected-subgraph (连通子图) cmp: connected-complement (连通互补对) 如果两个 csg 之间没有交集,且存在超边连接,其中一个就是另一个的 cmp, 二者构成 csg-cmp-pair. 算法的核心就是通过递归无重复的枚举出所有的 csg-cmp-pair, 找出代价最小的包含所有点的 csg-cmp-pair. algorithm 算法核心:hypergraph 中的节点是有序的,节点从后往前迭代(递减),每个节点只考虑其自身及其之后(序列号更大)的节点,找到可能的连通子图及其连通互补图,构成 csg-cmp-pair, 计算并更新出其代价,当迭代到最小的节点后,会得到包含所有点的 csg-cmp-pair, 算法结束。 算法流程 EmitCsg: 寻找 {v} 的互补连通子图 a. 如果找到, EmitCsgCmp b. EnumerateCmpRec:扩展互补连通子图 如果扩展后的互补连通子图可以与 {v} 形成 csg-cmp-pair, 则 EmitCsgCmp 回到 b,继续扩展 EnumerateCsgRec: 扩展 {v} a. 得到扩展后的 {v’}, 对 {v’} 执行 1 b. 回到2,继续扩展 核心代码和数据结构定义可参考: (https://github.com/datafuselabs/databend/blob/main/src/query/sql/src/planner/optimizer/hyper_dp/dphyp.rs) Connect With Us Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。 Databend Website GitHub Discussions Twitter Slack Channel

优秀的个人博客,低调大师

IOS内测分发策略

当苹果应用没有上交appstore审核,出于开始内侧阶段时,我们如何邀请别人测试和使用? plist苹果安装包实现 使用七牛云存储解决ios7.1的app部署问题 推荐两个现在比较流行的app内测辅助网站 蒲公英 和Fir。这样的创业网站都是抓住了企业开发app,在appstore提交之前需要内测的需求,前者通过企业证书发包用户上传的应用,而后者则更多依赖UDID。这样的网站的确为开发者提供了便利,但是作为创业公司想要发展还需要突破一些瓶颈,减少对苹果平台的依赖。作为IOS开发者及发布者,对于发布应用到这些网站其实本身也存在一定的风险,app随时可能因为不可控因素,下载安装出现问题。

优秀的个人博客,低调大师

SpringBoot ~ 同源策略配置

CROS(Cross-Origin Resource Sharing)是由W3C制定的一种跨域资源共享技术标准,其目的就是为了解决前端的跨域请求。 SpringBoot配置跨域有2种方式,一是方法注解配置,二是全局配置 注解配置 @RestController @RequestMapping("/cors") public class RestfulCorsController { @RequestMapping("/") @CrossOrigin(value = "http://localhost:5000",allowedHeaders = "*",maxAge = 1800) public Map<String,String> itemOperator(@RequestBody ModelMap params){ Map<String,String> map = new HashMap<>(); map.put("name", (String) params.get("name")); System.out.println(params); return map; } } 全局配置 @Configuration public class WebMvcConfig implements WebMvcConfigurer { /* * 配置全局跨域请求 * */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/cors/**"). allowedHeaders("*"). allowedMethods("*"). maxAge(1800). allowedOrigins("*"); registry.addMapping("/**"). allowedHeaders("*"). allowedMethods("*"). maxAge(1800). allowedOrigins("http://localhost:5000"); } }

优秀的个人博客,低调大师

Java外观模式(Facade模式

Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { Connection conn = null; PreparedStatement prep = null; ResultSet rset = null; try { Class.forName( "<driver>" ).newInstance(); conn = DriverManager.getConnection( "<database>" ); String sql = "SELECT * FROM <table> WHERE <column name> = ?"; prep = conn.prepareStatement( sql ); prep.setString( 1, "<column value>" ); rset = prep.executeQuery(); if( rset.next() ) { System.out.println( rset.getString( "<column name" ) ); } } catch( SException e ) { e.printStackTrace(); } finally { rset.close(); prep.close(); conn.close(); } } 上例是Jsp中最通常的对数据库操作办法。 在应用中,经常需要对数据库操作,每次都写上述一段代码肯定比较麻烦,需要将其中不变的部分提炼出来,做成一个接口,这就引入了facade外观对象。如果以后我们更换Class.forName中的也非常方便,比如从Mysql数据库换到Oracle数据库,只要更换facade接口中的driver就可以。 我们做成了一个Facade接口,使用该接口,上例中的程序就可以更改如下: public class DBCompare { String sql = "SELECT * FROM <table> WHERE <column name> = ?"; try { Mysql msql=new mysql(sql); prep.setString( 1, "<column value>" ); rset = prep.executeQuery(); if( rset.next() ) { System.out.println( rset.getString( "<column name" ) ); } } catch( SException e ) { e.printStackTrace(); } finally { mysql.close(); mysql=null; } } 可见非常简单,所有程序对数据库访问都是使用改接口,降低系统的复杂性,增加了灵活性。 如果我们要使用连接池,也只要针对facade接口修改就可以。 由上图可以看出,facade实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法,也许你已经不知不觉在使用,尽管不知道它就是facade。 原文发布时间为:2018-08-29 本文作者:HARRIES 本文来自云栖社区合作伙伴“Java杂记”,了解相关信息可以关注“Java杂记”。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册