Using Application Algorithm to improve Database performance
RWP团队谈性能优化之大开眼界篇(二)应用程序算法 您觉得,应用程序的算法优化与否,最多能对系统性能有多大影响? A. 20-30% B. 50% C. 10倍左右 D. 100倍或更多 E. 没什么大影响吧 处理1行数据1ms,倒是挺快的,但是如果一行一行处理,处理万亿级别的数据的话,就要1ms * 1,000,000,000,000的时间,也就是32年的时间,32年之后处理完了,还能有什么意义呢? 这个计算,告诉我们,当需要处理的数据量很大的时候,用处理少量数据的办法(一行一行处理),就是不合适的了 Row by row(逐行)的数据处理方法,是一个进程处理数据,每次处理一行。对于小的数据集非常适合。处理大量数据的时候,就不适合了。 Arrays(数组)的数据处理方法,也是一个进程处理数据,每次处理一组数据。对于小的数据集非常适合,比row by row的方法效率高,因为减少了数据中网络上往返的时间,commit的时间,和客户端与服务器中的code path。 使用Arrays(数组)的方法,array size设多大比较合适呢?我们进行了demo. Demo里面有7个选手,每个选手用不同的array size向数据库里面插入数据: Demo中可以看到,4x选手(Array size = 4),比1x选手(Array size = 1,也就是row by row),处理速度快很多。这是因为Oracle数据库对于array interface是做了特别优化的,array interface和非array interface的code path是不同的 另外也可以看到,array size并不是越大越好。Array size只是定义了在数据库这个层面,每次处理的数据量,但是在客户端和数据库服务器之间,这些数据还要按照网络传输的单元去缓存和传输。所以当array size到达一定大小的时候,array size对性能大小的影响就没那么大了。Demo里面的后三个选手,用的时间都差不多。大家也不用纠结array size=4096好,还是4099好 Row by row和Arrays都是一个进程处理数据。 如果数据量大,系统上又有那么多资源,需要并行才能把资源用起来。现实中很多人的办法是,把原有的row by row或者arrays的代码拿过来,并行执行,这种方法称为手动...