国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

2024-08-31 00:58:48
字體:
來源:轉載
供稿:網(wǎng)友

 

--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

在此處更改要插入的數(shù)據(jù),重新插入之前要刪掉所有數(shù)據(jù)

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,現(xiàn)在開始:

首先,我們插入100條數(shù)據(jù)

然后我寫了一個查詢語句:

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

 

 

這就是MSSQL的執(zhí)行計劃:表掃描:掃描表中的行

 

然后我們來看該語句對IO的讀寫:

執(zhí)行:SET STATISTICS IO ON

 * FROM T_UserInfo WHERE USERID='ABCDE6EF'

切換到消失欄顯示如下:

解釋下其意思:

四個值分別為:

    從數(shù)據(jù)緩存讀取的頁數(shù);

重要:如果對于一個SQL查詢有多種寫法,那么這四個值中的邏輯讀(logical reads)決定了哪個是最優(yōu)化的。

 

接下來我們?yōu)槠浣ㄒ粋€聚集索引

 INDEX INDEX_Userid  ON T_UserInfo (Userid)

 FROM T_UserInfo WHERE USERID='ABCDE6EF'

切換到消息欄如下顯示:

 

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

聚集索引查找:掃描聚集索引中特定范圍的行

說明,此時用了索引。

 

OK,到這里你應該已經(jīng)知道初步知道MSSQL查詢計劃和如何查看對IO的讀取消耗了吧!

 

 

接下來我們繼續(xù):

 

 IO 

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

 

如此,在數(shù)據(jù)量稍大時,索引的查詢優(yōu)勢就顯示出來了。

 

 

 

先小總結下

當你構建SQL語句時,按Ctrl+L就可以看到語句是如何執(zhí)行,是用索引掃描還是表掃描?

通過SET STATISTICS IO ON 來查看邏輯讀,完成同一功能的不同SQL語句,邏輯讀

越小查詢速度越快(當然不要找那個只有幾百條記錄的例子來反我)

  

我們再繼續(xù)深入:

 T_UserInfo.INDEX_Userid

 FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

在這里我們只看StmtText:

SELECT * FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

 

我再加上索引:

 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看下此時的圖行執(zhí)行計劃:

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

 

 

SET SHOWPLAN_ALL ON

查看StmtText:

SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

 

 

分別如下:

這說明:

第一次是表掃描,掃了7頁,也就是全表掃描

第二次是索引掃描,掃了1頁索引,2頁數(shù)據(jù)頁

第三次是索引掃描+表掃描,掃了1頁索引,7頁數(shù)據(jù)頁

[圖形界面也有對CPU和IO的消耗,也可以看出來哪個最優(yōu)!] 

 

 

 

大總結:

 

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 那坡县| 贺兰县| 繁峙县| 丰镇市| 夹江县| 耒阳市| 察雅县| 长丰县| 贵溪市| 洛宁县| 芦溪县| 九江县| 盖州市| 宝山区| 安徽省| 临夏县| 临高县| 凤阳县| 德安县| 杂多县| 溆浦县| 辽中县| 南郑县| 卢湾区| 汉寿县| 逊克县| 石首市| 会东县| 凤城市| 辽阳县| 志丹县| 称多县| 马龙县| 九龙坡区| 康马县| 四川省| 青神县| 盐山县| 农安县| 卓资县| 岫岩|