四海内皆兄弟

flush 缓存对inmemory有什么影响?

首先我们模拟写入1000万数据。图1这个由于我存储过程中写了一些运算,所以以每秒不到5000条的速度写入,这个性能未达到最佳。

Image

                                                       图1 

我们的表是无主键无索引。如下面连续3副图。

Image

Image

Image

我们来看一下全表查询的消耗。1000万需要2秒。因为大量读取了磁盘IO。

Image

                                                           图2

再一次执行这句,只要470毫秒,0.47秒完成。因为都在缓存处理了,所以没有physical reads磁盘读,只有一致性读。

Image

                                                           图3

当我换了一列的适合这是是count(a)而不是count(*).那么还是产生了一些磁盘读。如图4

Image

                                                                                     图4

我再SUM一下a列,全是一致性读,没有磁盘读。如图5

Image

                                                                                         图5

对a列做其他的聚合,效果一样。如图6

Image

这个时候我们把缓存清掉。再查询。如图7,会发现physical reads多了,而且执行的时间也到1.7秒,慢了很多。因为清除缓存重新加载需要时间。

Image

                                                                                         图7

打开inmemory,设置参数3G,并且开启多个进程加载。如图8

Image

                                                                                图8

把xxg的表加载到inmemory中去。如图9

Image

                                                                                图9

然后再次执行全表聚合。780毫秒完成。一致性读只有9了。比起之前的5万多,可以说忽略不计。如图10

Image

                                                                                            图10

换其他列,发现也是如此。如图11

Image

                                                                              图11

这个时候最好收集一下统计信息,如图12

Image

                                                                                   图12

然后做极值函数的测试。如图13  14。可以看出max min都很稳定20毫秒(全表无索引的情况下)  统计信息的rows也准了。

Image

                                                                                          图13

Image

                                                                                      图14

然后这个时候去count这个表,全表。如图15也只有20毫秒。和之前图2的全磁盘2秒,图3的全内存470毫秒都是较大的提升。图2和图3都没有使用inmemory,也没有收集统计信息。

Image

                                                             图15

这个时候也像刚才一样清空缓存如图16.会发现重新执行inmemory表的聚合,这里是count c列也会产生磁盘读,但是是48,比起原来没有inmemory清空缓存的5万多来说,也可以说忽略不计了。

Image

                                                                         图16

这个时候去count其他列这里是count a列,如图17。1000万单表的聚合是10-20毫秒。所以1亿的单表聚合也在1秒左右这都是正常的。

Image

                                                                                图17

小结:刷新缓存对传统来说有较大影响,对加载到inmemory的表影响很小。

Image