<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[badboynt的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/badboynt</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; badboynt]]></copyright><item><title><![CDATA[obproxy sql路由模块源码阅读]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126945765</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126945765</guid><author>badboynt</author><pubDate>Tue, 20 Sep 2022 08:44:48 +0800</pubDate><description><![CDATA[OBProxy作为OceanBase专用的反向代理服务器,功能非常强大。要学习obproxy，决定从源码开始阅读。首先选择路由模块。]]></description><category></category></item><item><title><![CDATA[从源码编译安装启动MatrixOne]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126674088</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126674088</guid><author>badboynt</author><pubDate>Sat, 03 Sep 2022 10:15:06 +0800</pubDate><description><![CDATA[这一步会下载很多库，如果不翻墙可能会卡住。然后更换go代理，下面两行分别是七牛云和阿里云的代理，可以分别尝试一下。这时可以成功启动，并且控制台里会输出大量的debug日志，可以去修改成error级别，也可以暂时无视他。最近开始学习matrixone，从源码开始编译。官网上有编译流程，感觉非常简单，步骤很少。centos7的干净虚拟机，更换yum源，安装golang这些就不再赘述。这里需要修改cgo目录下的Makefile文件，找到这一行添加-std=c99选项。再次执行成功，全部编译完成。]]></description><category></category></item><item><title><![CDATA[EsgynDB中的共享内存]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126598361</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126598361</guid><author>badboynt</author><pubDate>Tue, 30 Aug 2022 10:18:44 +0800</pubDate><description><![CDATA[假设在第一个进程中，一片共享内存映射到基地址0x10000000处，这片共享内存里有个指针本身的地址为0x10000100, 其指向的地址为0x10000200, 这片共享内存被第二个进程映射到基地址0x2000000处，第二个进程通过偏移0x100可以访问这个指针，但是这个指针指向的仍然是0x10000200，通过指针访问对应内存就会产生不可预知的错误。如果CacheEntry这个类有虚函数，虚函数表编译后是个固定的数据存放在数据区，程序每次运行的时候，会有一个动态绑定的过程。...]]></description><category></category></item><item><title><![CDATA[EsgynDB如何使用min_max谓词优化hash join]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126521478</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126521478</guid><author>badboynt</author><pubDate>Thu, 25 Aug 2022 11:48:06 +0800</pubDate><description><![CDATA[但是在当前场景中，第一张表的数据范围是1-100000，第二张表的数据范围是99000-199000，实际重叠范围仅有1000行左右。如果能够提前判断出这个范围，对t2就不需要进行全表扫描，只扫描1-100000范围内的1000行即可。对第一张表扫描后取出最大和最小值，再将这个最大最小值推到第二张表的scan算子中，进而优化性能。如果再使用explain语句查看详细的执行计划，出现min_max_cols，min_max_hostvars等字段，则说明该优化成功开启。若可以过滤很多数据，则性能提升明显。]]></description><category></category></item><item><title><![CDATA[EsgynDB如何建立索引]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126391492</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126391492</guid><author>badboynt</author><pubDate>Wed, 17 Aug 2022 17:59:12 +0800</pubDate><description><![CDATA[比如上面的例子，按照c2查询，那么就在c2列上建索引，就可以走索引扫描，性能非常好。但是因为只需要访问c2，c3，建立索引时可以通过with table columns(c3)语法将c3列带上，此时索引中包含所有sql语句需要访问的列，则可以直接在索引上完成查询，不需要回表。当等于在前，范围在后时，可以正确产生beginkey和endkey，反之则只有范围条件可以正常生成beginkey和endkey，导致选择性变差，多扫描数据，性能下降，甚至选择性太差时可能无法走到索引扫描。例如如下三条查询语句。...]]></description><category></category></item><item><title><![CDATA[kudu compaction操作]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126388041</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126388041</guid><author>badboynt</author><pubDate>Wed, 17 Aug 2022 15:59:24 +0800</pubDate><description><![CDATA[对于需要大量数据进行快速写入/删除的集群，可以设置更大的值。后台工作线程会一直处于工作状态，当插入操作比较频繁时，会更多时间片用于 MemRowSets 刷写磁盘变为 DiskRowSets，当插入操作比较少时候，会花更多时间片用于 Delta Compaction/RowSet Compaction，以提升长久的读取和插入性能。这个操作本质上不是为了减少文件数量，而是为了对内容进行排序重组，减少不同DRS之间key的overlap（重复），进而在检索的时候减少需要参与检索的DRS的数量。...]]></description><category></category></item><item><title><![CDATA[kudu scan操作]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126387367</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126387367</guid><author>badboynt</author><pubDate>Wed, 17 Aug 2022 15:36:25 +0800</pubDate><description><![CDATA[根据用户查询的timestamp决定在base data的基础上apply redo file或者apply undo file，得到最终数据。Delta数据部分包含REDO与UNDO两部分：这里的REDO与UNDO与关系型数据库中的REDO与UNDO日志不太相同。在关系型数据库中，REDO日志记录了更新后的数据，可以用来恢复尚未写入DataFile的已成功事务更新的数据。READ_YOUR_WRITES   如果客户端A写入了最新的值，那么A的后续操作都会读取到最新值。性能较差，但是出现故障后可以续传。.]]></description><category></category></item><item><title><![CDATA[kudu update操作]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126386417</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126386417</guid><author>badboynt</author><pubDate>Wed, 17 Aug 2022 15:04:22 +0800</pubDate><description><![CDATA[这里同样使用了一段内存作为缓冲，与insert操作的memRowset类似，update操作也是先写入deltaMemStore，然后再定期刷入到deltaFile中。deltaStore中维护的并不是主键索引的b-树，而是基于row_offset的b-树。update操作在baseData中查询主键索引，得到row_offset后，在deltaStore中可以直接通过row_offset去deltaStore中进行写入。kudu的update操作与insert操作类似，一开始需要先查询主键是否存在。...]]></description><category></category></item><item><title><![CDATA[kudu insert操作流程]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126370306</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126370306</guid><author>badboynt</author><pubDate>Tue, 16 Aug 2022 17:11:11 +0800</pubDate><description><![CDATA[访问每个rowset时，先看在不在内部实际最大最小值范围内，如果不在，则直接pass。比如一个rowset范围是12000-13000，则pass，另一个rowset范围是13000-16000，则需要进入下一步。这样做的原因是hbase的一行数据可能会flush到不同的storefile中，因此在扫描一行数据时必须要遍历所有的storefile。而kudu的做法可以保证一行数据一定就在某一个rowset中，找到这个rowset就不用再遍历其他的rowset。至此，是kudu的所有insert操作流程。..]]></description><category></category></item><item><title><![CDATA[kudu使用bloom filter来加速join操作]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126368190</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126368190</guid><author>badboynt</author><pubDate>Tue, 16 Aug 2022 16:00:08 +0800</pubDate><description><![CDATA[在以上步骤中，3是负载最终的操作，尤其是当工作节点与表的实际存储位置不在同节点上时，还会产生大量的网络IO。这样kudu在读大表时，就自动将不匹配bloom filter的数据过滤掉，不再回传给负责读大表的工作节点。根据kudu自己的测试，在应用了bloom filter来加速hash join之后，在不同场景下有大约3-15倍的性能提升。如果换个场景，比如两张大表的hash join，而且数据比例接近1比1，也就是说淘汰不了太多数据的话，这个优化应该提升不大，甚至有副作用。...]]></description><category></category></item><item><title><![CDATA[kudu index skip scan优化]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126367216</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126367216</guid><author>badboynt</author><pubDate>Tue, 16 Aug 2022 15:28:39 +0800</pubDate><description><![CDATA[Index skip scan可以在缺失主键第一列的情况下，自动补全主键第一列，将全表扫描转换成多次主键扫描。但是显而易见如果主键第一列的取值非常多，反而会导致性能下降。目前kudu中该优化默认开启，并且没有判断主键第一列取值数以决定是否关闭该优化的能力。另外目前只支持=谓词，尚且不支持范围谓词，以及IN谓词。查询条件落在tstamp列上，缺失了主键第一列，所以无法走到主键扫描。但是kudu可以可以根据主键索引得到第一列host的具体值，补全第一列后再进行查询。依次遍历所有host值，得到所有结果。...]]></description><category></category></item><item><title><![CDATA[关于kudu延迟物化的思考]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126366446</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126366446</guid><author>badboynt</author><pubDate>Tue, 16 Aug 2022 15:05:20 +0800</pubDate><description><![CDATA[这样的查询过程就减少了IO数量，提高了性能。C9列是特殊的列，选择性非常好，有一百万个不同的值。但是根据前面延迟物化的步骤，从C9过滤完结果后，又继续去读其他列进行过滤，导致性能反而下降。如下图所示，谓词数量增加后，反而耗时185毫秒，性能明显下降。当过滤出的行低于某个临界值，例如总行数的1%后，可以直接读出这些行的所有列，再执行剩下的谓词即可。由于Kudu是一个典型的列存系统，所以存在一个优化机制叫做延迟物化。在查询时会优先 过滤出谓词中涉及到的列，将符合条件的行筛选出来以后，再决定是否去读取其他列。..]]></description><category></category></item><item><title><![CDATA[EsgynDB如何选择表分区]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126351787</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126351787</guid><author>badboynt</author><pubDate>Mon, 15 Aug 2022 17:58:28 +0800</pubDate><description><![CDATA[EsgynDB如何选择表分区]]></description><category></category></item><item><title><![CDATA[如何选择aligned format和hbase format（浅谈Esgyndb中的行存与列存）]]></title><link>https://blog.youkuaiyun.com/badboynt/article/details/126346907</link><guid>https://blog.youkuaiyun.com/badboynt/article/details/126346907</guid><author>badboynt</author><pubDate>Mon, 15 Aug 2022 14:58:56 +0800</pubDate><description><![CDATA[如何选择aligned format和hbase format（浅谈Esgyndb中的行存与列存）]]></description><category></category></item></channel></rss>