1.1 游标(Cursor)的慎用
游标提供了对特定集合中逐行扫描的手段,一般使用游标逐行遍历数据,根据取出的数据不同条件进行不同的操作。尤其对多表和大表定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。而如果不同的条件改成用不同的UPDATE语句往往可以得到比较好的效率提高。示例如下:
Declare Mycursor cursor for select count_no from COUNT Open Mycursor Fetch Mycursor into @vcount_no While (@@sqlstatus=0) Begin If @vcount_no=’’ 条件1 操作1 If @vcount_no=’’ 条件2 操作2 。。。 Fetch Mycursor into @vcount_no End 。。。 。。。 改为 Update COUNT set 操作1 for 条件1 Update COUNT set 操作2 for 条件2 。。。 。。。
在有些场合,有时也非得使用游标,此时也可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,可时性能得到明显提高。示例如下:
Create #tmp /* 定义临时表 */
( 字段1
字段2
。。。
)
Insert into #tmp select * from TOTAL where
…
Declare Mycursor cursor for select * from #tmp
/*对临时表定义游标*/
1.2 索引(Index)的使用原则
创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。大型数据库有两种索引即簇索引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部,而建立了簇索引的表,其数据在物理上会按照簇索引键的顺序存储,一个表只允许有一个簇索引,因此,根据B树结构,可以理解添加任何一种索引均能提高按索引列查询的速度,但会降低插入、更新、删除操作的性能,尤其是当填充因子(Fill Factor)较大时。所以对索引较多的表进行频繁的插入、更新、删除操作,建表和索引时因设置较小的填充因子,以便在各数据页中留下较多的自由空间,减少页分割及重新组织的工作。
不要随便乱建索引。索引会消耗大量空间并严重降低插,删,(相当的)改操作的性能。
不要随便用聚合索引,比如总是把聚合索引缺省地用在主key上。一个表只能有一个聚合索引,要把这好钢用在刀刃上。详见后述。
UNIQUE是非常重要的信息,如果能加一定要加上。千万不要以为identity之类的列上建索引, sql server会自动地认为是UNIQUE。
索引建议总是建议造非聚合索引,什么时候用聚合索引这得由你自己来决定。如果符合下列条件之一,你应该考虑用聚合索引。
l 结果集很大。
l 检索条件中有“范围”条件,即<,>,between之类的。
l 需要结果集group by 和/或order by。另一方面,如果某个列的变动很频繁,则不宜在该列上建聚合索引。到底怎么定,还是要让事实说话,用show plan比较一下各种方案的差异总是有必要的。
l 对于like '%xxx%'的查询,普通的索引起不了作用,可以使用FullText Search