技术开发 频道

十步优化SQL Server中的数据访问

  7、避免使用count(*)获得表的记录数

  (1)为了获得表中的记录数,我们通常使用下面的SQL语句:

 SELECT COUNT(*) FROM dbo.orders

  这条语句会执行全表扫描才能获得行数。

  (2)但下面的SQL语句不会执行全表扫描一样可以获得行数:

SELECT rows FROM sysindexes

  
WHERE id = OBJECT_ID('dbo.Orders') AND indid < 2

  8、避免使用动态SQL

  除非迫不得已,应尽量避免使用动态SQL,因为:

  (1)动态SQL难以调试和故障诊断;

  (2)如果用户向动态SQL提供了输入,那么可能存在SQL注入风险。

  9、避免使用临时表

  (1)除非却有需要,否则应尽量避免使用临时表,相反,可以使用表变量代替;

  (2)大多数时候(99%),表变量驻扎在内存中,因此速度比临时表更快,临时表驻扎在TempDb数据库中,因此临时表上的操作需要跨数据库通信,速度自然慢。

  10、使用全文搜索搜索文本数据,取代like搜索

  全文搜索始终优于like搜索:

  (1)全文搜索让你可以实现like不能完成的复杂搜索,如搜索一个单词或一个短语,搜索一个与另一个单词或短语相近的单词或短语,或者是搜索同义词;

  (2)实现全文搜索比实现like搜索更容易(特别是复杂的搜索);

  11、使用union实现or操作

  (1)在查询中尽量不要使用or,使用union合并两个不同的查询结果集,这样查询性能会更好;

  (2)如果不是必须要不同的结果集,使用union all效果会更好,因为它不会对结果集排序。

  12、为大对象使用延迟加载策略

  (1)在不同的表中存储大对象(如VARCHAR(MAX),Image,Text等),然后在主表中存储这些大对象的引用;

  (2)在查询中检索所有主表数据,如果需要载入大对象,按需从大对象表中检索大对象。

  13、使用VARCHAR(MAX),VARBINARY(MAX) 和 NVARCHAR(MAX)

  (1)在SQL Server 2000中,一行的大小不能超过800字节,这是受SQL Server内部页面大小8KB的限制造成的,为了在单列中存储更多的数据,你需要使用TEXT,NTEXT或IMAGE数据类型(BLOB);

  (2)这些和存储在相同表中的其它数据不一样,这些页面以B-Tree结构排列,这些数据不能作为存储过程或函数中的变量,也不能用于字符串函数,如REPLACE,CHARINDEX或SUBSTRING,大多数时候你必须使用READTEXT,WRITETEXT和UPDATETEXT;

  (3)为了解决这个问题,在SQL Server 2005中增加了VARCHAR(MAX),VARBINARY(MAX) 和 NVARCHAR(MAX),这些数据类型可以容纳和BLOB相同数量的数据(2GB),和其它数据类型使用相同的数据页;

  (4)当MAX数据类型中的数据超过8KB时,使用溢出页(在ROW_OVERFLOW分配单元中)指向源数据页,源数据页仍然在IN_ROW分配单元中。

  14、在用户定义函数中使用下列非常好的实践

  不要在你的存储过程,触发器,函数和批处理中重复调用函数,例如,在许多时候,你需要获得字符串变量的长度,无论如何都不要重复调用LEN函数,只调用一次即可,将结果存储在一个变量中,以后就可以直接使用了。
 

2
相关文章