SAP学习笔记 - Index和Buffer

今天看到了SAP数据库的一些性能措施,最重要的就是两点:
索引(index)和缓存(Buffering)。
这两种都是以空间换时间的典型代表。

SAP的索引其实是数据库的索引。
索引分为主索引和次索引。主索引是建立在主键上的。因此我们在引用数据的时候,尽量使用主键来缩小选择范围,这样可以极大的提高性能。
如果有更多字段需要经常使用来缩小范围的话,就要尽量把这些字段设置为索引。可以提高性能。

下面重点是缓存,虽然柳说用的不多,不过看了不少,写下来:
缓存分为三种:
- 全部缓存(Full Buffering)
- 普通缓存(Generic Buffering)
- 单条缓存(Single-Record Buffering)

系统的缓存空间,分为了两种:
- TABL 存放表结构,用于全部缓存和普通缓存
- TABLP 存放表的一部分,用于单条缓存

这里的两个结构,可以是看成和Select与Select Single语句相对应的,也就是在使用Select语句的时候,系统会从TABL来读取缓存信息,而Select Single的时候,系统会从TABLP来读取。也就是说,在全部缓存和普通缓存的时候,Select Single语句对缓存不起作用。反之依然。

全部缓存因为是要把全部的数据都缓存起来,所以适用于表小,修改不大的表,而且读取一般使用Select语句而不是Select Single语句。

普通缓存是指存储表的一段数据,需要设置一个关键字段数参数,来决定缓存的范围,如果关键字段数设为了2的话,则每次Select会缓存与取出数据前两个字段都相同的其他的所以的数据。所以这种缓存适用于一部分数据经常被读取到的表。
注:这里需要注意的地方是,如果第一个字段是mandt的话,那么他的全局缓存会被自动转换为一个关键字段数为1的普通缓存。这个很好理解,因为mandt是区分每一个客户端的,有这个字段的表都会在执行Select语句的时候字段被加上mandt = sessionid这样的语句,那么我们缓存的时候,只需要缓存属于每一个client的那些数据就好了,因为其他没有被缓存的client数据是那些没有登录的,是不会被访问到的。

单条缓存储存在TABLT中,有一个很显著的特点,就是当用户使用Select Single语句的时候,这种缓存不仅缓存取到的值,如果Select single没有取到值的话,系统也会把这个结果缓存起来,这样下一次这个Select Single再被执行的时候,不需要查了数据库才知道没有这个值了。所以单条储存适合庞大的表,经常使用Select Single语句的。

R/3当然也可以设置无缓存,在表被频繁修改的情况下,不应该使用缓存,否则并不能起到提高性能的作用

- Bypassing Buffer语句
这个语句使用之后的效果是不经过缓存,直接去数据库取数据。它使用于:
需要对数据进行修改的时候,需要读取原来的数据进行修改,这种修改一定要Bypassing Buffer,否则如果读取到的缓存失效就会导致存储的数据错误。
另一个使用的地方就是次索引被使用的情况下。我们知道数据库可以有主次索引,但是在缓存中,只存在主索引,次索引被禁止掉了,所以如果使用次索引进行查找数据的话,使用缓存会导致全表的比较,而不用缓存则有更好的性能。

感谢您关注我的个人博客!
为了您的更好的阅读和留言,建议您注册用户,这样您可以获得更大的权限,以及更方便的留言。
注册只需要一分钟的时间。但是您需要提供您的邮箱。注册后,密码会自动发到您的邮箱,请在第一次登录时修改。
我承诺不会将您的Email泄露给他人,或者发送垃圾邮件。

用户登录

我的微博

feedsky
抓虾
google reader
my yahoo
newsgator
bloglines
鲜果
哪吒
有道
QQ邮箱
九点
帮看