sql數(shù)據(jù)庫培訓(xùn)石油院13優(yōu)化查詢_第1頁
sql數(shù)據(jù)庫培訓(xùn)石油院13優(yōu)化查詢_第2頁
sql數(shù)據(jù)庫培訓(xùn)石油院13優(yōu)化查詢_第3頁
sql數(shù)據(jù)庫培訓(xùn)石油院13優(yōu)化查詢_第4頁
sql數(shù)據(jù)庫培訓(xùn)石油院13優(yōu)化查詢_第5頁
免費預(yù)覽已結(jié)束,剩余33頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、優(yōu)化T-SQL查詢王輝內(nèi)容查詢的邏輯順序和物理順序三種物理連接算法查詢的有效參數(shù)查詢優(yōu)化方法論擴(kuò)展基于集合的操作表變量與臨時表查詢優(yōu)化最佳實踐和查詢有關(guān)的DMV查詢的邏輯處理3From&JoinWhereOrder BySelectResultSetHavingGrouping and AggregationRowsResultSetResultSet非聚合查詢聚合查詢Order By查詢邏輯流關(guān)系圖查詢的物理處理4語句:USE Northwind; SELECT C.CustomerID, COUNT(O.OrderID) AS NumOrders FROM dbo.Customers AS

2、 C LEFT OUTER JOIN dbo.Orders AS O ON C.CustomerID = O.CustomerID WHERE C.City = London GROUP BY C.CustomerID HAVING COUNT(O.OrderID) 5 ORDER BY NumOrders;內(nèi)容查詢的邏輯順序和物理順序三種物理連接算法查詢的有效參數(shù)查詢優(yōu)化方法論擴(kuò)展基于集合的操作表變量與臨時表查詢優(yōu)化最佳實踐和查詢有關(guān)的DMV嵌套循環(huán)連接算法6嵌套循環(huán)算法掃描執(zhí)行計劃中上方的表,然后對于每一行再在下方的表中搜索匹配的行。當(dāng)大表連接的字段上有索引時,這種算法比較有效。合并連接算

3、法連接字段需要排序,這樣的輸入使用合并連接最有效7哈希連接算法當(dāng)查詢優(yōu)化器找不到合適的、好的索引時,就會使用哈希連連接算法,它將在內(nèi)存中創(chuàng)建哈希表來代替索引的二叉平衡樹8三種連接算法比較嵌套循環(huán)連接合并連接哈希連接適用場景外層循環(huán)小,內(nèi)存循環(huán)條件列有序輸入兩端都有序數(shù)據(jù)量大,且沒有索引CPU低低(如果沒有顯式排序)高內(nèi)存低低(如果沒有顯式排序)高IO可能高可能低低可能高可能低內(nèi)容查詢的邏輯順序和物理順序三種物理連接算法查詢的有效參數(shù)查詢優(yōu)化方法論擴(kuò)展基于集合的操作表變量與臨時表查詢優(yōu)化最佳實踐和查詢有關(guān)的DMV查詢的有效參數(shù)查詢優(yōu)化程序查看 WHERE 子句中所有的條件,以決定這些條件在限制

4、SQL Server 訪問數(shù)據(jù)時是否有用 SARG 格式:數(shù)據(jù)字段 部分運算符 部分運算符 數(shù)據(jù)字段在查詢子句中,SARGs 代表用來搜尋的常數(shù)或變量可以直接與索引鍵值做比較,該字段擁有正確的統(tǒng)計,不要對數(shù)據(jù)字段做運算大多數(shù) DBA 利用 T-SQL 在撰寫視圖、存儲過程、用戶自定義函數(shù)時,可能已經(jīng)注意到了 SARGs 的格式需求。但程序設(shè)計師在利用一般程序語言如 /C# 等撰寫前端程序時,往往會組合 SQL 語法,透過 ADO 或 傳遞到后端數(shù)據(jù)庫執(zhí)行,這時可能就會對 SARGs 有所疏忽了 11注意事項避免在Where子句中對字段進(jìn)行NULL值判斷盡量避免在Where子句中使用!=或操作盡

5、量避免在Where子句中使用or來連接條件謹(jǐn)慎使用IN和NOT IN盡量避免使用非打頭字母搜索必要時強(qiáng)制查詢計劃使用某個索引(如:在Where中使用局部變量)避免在Where子句中對字段進(jìn)行表達(dá)式操作避免在Where子句中對字段進(jìn)行函數(shù)操作使用Exists替代子查詢避免使用兩個不同類型的列進(jìn)行表的連接使用 AND 運算符的查詢AND 運算符的處理程序傳回符合 Where 子句內(nèi)所有條件的記錄每一個搜尋條件漸進(jìn)地限制傳回的記錄數(shù)使用 Where 子句內(nèi)任何搜尋條件可用的索引索引建立原則與性能考慮在高選擇性的查詢條件上定義索引評估建立多個單一字段的索引還是多個字段的復(fù)合索引13查詢使用 OR 運算

