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