tempdb的爭用壓力在等待篇中已經簡單介紹,等待的表現為 pagelatch_類等待,等待的資源是 「2: x :x 」
tempdb所在磁碟的響應時間
乙個例項下只有乙個tempdb,也就是當你在乙個例項下建立了100個資料庫,這100個資料庫也只能用這乙個tempdb。
你建立的臨時表,或sql執行語句所需要的排序等操作都需要用到tempdb。所以tempdb對磁碟的響應時間要求比較高。
步驟2.解決問題
把tempdb設定成多個來分攤這個壓力。
作為一般規則,如果邏輯處理器數小於或等於 8,使用和邏輯處理器相同數量的資料檔案。如果邏輯處理器數大於 8 時,使用 8 個資料檔案,然後如果仍然存在爭用,增加資料檔案數4 的倍數(最多的邏輯處理器數)直到爭用降低到可接受的程度或對工作負荷/**進行更改。
這裡需要注意乙個小細節,你所分配的檔案必須大小一致,如果設定自動增長那麼增長率要相同。
大多數情況下,tempdb的檔案不需要拆分磁碟,在同乙個磁碟即可,如果壓力大可以選擇放置在乙個單獨的磁碟中,這樣不會與其他檔案(如資料讀寫)發生磁碟資源競爭。
如果出現tempdb 讀取響應時間高的情況,請考慮,tempdb的磁碟相關優化,如將tempdb檔案單獨放入比較快的磁碟。
步驟3.語句調優
語句調優篇提到語句中使用臨時表或表變等會減少語句的複雜度,提公升語句的效率,是常用的三板斧之一,但這裡的需要乙個平衡。如果對語句過度使用會造成文中提到的tempdb壓力。那麼怎麼樣平衡呢?下面給出幾點建議:
切記不要過度使用臨時表!臨時表的使用主要有兩個場景,拆分語句降低複雜性。另乙個是快取中間結果避免重複操作。
減少使用臨時表鎖系統表的時間!」select 字段 into #臨時表 from「 如果語句執行時間過長這將是災難,盡量選用先建立,後插入的做法。
當資料庫建立一張新錶的時候,sql server要為這張表分配儲存頁面,同時sql server也要修改sgam, pfs, 和gam頁面,把已經分配出去的頁面標誌成已使用。所以每建立一張新錶,sgam, pfs, 和gam這些系統頁面都會有修改動作。這種行為對一般的使用者資料庫不會有問題,因為正常的應用不會折騰著不停地建表、刪表。但是tempdb就不同了。如果乙個儲存過程使用了臨時表,而這個儲存過程被併發使用者廣泛使用,那很自然地就會有很多併發使用者在tempdb裡同時建立表,做完了以後又刪除表。這樣,在乙個時間點,會有很多任務要修改sgam, pfs, 或gam頁面。但是為了維護物理的一致性,對於同乙個頁面,sql server在乙個時間點同時只允許乙個使用者修改它。所以對於tempdb,如果同時有很多很多人要在同乙個資料檔案裡分配空間,那這個資料檔案的sgam, pfs, 或gam頁面,就有可能成為系統瓶頸。大家只能乙個乙個做,併發度上不去。
這就好像你進停車場要登記交費一樣!乙個乙個來不要急~
等待資源為 : 「2:1:3」 這是什麼意思? id 為 2 的資料庫(tempdb)的 1號檔案 的 頁碼為3的頁(sgam頁面)!
這裡關於系統頁不過多的介紹,想詳細了解的朋友請參見 : sql server中的gam頁和sgam頁
下面也用乙個例子說明 :
建立臨時表的時候會對系統表中進行插入和更新,而刪除臨時表逆向過程會刪除或更新系統表!
所以當你併發過高且頻繁建立刪除臨時表的時候就會造成大量的爭用。
如何快速定位TempDB產生問題
tempdb的爭用壓力在等待篇中已經簡單介紹,等待的表現為 pagelatch 類等待,等待的資源是 2 x x tempdb所在磁碟的響應時間 乙個例項下只有乙個tempdb,也就是當你在乙個例項下建立了100個資料庫,這100個資料庫也只能用這乙個tempdb。你建立的臨時表,或sql執行語句所...
專案上線後 如何快速定位到使用者崩潰 卡頓的問題!
1.通常我們自己會在程式中加入友盟或者bugly來監聽後期線上的執行,bugly記得上傳符號表檔案定位.2.另外一種是處理測試提交給我們的一些堆疊bug資訊。先說定位bugly的卡頓崩潰資訊。1.獲取符號表檔案 使用命令獲取dsym檔案的uuid,對照crash日誌裡的uuid,如果一致則進行下一步...
PHP 如何快速定位BUG的方法
快速定位bug是程式設計師工作最頭疼的問題 沒有之一 尤其是當程式已經在online環境以後 so 聽我說 其實定位問題也沒有那麼的難 log方法 你要保證日誌的檔案許可權擁有許可權和在乙個安全的位置 php指令碼放置的 nginx 或 apache的應用資料夾中 然後你可以自定義一下 error....