易截截图软件、单文件、免安装、纯绿色、仅160KB

SQLServer索引调优实践(2) 索引覆盖

继续SQLServer索引调优实践。这次探讨一下索引覆盖 - SQL Server主要使用索引去查询你需要的数据,当索引包括所有的你请求查询的字段,SQL Server将不需要去在表中查询。这个概念称做“索引覆盖”。
SQLServer2005的Non-clustered INDEX增加了一个“包含列(included column)
”选项。在 SQL Server 2005
中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。当查询中的所有列都作为键列
或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查询性能。这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集
索引数据,从而减少磁盘 I/O 操作。
但应避免添加不必要的列。添加过多的索引列(键列或非键列)会对性能产生不良影响,应该合理使用。和Clustered
INDEX,或者组合索引,结合使用,扩大索引覆盖,但不大可能所有列都有索引覆盖,磁盘开销和数据insert
updat时索引的重新计算的时间开销是巨大的。总之,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最
佳的优化方案。
继续实践,先建个实验表 Table1:

建两个索引:
1. 主键ID是Clustered INDEX
2. 非聚簇索引Non-Clustered INDEX建立在Age列上,包含列:Count。
CREATE NONCLUSTERED INDEX [cnt] ON [dbo].[table1]
(
    [Age] ASC
)
INCLUDE ( [Count])
ON [PRIMARY]
我们的测试SQL语句是:从10万条记录中取出4条记录,两种写法
1. SELECT *
from table1 WHERE age < 100;
2. SELECT count
from table1 WHERE age < 100;
看看运行效率如何:
磁盘IO和时间:

实际执行计划:

性能居然相差20多倍。为什么?
原来第二句Select Count
在索引覆盖范围内,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。而第一句Select *
选择了所有字段,其中有一个字段Name不在索引覆盖范围内(既不在聚簇索引列,也不在非聚簇索引覆盖列内),SQL
Server可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。查询分析优化器会自动进行
选择, 上述执行计划就是优化的结果,依然比第二个index seek慢了20倍。
然后我又把sql改了一下,变成从10万条


相关文档:

sqlserver 存储过程例子

 什么是存储过程呢?
  定义:
  将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
  讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?
  Microsoft公司为什么还 ......

sqlserver 中使用程序集Assembly

                               **在sqlserver中如果要使用一个程序集一般有如下注意事项 
一:打开sqlserver 的CLR支持
 
   &nb ......

SQLServer 2005 常用的函数

字符串函数:
● ASCII('a')=97---返回字母a对应的ASCII码
● CHAR('48')=0---返回48这个ASCII码对应的字符
● LCASE('ABcdE')="abced" 或 LOWER('ABcdE')="abced"(将给定字符串转为小写)
● UCASE('ABcdE')="ABCDE" 或 UPPER('ABcdE')="ABCDE"(将给定字符串转为大写)
● LTRIM('  fgf gh  ')="fgf ......

JavaScript 和JSP 连接SqlServer 数据库

第一种 JavaScript连接数据库:
<mce:script language="JavaScript"><!--
// 创建数据库对象
var objdbConn = new ActiveXObject("ADODB.Connection");
// DSN字符串
var strdsn = "Driver={SQL Server};SERVER=192.168.0.210;UID=xhb;PWD=xhb;DATABASE=books";
// 打开数据源
objdbConn.Open(strdsn);
// ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号