[轉(zhuǎn)帖]sqlserver執(zhí)行計劃需要關(guān)注的幾個點
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
執(zhí)行計劃需要關(guān)注的幾個點 1.步驟影響的行可以根據(jù)連接線的粗細(xì)來判斷 2.sql查詢數(shù)據(jù)的方式 3.圖形執(zhí)行計劃從右到左,從上到下看 下面是Sql Server查詢數(shù)據(jù)的五種方式,這對我們理解執(zhí)行計劃非常重要。五種方式如下。 【Table Scan】:遍歷整個表來查找匹配的數(shù)據(jù)行,速度最慢。 【Index Scan】:依據(jù)索引先從表中過濾出一部分記錄,然后再查找所有匹配的數(shù)據(jù)行。查詢速度比Table Scan稍快。 【Index Seek】:依據(jù)索引,定位記錄的存放位置,然后再取得記錄,因此,其查詢速度比前面兩種都快。 【Clustered Index Scan】:按聚集索引(一般是主鍵)遍歷整個表,因為它的記錄就是按聚集索引來順序存放的。注意它與Table Scan的區(qū)別,其實它們都是進(jìn)行全表掃描,只不過Table Scan是不帶索引的掃描,而Clustered Index Scan是按聚集索引掃描的。(效率和Table Scan差不多) 【Clustered Index Seek】:聚集索引獲取記錄,它是直接拿到那條記錄,而沒有進(jìn)行全表掃描,因此它的查詢速度是最快的。
create CLUSTERED INDEX IX_Id ON Person(Id) --創(chuàng)建聚簇索引 create NONCLUSTERED INDEX IX_Name ON Person(Name) --創(chuàng)建非聚集索引 drop INDEX Person.IX_Id --刪除索引 根據(jù)執(zhí)行計劃細(xì)節(jié)要做的優(yōu)化操作 如果select * 通常情況下聚集索引會比非聚集索引更優(yōu)。 如果出現(xiàn)Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。 Merge Join時需要檢查下原有的集合是否已經(jīng)有排序,如果沒有排序,使用索引能否解決。 出現(xiàn)表掃描,聚集索引掃描,非聚集索引掃描時,考慮語句是否可以加where限制,select * 是否可以去除不必要的列。 出現(xiàn)Rid查找時,是否可以加索引優(yōu)化解決。 在計劃中看到不是你想要的索引時,看能否在語句中強制使用你想用的索引解決問題,強制使用索引的辦法select CluName1,CluName2 from Table with(index=IndexName)。 看到不是你想要的連接算法時,嘗試強制使用你想要的算法解決問題。強制使用連接算法的語句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join) 看到不是你想要的聚合算法是,嘗試強制使用你想要的聚合算法。強制使用聚合算法的語句示例:select age ,count(age) as cnt from t1 group by age option(order/hash group) 看到不是你想要的解析執(zhí)行順序是,或這解析順序耗時過大時,嘗試強制使用你定的執(zhí)行順序。option(force order) 看到有多個線程來合并執(zhí)行你的sql語句而影響到性能時,嘗試強制是不并行操作。option(maxdop 1) 在存儲過程中,由于參數(shù)不同導(dǎo)致執(zhí)行計劃不同,也影響啦性能時嘗試指定參數(shù)來優(yōu)化。option(optiomize for(@name=‘zlh’)) 不操作多余的列,多余的行,不做務(wù)必要的聚合,排序 該文章在 2023/7/26 9:41:54 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |