SQL Server執(zhí)行計(jì)劃教會(huì)我如何創(chuàng)建索引?
來(lái)源:易賢網(wǎng) 閱讀:1115 次 日期:2015-08-28 15:30:04
溫馨提示:易賢網(wǎng)小編為您整理了“SQL Server執(zhí)行計(jì)劃教會(huì)我如何創(chuàng)建索引?”,方便廣大網(wǎng)友查閱!

名單

SQL Server 執(zhí)行計(jì)劃,是我們分析 SQL 執(zhí)行情況的一大利器,通過(guò)它,我們也可以很方面的查看索引的執(zhí)行,在實(shí)踐之前,需要了解一些必備技能,以下知識(shí)點(diǎn)摘自-看懂 SqlServer 查詢計(jì)劃。

SQL Server 有二種索引:聚集索引和非聚集索引。二者的差別在于:【聚集索引】直接決定了記錄的存放位置, 或者說(shuō):根據(jù)聚集索引可以直接獲取到記錄?!痉蔷奂饕勘4媪硕€(gè)信息:1.相應(yīng)索引字段的值,2.記錄對(duì)應(yīng)聚集索引的位置(如果表沒(méi)有聚集索引則保存記錄指針)。 因此,如果能通過(guò)【聚集索引】來(lái)查找記錄,顯然也是最快的。

SQL Server 會(huì)有以下方法來(lái)查找您需要的數(shù)據(jù)記錄:

【Table Scan】:遍歷整個(gè)表,查找所有匹配的記錄行。這個(gè)操作將會(huì)一行一行的檢查,當(dāng)然,效率也是最差的。

【Index Scan】:根據(jù)索引,從表中過(guò)濾出來(lái)一部分記錄,再查找所有匹配的記錄行,顯然比第一種方式的查找范圍要小,因此比【Table Scan】要快。

【Index Seek】:根據(jù)索引,定位(獲取)記錄的存放位置,然后取得記錄,因此,比起前二種方式會(huì)更快。

【Clustered Index Scan】:和【Table Scan】一樣。注意:不要以為這里有個(gè)Index,就認(rèn)為不一樣了。 其實(shí)它的意思是說(shuō):按聚集索引來(lái)逐行掃描每一行記錄,因?yàn)橛涗浘褪前淳奂饕齺?lái)順序存放的。 而【Table Scan】只是說(shuō):要掃描的表沒(méi)有聚集索引而已,因此這二個(gè)操作本質(zhì)上也是一樣的。

【Clustered Index Seek】:直接根據(jù)聚集索引獲取記錄,最快!

所以,當(dāng)發(fā)現(xiàn)某個(gè)查詢比較慢時(shí),可以首先檢查哪些操作的成本比較高,再看看那些操作在查找記錄時(shí), 是不是【Table Scan】或者【Clustered Index Scan】,如果確實(shí)和這二種操作類型有關(guān),則要考慮增加索引來(lái)解決了。 不過(guò),增加索引后,也會(huì)影響數(shù)據(jù)表的修改動(dòng)作,因?yàn)樾薷臄?shù)據(jù)表時(shí),要更新相應(yīng)字段的索引。所以索引過(guò)多,也會(huì)影響性能。 還有一種情況是不適合增加索引的:某個(gè)字段用0或1表示的狀態(tài)。例如可能有絕大多數(shù)是1,那么此時(shí)加索引根本就沒(méi)有意義。 這時(shí)只能考慮為0或者1這二種情況分開(kāi)來(lái)保存了,分表或者分區(qū)都是不錯(cuò)的選擇。

應(yīng)用分析

我們先不建任何索引(除了主鍵 ID 的聚集索引),來(lái)看一下上面 SQL 代碼,在 SQL Server 執(zhí)行計(jì)劃中的執(zhí)行情況:

名單

從上面的執(zhí)行計(jì)劃中,我們可以很直觀的看出差別,所以在寫(xiě) SQL 的時(shí)候,一定要慎重啊,這邊為了方便展示,我們還是以 ProduceTime 字段進(jìn)行排序,按照 ID 排序,雖然沒(méi)有了 SORT 性能開(kāi)銷,但是發(fā)現(xiàn)查詢記錄為“Clustered Index Scan”,這是全表查詢的意思,我們理想的應(yīng)該是“Index Seek”或者“Clustered Index Seek”,因?yàn)檫@種是按照索引查詢,速度最快。按照我們程序員的理解,應(yīng)該創(chuàng)建一個(gè)非聚集索引,比如下面 IX_Product_Provider_State 索引:

名單

“Index Seek”,這就是我們想要的效果,其實(shí)關(guān)于索引的創(chuàng)建有很多的現(xiàn)實(shí)問(wèn)題,比如組合字段索引和單個(gè)字段索引有何不同?就像上面示例中的查詢用例,如果 ProduceTime 排序在其他查詢條件中也存在,是不是應(yīng)該拉出來(lái)創(chuàng)建一個(gè)索引?還是像上面一樣,和查詢條件一起創(chuàng)建一個(gè)組合字段索引?還有一種情況就是,在一個(gè)應(yīng)用程序查詢中,存在單個(gè)字段的查詢,也存在組合字段的查詢,那這時(shí)候我們是創(chuàng)建單個(gè)字段索引?還是創(chuàng)建組合字段索引呢?這幾個(gè)問(wèn)題,你創(chuàng)建一下索引,然后用“ SQL 執(zhí)行計(jì)劃”試試就知道了。 總結(jié) 針對(duì)上面的查詢用例,我個(gè)人覺(jué)得,最好的方案是:排序字段使用 ID,按照實(shí)際應(yīng)用場(chǎng)景,提取出需要查詢的字段,避免 SELECT *,這樣會(huì)減少在添加“包含性 列”的字段,創(chuàng)建 IX_Product_Provider_State 非聚集索引,索引字段為:ProviderID 和 State,如果 State 的值不是多變的(比如值為 1 和 0),盡量不要?jiǎng)?chuàng)建 State 字段的非聚集索引。 做完這些,你會(huì)發(fā)現(xiàn),你的應(yīng)用程序像飛的一樣。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)