视图是被经常使用的,主要是为了取数据方便、规范。比如一些计算公式可以直接放在视图里面,程序只要取就行了。
但是前这一个月我写了分货的sql程序,一家跨国公司,数据量比较大,业务规则十分的复杂。要考虑仓库存货、帐龄、订单、时间、地区比例、分货等级等。其中最复杂的是按时间地区进行多订单分货。
刚开始的时候,我写了4个表、4个视图、6个辅助存储过程、1个函数和2个主存储过程。400多张订单,1200多条产品居然分了我50多分钟,最后还导致了最终的结果表锁掉了,打不开。
后来分析了下,把视图拿掉了,直接使用表中的字段代替视图,分货的时候不断update字段。效果非常的好,再次执行只用了30多秒。
自己总结了下,问题主要是视图的运行方式有关。
个人认为:几乎所有的程序的速度主要是I/O量决定的。数据库也是这样,如果运行时I/O梁很大,自然速度慢,所以应该尽量减少不必要的I/O。具体就是减少数据库扫描的次数。
视图的运行机制的确和这个原则相反,因为视图是由select语句组成的,即使你仅仅只需要里面的1条数据,它也会遍历一次所有的select,这就大大增加了I/O。
如果数据量比较小的话,使用视图很方便,但是如果大数据量的话,使用视图作为数据的中介,的确不是个好办法,他所带来的速度损失直接和数据量有关,粗略的计算下,如果有1000数据,查找表需要1秒的话,查找视图可能是1000秒。