ClickHouse的Join算法
ClickHouse的Join算法
ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP)通常将表组合在一起形成一个大宽表,这个过程称为数据反规范化(data denormalization)。大宽表通过避免JOIN连接来帮助提升查询效率,代价是增加了ETL(从业务系统OLTP数据库里导出数据到ClickHouse)复杂性。
然而,在某些情况下并不能总是用大宽表来替代JOIN连接,有时分析查询的源数据的一部分需要保持规范化。这些规范化表占用较少的存储并提供数据组合的灵活性,但它们需要在查询时进行某些类型的JOIN连接操作。
虽然是分析型数据库并且倾向于大宽表的方式,但是ClickHouse是完全支持连接运算的。除了支持所有标准的SQL连接类型外,ClickHouse还提供更多的特殊连接类型。这些特殊的连接类型对分析工作负载和时间序列分析非常有用。ClickHouse提供6种不同的JOIN连接算法,并且可以选择让查询计划器根据具体情况选择或者在运行时动态更改JOIN连接算法。
即使在ClickHouse中对超大的数据表做JOIN连接运算,我们也可以通过精心选择连接算法和调优相关设置,从而得到非常良好的性能。虽然可以让ClickHouse更加聪明地帮用户做选择,但是目前效果毕竟有限,而且真正高级的性能调优是离不开人的,因为人能掌握更全面的情况,以及实际业务特点和需求。本文可以帮助你理解ClickHouse内部连接的工作方式,从而帮助你做相关的优化。
ClickHouse目前(2023年3月的版本)有6种JOIN连接算法:
- Hash Join
- Parallel Hash Join
- Grace Hash Join
- Full Sorting Merge Join
- Partial Merge Join
- Direct Join
以及CH支持的连接操作的种类有以下几种。除了Hash Join之外,其他JOIN连接算法只支持部分种类,因此如果需要某种JOIN连接运算时,只能在支持它的JOIN算法中选择。
- INNER JOIN
- OUTER JOIN
- CROSS JOIN
- SEMI JOIN
- ANTI JOIN
- ANY JOIN
- ASOF JOIN
不同的JOIN算法的特点
不同的JOIN的算法有不一样的时间和空间的执行代价,基本上是要么”时间换空间“,要么”空间换时间“,不会满足“既要-又要-还要”的。并且在不同特性的数据集(例如是否已按照JOIN关键字排过序)上各个JOIN算法的表现(时间和空间执行代价)也不一样。因此根据自身数据的特点、业务需求的特点以及计算和存储资源等限制,选择合适的JOIN算法变得非常有意义。
根据上图,我们可以知道:(以上图表并不一定精确,受实际环境影响,但是上图勾勒出了大概的样子)
- 最快的JOIN算法是DIRECT,但是要求条件是右表是已经构建好的Hash Map,或者严谨点来说是”可以快速读取的Key-Value容器“,目前支持这样的表引擎只有Dictionary和Join(对,有个表引擎叫Join Table Engine);
- 除了DIRECT可能最快的JOIN算法是Parallel hash(实际上也不绝对,具体得看硬件配置),但也是最耗费内存的;
- 最省内存的JOIN算法是Partial merge,但同时也是最慢的;
- Grace hash的表现受buckets数量的配置影响,buckets数量增大后在节省内存方面媲美Partial merge,但是也牺牲了时间;
- Full sorting merge的表现受JOIN运算的表是否按照JOIN关键字排序的影响(或者近似排序,后面会解释,只要相同JOIN关键字的行能聚在一起就行了)。在表是预先排序的情况下可以做到”既要-又要“的,这点是值得关注的。
Hash Join
Hash join算法是通过哈希表查表的连接运算算法。
工作原理:
- 右侧表中的所有数据都被读取(通过 2 个线程并行,因为 max_threads = 2)并填充到内存中的哈希表中,哈希表的Key为Join Key,Value为需要用到的右侧表的列;
- 来自左侧表的数据被分数据块流式读取(由 2 个线程并行传输,因为 max_threads = 2,以下不再赘述);
- 通过查找哈希表来连接。
特点:
- 支持所有的连接类型,对表引擎不限制;
- 速度较快;
- 内存消耗与右侧表的数据大小成正比;
- 哈希表的构建和填充的最后一个合并步骤是单线程的,是可能的瓶颈。
Parallel Hash
Parallel hash join算法是在Hash join算法基础上引入了“分桶-多哈希表”的方式增加并行度而形成的连接算法。
工作原理:
- 右侧表中的所有数据都被读取(通过 2 个线程并行,因为 max_threads = 2)并填充到内存中的“分桶的”多个哈希表(按照“分桶”策略,根据桶哈希函数选择某个哈希表),每个哈希表的Key为Join Key,Value为需要用到的右侧表的列;
- 来自左侧表的数据被分数据块流式读取;
- 根据相同“桶哈希函数”为左侧表的每行确定相应的哈希表,通过查找哈希表来连接。
跟Hash join的主要区别是“分桶”,这样解决了Hash join的“哈希表的构建和填充的最后一个合并步骤是单线程的”的瓶颈问题,Parallel hash join是多线程填充每个分桶的哈希表。
特点:
- 支持INNER and LEFT JOIN,不支持ASOF,对表引擎不限制;
- 速度很快;
- 内存消耗与右侧表的数据大小成正比,比Hash join更消耗内存;
- 分桶数决定性能,通常分桶数越多(但不要超过CPU核数)性能越好,但内存消耗更多;
- 内存可能是瓶颈。
Grace Hash
Grace hash join算法是在Hash join算法中加上“分而治之”的策略。
工作原理:
- 右侧表中的所有数据都被读取(通过 2 个线程并行,因为 max_threads = 2)并按照分区哈希函数进行分桶,把属于第一个桶的数据填充到内存中的哈希表中,其他桶的数据临时存放在外存中,按桶区分(注意不是内存);
- 来自左侧表的数据被分数据块流式读取,同样分桶;
- 对于属于第一个桶的数据,通过查找当前内存中的第一个桶的哈希表(内存中也只有第一个桶的哈希表)来进行连接运算,完成后销毁哈希表;
- 对于其他桶的数据,按桶区分也临时存放在外存中;
- 第3和4步完成后,得到第一个桶的数据的连接结果已经分桶临时存放的左右两侧表的数据块;
- 对于桶编号 i(2 <= i <= n,n为桶最大编号),把右侧表桶i的数据填充到哈希表中;
- 读取左表桶i的数据,通过查找当前内存中哈希表来进行连接运算,完成后销毁哈希表;
- 依次完成桶2到桶n。
特点:
- 支持INNER and LEFT JOIN,不支持ASOF,对表引擎不限制;
- 涉及到分桶且存取外存,速度慢;
- 连接用的哈希表总是局部数据,节约内存;
- 内存消耗与左右侧表的数据大小没关系,理论上可以支持无限大小的左右表(只要外存够用);
- 桶数越多,哈希表的数据越少,内存越省,但外存存取次数更多,速度更慢;
- 外存存取是瓶颈。
Full Sorting Merge Join
首先需要知道Full sorting merge join与Partial merge join的思路与Hash类JOIN算法是不同的,属于另一类JOIN算法。
Full sorting merge join算法利用了两个有序表之间可以直接匹配的特性(想象一下拉链),不需要构建哈希表。算法描述如下:
假设左侧表和右侧表均按照Join Key升序排序,设定两个游标L和R,L指向左侧表的第一行,R指向右侧表第一行。L指向行的Join Key与R指向的行的Join Key的比较关系只会有三种:
等于
匹配上了,得到两行连接结果。
大于
右表游标R向下移动一行,因为右表能匹配上的行只会在后面。
小于
左表游标L向下移动一行,因为左表能匹配上的行只会在后面。
工作原理:
- 左侧表和右侧表分别合并排序,并在可能的情况下借助外存(参见借助外存的合并排序);
- 按照上述的算法进行连接运算。
可能的优化办法有两个:
- 减少参与排序和合并理解的数据量;
- 事先将表按照Join Key排序(或者反过来说,只在这个情况下选择此算法)。
第一个优化办法是假设左右两侧表中的很多数据并不在连接结果里(即有很多根本不会匹配上的行)。这个方法会试图建立左右两侧表的Join Key集合,通过过滤掉左右侧表的“不可能连接”的数据行来减少排序和合并连接的数据量。Join Key集合不可能无限大,由max_rows_in_set_to_optimize_join设置控制,超过限制则取消优化。
第二个优化办法就是直接跳过最耗时的排序步骤,直接合并连接。
特点:
- 支持INNER, LEFT, RIGHT, and FULL连接类型,对表引擎不限制;
- 在左右两侧表事先按照Join Key排序(或者Join Key是排序键列表的前部分)存储的情况下速度较快且内存省;
- 内存消耗与左右侧表的数据大小没关系,理论上可以支持无限大小的左右表(只要外存够用);
- 左右侧表排序是瓶颈,特别是数据量大需要借用外存进行排序的情况。
关于Join Key是排序键列表的前部分的解释:
假设表T的排序键是A、B、C,Join Key A、B就是属于这种情况。
Partial Merge Join
Partial merge join算法与Full sorting merge join算法类似,不同的是它不会全局排序左表,只会排序右表并按数据块存储在外存中,并建立min-max索引(该索引记录了每个数据块的最小Join Key和最大Join Key)。扫描左表执行JOIN连接运算。
工作原理:
- 用外部排序算法排序右侧表,存入外存并建立min-max索引;
- 分数据块流式读取左侧表的数据,对数据块局部排序,根据min-max索引定位到右侧表可能的数据块范围;
- 按照merge-join算法(与full sorting merge join一样的)完成左侧表该数据块的连接JOIN运算;
- 重复2,3步,完成左侧表所有的数据的JOIN运算。
缓存在外存中的排好序的右侧表的数据块不应该全部参与某个左侧表数据块的连接运算,而是应该尽量利用Min-max索引过滤掉哪些不需要参与连接运算的右侧表的数据块。如果左表的物理行顺序与连接键排序顺序匹配,则左表中某个数据块的Join Key的最大值和最小值变得很窄,可以过滤掉大部分的右侧表的数据块。但是如果左侧表的数据在Join Key上分布很平均,意味着每个左侧表的数据块的Join Key的最大值和最小值都差不多,这种情况下是过滤不了多少右侧表的数据块的,效率就变得非常低。
特点:
- 支持INNER, LEFT, RIGHT, and FULL连接类型,对表引擎不限制;
- 在左右两侧表事先按照Join Key排序(或者Join Key是排序键列表的前部分)存储的情况下速度较快且内存省;
- 内存消耗与左右侧表的数据大小没关系,理论上可以支持无限大小的左右表(只要外存够用);
- 通常内存效率非常高,但是执行速度相应地比Full sorting merge join要低;
- 当左侧表是排序的时候,右侧表的min-max索引能够发挥最大作用,反之左侧表越无序,右侧表的min-max索引的作用就越小;
- 右侧表排序是瓶颈,左侧表在Join Key上无序情况下是Merge join的操作是瓶颈。
Direct Join
Direct join连接算法是高速版的Hash join连接算法,高速的原因是省去了构建哈希表的这个费时过程。
工作原理:
- 右侧表是Key-value结构的表引擎,其数据驻留内存可以直接当哈希表使用;
- 来自左侧表的数据被分数据块流式读取,通过查找右侧表来完成连接运算。
特点:
- 仅支持LEFT ANY连接,右表引擎必须为Dictionary或者Join,且Join Key必须是右侧表的Key;
- 速度很快;
- 无额外内存消耗(但右侧表数据本来就在内存中);
- 几乎无瓶颈。
JOIN算法的选择
首先确定哪些JOIN算法支持所需要执行的连接的场景,然后根据性能图谱按照速度优先或者内存优先来选择合适的JOIN算法。
过滤不支持的JOIN算法
根据应用场景过滤掉不支持的连接类型。如下表所示,Hash join支持的最全,也是最早投入使用的Join算法之一。Direct join支持的最少且对右侧表的表引擎有额外限制。另外一个支持比较多的且性能比较好的是Full sorting merge join。
性能图谱
下图展示了所有JOIN算法的时间和空间性能的特点。Direct是最快的,但通用性不强;Parallel在速度上仅次于Direct join,但是内存使用是最高的;Full sorting merge join根据表的排序情况在性能上有很大差别;Grace hash join的性能受buckets数量影响很大;最省内存也是通常最慢的,这就是Partial merge join。
性能评测参考结果
下面是一些用IMDB数据为测试数据的各种JOIN连接算法的性能评测。
1百万 连接 1亿
1亿 连接 10亿
根据以上性能图谱和实际评测结果,形成以下JOIN算法选择策略。
以性能为优先选择
按照从上到下的优先级顺序以此判断:
- 以下条件满足时,选择Direct join
- 右侧表的表引擎为Dictionary或者Join的时候,且Join Key是或者可以转化为是右侧表的Key属性(Dictionary和Join表引擎都会定义Key属性)
- 连接类型为LEFT ANY JOIN
- 以下条件满足时,选择Full sorting merge join(需要把max_rows_in_set_to_optimize_join设置为0以启用相应优化)
- 左侧表的物理顺序匹配连接运算的Join Key
- 右侧表的物理顺序匹配连接运算的Join Key
- 以下条件满足时,选择Hash join或者Parallel hash join
- 右侧表数据可以全部填充进内存中的哈希表中
- 如果内存足够且希望充分利用多核,选择Parallel hash join
- 其他情况下,选择Grace hash join、Full sorting merge join或者Partial merge join,并可以做以下微调:
- Grace hash可以根据调整bucket数量在 (速度慢,内存少)到(速度快,内存多)之间找一个平衡点
- 如果左表的Join Key分布平均,则避免使用Partial merge join
- 调整max_rows_in_set_to_optimize_join设置以达到Full sorting merge join的in-set 过滤优化的最佳效果
以内存为优先选择
按照从上到下的优先级顺序以此判断:
- 以下条件满足时,选择Full sorting merge join
- 左侧表的物理顺序匹配连接运算的Join Key
- 右侧表的物理顺序匹配连接运算的Join Key
- 内存哈希表无法装下右侧表数据的情况下,选择 Grace hash join或者Partial merge join
- Hash join
- Parallel hash join
相关文章:
ClickHouse的Join算法
ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP)通常将表组合在一起形成一个…...
java面试题-RabbitMQ面试题
RabbitMQ面试题 面试官:RabbitMQ-如何保证消息不丢失 候选人: 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面考虑 第一…...
数据仓库-核心概念
数据仓库 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的…...
java中的实体类
在Java与数据库交互时,设计实体类有以下几个原因: 1、对象关系映射(ORM):实体类提供了一种将数据库中的表映射为Java对象的方式。这样,开发人员可以使用面向对象的方式操作数据库,而无需编写大…...
使用Puppeteer爬取地图上的用户评价和评论
导语 在互联网时代,获取用户的反馈和意见是非常重要的,它可以帮助我们了解用户的需求和喜好,提高我们的产品和服务质量。有时候,我们需要从地图上爬取用户对某些地点或商家的评价和评论,这样我们就可以分析用户对不同…...
GLSL ES着色器语言 使用矢量和矩阵的相关规范
目录 矢量和矩阵类型 下面是声明矢量和矩阵的例子: 赋值和构造 矢量构造函数 矩阵构造函数 构造矩阵的几种方式 访问元素 . 运算符 矢量的分量名 [ ]运算符 运算符 矢量和矩阵可用的运算符 矢量和矩阵相关运算 矢量和浮点数的…...
Himall商城- web私有方法
目录 1 Himall商城- web私有方法 1.1 /// 获取售价 1.1.1 //商品批量销售价 1.1.2 //获取组合购的价格 Himall商城- web私有方法 #region web私有方法 /// <summary> /// 获取售价 /// <para>己计算会员折</para> /// </summary> /// <para…...
Spring Boot 整合 Redis,使用 RedisTemplate 客户端
文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…...
Tomcat 接收请求并传递给工作线程池流程
文章目录 Tomcat 接收请求并传递给工作线程池流程接收 socket 连接 org.apache.tomcat.util.net.SocketProcessorBase#reset结论 Tomcat 接收请求并传递给工作线程池流程 接收 socket 连接 有两个线程 http-nio-8080-ClientPoller-0/1 (下文称为 clientPoller&…...
在Linux系统上用C++将主机名称转换为IPv4、IPv6地址
在Linux系统上用C将主机名称转换为IPv4、IPv6地址 功能 指定一个std::string类型的主机名称,函数解析主机名称为IP地址,含IPv4和IPv6,解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消…...
【硬件设计】硬件学习笔记二--电源电路设计
硬件学习笔记二--电源电路设计 一、LDO设计1.1 LDO原理1.2 LDO参数1.3 应用 二、DC-DC设计2.1 DC-DC原理2.2 DC-DC参数介绍2.4 DC-DC设计要点2.5 DC-DC设计注意事项 写在前面:本篇笔记来自王工的硬件工程师培训课程,想要学硬件的同学可以去腾讯课堂直接搜…...
day34 集合总结
集合总结 一、概述 作用:存储对象的容器,代替数组的,使用更加的便捷 所处的位置:java.util 体系结构 二、Collection 内部的每一个元素都得是引用数据类型 常用方法 add(Object o) 添加元素 addAll(Collection c) 将指定集…...
【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计
作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...
区块链技术与应用 - 学习笔记3【比特币数据结构】
大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…...
Ubuntu下高效Vim的搭建(离线版)
软件界面 可以看到界面下方有一些常用提示信息:文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下,并执行tar -xvf Vim 即可。 …...
阿里云和腾讯云2核2G服务器价格和性能对比
2核2G云服务器可以选择阿里云服务器或腾讯云服务器,腾讯云轻量2核2G3M带宽服务器95元一年,阿里云轻量2核2G3M带宽优惠价108元一年,不只是轻量应用服务器,阿里云还可以选择ECS云服务器u1,腾讯云也可以选择CVM标准型S5云…...
PYTHON(一)——认识python、基础知识
一、为什么要学习python? Python 被认为是人工智能、机器学习的首选语言,可以说是全世界最流行通用范围最广的语言,几乎可以完成所有的任务,像设计游戏、建网站、造机器人甚至人工智能等都广泛使用Python。 二、输出(…...
Python 操作 Excel
之前看过一篇文章,说一个工作多年的老员工,处理数据时只会用复制粘贴到 Excel ,天天加班工作还完不成,后来公司就招了一个会 Python 的新人,结果分分钟就处理完成。所以工作中大家经常会使用 Excel 去处理以及展示数据…...
21.添加websocket模块
这里默认读者了解websocket协议,若是还不了解可以看下这篇文章wesocket协议。 websocket主要有三个步骤,1通过HTTP进行握手连接,2进行双向通信,3.协商断开连接 第一步的握手连接需要HTTP,所以还需要使用到上一节讲解…...
Linux UDP编程流程
文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下: socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOC…...
【opencv】多版本安装
安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV,在CMakeLists.txt文件中,直接指定opencv的版本就可以找到相应版本的OpenCV,为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…...
webpack打包常用配置项
webpack打包配置项 参考链接 文件结构:最基础版 先安装 npm i webpack webpack-cli --dev 运行命令:npx webpack 进行打包 1. 配置webpack.config.js文件: const path require(path); module.exports {mode: development, // 开发环境 …...
回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图&a…...
selenium_webdriver自动化测试指南
目录 1 引言 4 1.1 目的.. 4 1.2 背景.. 4 1.3 参考资料.. 4 2 安装并引用Selenium2. 5...
红米Note12Turbo解锁BL刷入PixelExperience原生ROM系统详细教程
红米Note12Turbo的兄弟是国外POCO F5 机型,并且该机性价比非常高,国内外销量也还可以,自然不缺第三方ROM适配。目前大家心心念念的原生PixelExperience已成功发布,并且相对来说,适配程度较高,已经达到日用的…...
NoSQL之Redis配置与优化(一)
关系数据库与非关系型数据库 : ●关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于…...
Boost搜索引擎
项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…...
侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)
早就有言,秋码记录 虽早已不是原来的面貌,但这终究是不防碍我们使用golang来搭建它。 而又为什么是使用golang呢?并非是其他编程语言呢?想必 时候回答【我为什么要学习 Go 语言(golang)】这个问题了 已经给出了答案! 当然,当初学习golang时,不单单是为了搭建一个博客应…...
LeetCode——贪心篇(二)
刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗…...
Linux find
1.find介绍 linux查找命令find是linux运维中很重要、很常用的命令之一,find用于根据指定条件的匹配参数来搜索和查找文件和目录列表,我们可以通过权限、用户、用户组、文件类型、日期、大小等条件来查找文件。 2.find语法 find语法 find [查找路径] …...
街道办的网站由谁做的/重庆网站到首页排名
交换机口令设置:switch>enable ;进入特权模式switch#config terminal ;进入全局配置模式switch(config)#hostname ;设置交换机主机名switch(config)#enable secret xxx ;设置特权加密口令为xxxswitch(config)#enable password xxx ;设置特权非密口令为xxxswitch(config)#lin…...
减少网站跳出率/站长统计官网
一、为什么要挂载windows分区 随着linux越来越普及,很多linux FANS正在或者已经从windows系统过度到linux系统上了。在这个过度时期,大部分FANS在自己的机器上都是至少装了两套系统——windows和linux。这样,问题就出现了,当FANS们…...
apple开发者账号/优化设计高中
trident 7.0Kirill Grouchnikov发布了一个博客,详细介绍了即将发布的Trident可扩展动画库Java应用程序1.2版所能提供的期望。 Grouchnikov透露,版本1.2引入了一些新的API来满足某些应用程序需求。 将会有一个新的API来停止正在运行的时间轴,…...
网站建设合同性质/装修公司网络推广方案
问题:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。程序设计思想:利用静态变量指定一个计数器number,创建一个对象…...
如何修改网站模版/什么叫seo
下面的学习关于脚本,而学习脚本,变量就显得尤为重要,首先,要对变量有一个初步的认识:只对当前的SHELL有效的变量是本地变量,; 还有就是系统环境变量;变量的使用,可以简化脚本&#x…...
做英文网站费用/优化设计高中
调用mqic32.dll是简单的,但是想要返回给你的一个CompCode MQCC_OK是不容易的。 首先,确定mqclient和mqserver是ok联通的。在MQ Client(only)连接MQ Server收发消息配置 【转】已经说明。dos命令窗口用手工确认客户端连接服务端没有问题, 其次…...