首页 > 数据库 > SQL Server > 正文

SqlServer 执行计划及Sql查询优化初探

2024-08-31 00:58:48
字体:
来源:转载
供稿:网友

 

--DROP TABLE T_UserInfo----------------------------------------------------

CREATE TABLE T_UserInfo

(

    Userid varchar(20),  UserName varchar(20),

Tel varchar(20),

)

DECLARE @I INT

DECLARE @ENDID INT

SELECT @I = 1

在此处更改要插入的数据,重新插入之前要删掉所有数据

WHILE @I <= @ENDID

BEGIN

    INSERT INTO T_UserInfo

@I  VARCHAR(20)),

@I AS VARCHAR(20))

    SELECT @I = @I + 1

END

 

---------------------------------------------------------------------------

 T_UserInfo (Userid)

 T_UserInfo (Userid)

DROP INDEX T_UserInfo.INDEX_Userid

---------------------------------------------------------------------------

---------------------------------------------------------------------------

SET STATISTICS IO ON

SET STATISTICS IO OFF

---------------------------------------------------------------------------

 IO 是互斥的。

 

OK,现在开始:

首先,我们插入100条数据

然后我写了一个查询语句:

SqlServer 执行计划及Sql查询优化初探

 

 

这就是MSSQL的执行计划:表扫描:扫描表中的行

 

然后我们来看该语句对IO的读写:

执行:SET STATISTICS IO ON

 * FROM T_UserInfo WHERE USERID='ABCDE6EF'

切换到消失栏显示如下:

解释下其意思:

四个值分别为:

    从数据缓存读取的页数;

重要:如果对于一个SQL查询有多种写法,那么这四个值中的逻辑读(logical reads)决定了哪个是最优化的。

 

接下来我们为其建一个聚集索引

 INDEX INDEX_Userid  ON T_UserInfo (Userid)

 FROM T_UserInfo WHERE USERID='ABCDE6EF'

切换到消息栏如下显示:

 

SqlServer 执行计划及Sql查询优化初探

聚集索引查找:扫描聚集索引中特定范围的行

说明,此时用了索引。

 

OK,到这里你应该已经知道初步知道MSSQL查询计划和如何查看对IO的读取消耗了吧!

 

 

接下来我们继续:

 

 IO 

在不加聚集索引的情况下:

 

如此,在数据量稍大时,索引的查询优势就显示出来了。

 

 

 

先小总结下

当你构建SQL语句时,按Ctrl+L就可以看到语句是如何执行,是用索引扫描还是表扫描?

通过SET STATISTICS IO ON 来查看逻辑读,完成同一功能的不同SQL语句,逻辑读

越小查询速度越快(当然不要找那个只有几百条记录的例子来反我)

  

我们再继续深入:

 T_UserInfo.INDEX_Userid

 FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

在这里我们只看StmtText:

SELECT * FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

SqlServer 执行计划及Sql查询优化初探

 

我再加上索引:

 INDEX INDEX_Userid  ON T_UserInfo (Userid)

 FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

查看StmtText:

SELECT * FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

WHERE:(like([T_UserInfo].[Userid], 'ABCDE8%', NULL)) ORDERED FORWARD)Ctrl+L看下此时的图行执行计划:

SqlServer 执行计划及Sql查询优化初探

 

 

SET SHOWPLAN_ALL ON

查看StmtText:

SqlServer 执行计划及Sql查询优化初探

 

 

分别如下:

这说明:

第一次是表扫描,扫了7页,也就是全表扫描

第二次是索引扫描,扫了1页索引,2页数据页

第三次是索引扫描+表扫描,扫了1页索引,7页数据页

[图形界面也有对CPU和IO的消耗,也可以看出来哪个最优!] 

 

 

 

大总结:

 

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表