6、符傳回在 Where 子句中符合任何一個條件的記錄每一個搜尋條件都會增加可傳回的記錄筆數(shù)可以針對 OR 運算符所串起的每一部分使用不同的索引如果在 OR 運算符連接的部分中,某個字段沒有適用的索引,都必須采用表掃描或簇索引掃描可以使用多個索引當(dāng)用 OR 做參數(shù)是否有輸入的判斷時,將一并使索引失效Where (key1 =0 OR Key1 =Key1) AND (key2 =0 OR Key2 =Key2) 利用存儲過程內(nèi)含 IF 寫法,提供較佳的重建執(zhí)行計劃在OR運算符兩端的條件涉及了不同的表會導(dǎo)致索引掃描14內(nèi)容查詢的邏輯順序和物理順序三種物理連接算法查詢的有效參數(shù)查詢優(yōu)化方法論擴(kuò)展基于集

7、合的操作表變量與臨時表查詢優(yōu)化最佳實踐和查詢有關(guān)的DMV查詢調(diào)優(yōu)方法論16在實例級別分析等待-定位區(qū)域關(guān)聯(lián)等待和查詢-定位資源確定行動方針下鉆到數(shù)據(jù)庫/文件級別下鉆到對象/組件級別調(diào)優(yōu)索引/查詢分析等待(Waits)17SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_type;分析等待(Top Waits)WITH Waits AS ( SELECT wait_type, wait_

8、time_ms / 1000. AS wait_time_s, 100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct, ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn FROM sys.dm_os_wait_stats WHERE wait_type NOT LIKE %SLEEP% - filter out additional irrelevant waits ) SELECT W1.wait_type, CAST(W1.wait_time_s AS DECIMAL(12, 2)

9、AS wait_time_s, CAST(W1.pct AS DECIMAL(12, 2) AS pct, CAST(SUM(W2.pct) AS DECIMAL(12, 2) AS running_pct FROM Waits AS W1 JOIN Waits AS W2 ON W2.rn = W1.rn GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct HAVING SUM(W2.pct) - W1.pct =代替對于小數(shù)據(jù)集使用表變量而不是臨時表對于需要反復(fù)使用的大數(shù)據(jù)集使用臨時表而不是表變量盡量使用WHERE替代HAVING多表連

10、接中建議給表添加別名連接和子查詢的比較優(yōu)先使用存儲過程最佳實踐:T-SQL編程和優(yōu)化(語法)聚合查詢的最佳實踐在一個查詢中不要 Group By 很多字段針對大的查詢,可以考慮把聚合放到臨時表中,然后再和外部表連接如何在分組時用到許多列,嘗試把聚合移動到子查詢中在聚合中使用CASE語句來實現(xiàn)逐行的邏輯更新差異數(shù)據(jù)UPDATE SET = FROM 子句INSERT SELECT FROM 子句DELETE FROM 子句FROM INNER | LEFT | RIGHT | FULL OUTER JOIN ON = WHERE 若是通過鏈接服務(wù)器訪問其他產(chǎn)品的數(shù)據(jù),如 Oracle,可考慮透過

11、 OpenQuery 先行在來源端過濾數(shù)據(jù)33使用 T-SQL 應(yīng)注意的事項SELECT盡量不要傳回所有的數(shù)據(jù)表內(nèi)字段且不設(shè)定過濾條件索引順序上的第一個字段才適合當(dāng)作過濾條件Distinct、Order By 等語法盡量是查詢結(jié)果需要才使用,則 UNION ALL 也較僅僅寫 UNION 為佳Union 的字段越多,差異越大若未將事務(wù)隔離級別降低到 Read mitted,或是通過鎖定提示 NOLOCK 來減低被鎖定的機(jī)會,最好設(shè)定 SET LOCK_TIMEOUT 選項,避免用戶無盡地等待34INSERT、DELETE 和 UPDATESELECTINTO 一定比逐筆做 INSERT 快,清空數(shù)據(jù)表采用 TRUNCATE TABLE 一定比 DELETE TABLE 不加 WHERE 來得快UPDATE 和 DELETE 采用 WHERE 子句時,記得條件也要符合 SARGs 格式 INSERT 大量數(shù)據(jù)時,盡量不要使用循環(huán),可以使用CTE,如果要使用循環(huán),也放到一個事務(wù)中35大量數(shù)據(jù)加載 可以考慮先刪掉索引,停止檢查約束,尤其是利用多個用戶端同時做大量數(shù)據(jù)加載的動作同樣是大量加載,BULK INSERT 語法通??爝^ BCP 工具輸入時直接采用表鎖考慮通過多臺前端計算機(jī)同時執(zhí)行 BCP 工具程序或 BULK IN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論