Send As SMS

2005-06-23

关于数据库技术的一些想法

1、条件索引。

create index gz_people on peoples(name) where city = 'gz'

这种索引的最大特点是并不对数据库中的所有记录都进行索引,而只对符合条件的记录进行索引,当符合条件的记录仅仅是全部记录的一个较小的子集时,这个索引可以使用更小的存储空间,而且在其他记录(不符合这个索引的过滤条件)进行更新的时候,也无需更新索引。

典型的应用场景:对于OLTP类型的数据库,最近修改的记录总是最为频繁的。假设我们想把所有的记录同步到另外的一个数据库中,这样就需要跟踪最近的修改 记录。我们可以在数据库上添加一个Synchronized标志,新增加(修改)的记录为false,而已经同步的记录为true。在大部分的情况下,记 录时同步的。如果对这个字段进行索引,索引非常巨大。通过条件索引(在这种情况下,甚至可以结合位图索引),索引规模大为减小。

进行查询时,当且仅当当前查询具有与这个条件索引相同的过滤条件时,才使用此索引,此时,可以从查询条件中剔除这些过滤条件,而在此索引上进行进一步的定位(甚至是基于索引的遍历),当查询需要对索引字段进行排序时,使用效率是最高的。

2、编译技术。
SQL的查询简单情况下,最适合使用解释的方式进行执行,包括:select表达式的求值,决定选择哪个索引等。但是否可以使用编译技术呢?通过将SQL 编译成为一个可以直接运行的代码,在编译的过程中,交织各种优化技术,把原有的解释型执行过程转变成为一个直接执行过程。

采用编译型技术肯定会复杂一些,但这个过程理论上可以让计算机自己来做,而且只要能够获得性能的提升,又不增加人的工作量(自动化),这种复杂性肯定是值得的。
在这里,编译与解释的本质区别是什么呢?解释执行,存在着一个取码、解码、执行的过程,而编译执行时,所有的取码、解码工作已经由编译器展开了,只需要直 接执行就可以了。(JVM中原有的对字节码解释执行,采用 switch(code){...} 的方式,可以理解为解释的过程,取码、译码,而采用thread技术,预先将所有的字节码对应的执行地址存放在一个数组中,然后直接顺序执行。在 SabeVM中,采用这种优化技术,号称可以把执行速度提高几倍呢)。

最重要的,编译技术并没有加大应用代码的复杂性,即使只获得10%的性能提升,在数据库这样的场合下,也是完全值得的。

0 Comments:

张贴评论

<< Home