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