【T-SQL效能優化】01.TempDB的使用和效能問題
以前總是追求新東西,發現基礎才是最重要的,今年主要的目標是精通SQL查詢和SQL效能優化。
本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。
一、TempDB是什麼?
1.TempDB是一個系統資料庫。從SQL Server2000開始就一直存在。
2.只有Simple恢復模式。自動截斷模式。
3.存放區域性變數/全域性臨時表/表變數/臨時用法(如hash表等)。
4.機器重啟或SQL Server服務重啟後,都會按照Model庫的配置重新建立。
5.如果臨時物件是在會話或儲存過程範圍內產生的,在會話結束後就會自動回收,不能再查詢或使用。
6.預設情況下都具有訪問許可權。
二、TempDB用來存放什麼?
2.1.使用者臨時物件
(1)由使用者再會話中顯示建立的實體表和上面的索引。重啟後清空。
(2)全域性臨時表+索引。##開頭的表。
(3)區域性臨時表及上面的索引。#開頭的表。
(4)表變數。@開頭。
注意:
(1)全域性臨時表對所有會話都可見。當建立臨時表的會話斷開資料庫的聯接,而且也沒有活動再引用全域性臨時表時,SQL Server會自動刪除相應的全域性臨時表。
(2)區域性臨時表只對建立它的會話再建立級和呼叫堆疊內部級(內部的過程、函式、觸發器、以及動態批處理)是可見的。當建立例程彈出呼叫堆疊,SQL Server就會自動刪除相應的臨時表
(3)表變數在tempdb資料庫中也有對應的表作為其物理表示。只對當前會話的批處理可見。對呼叫堆疊中當前批處理的內部批處理是不可見的,對會話中隨後的批處理也是不可見的。
(4)根據國外專家的經驗,對於大資料,偏向使用臨時表,小資料量(一般來說小於100行)則可以使用表變數。
是否具有統計資訊 |
是否可以建立索引 |
是否是物理儲存 |
|
臨時表 |
Y |
Y |
Y |
表變數 |
N |
N |
N |
2.2.內部臨時物件
在查詢過程中儲存臨時資料的物件,如Sorts、假離線、Hash關聯和遊標等。
可以使用下面的SQL語句進行檢視:
SELECT * FROM sys.dm_db_session_space_usage
檢視internal_object_alloc_page_count列
2.3.版本儲存
開啟樂觀併發模式後,會使用Temp DB存放修改前的版本資料。
注意:
版本儲存將會造成Temp DB的非預期增長,需要對Temp DB的檔案大小及使用空間進行監控。
三、TempDB上的存在的效能問題
3.1 空間使用情況
TempDB是系統資料庫,被很多地方用到,如果配置和使用不當,空間會被迅速消耗,可能出現報錯,影響伺服器的正常執行。
檢視TempDB的空間使用情況。
3.1.1 可以用效能監視器看下SQL server的空間使用情況。
3.1.2 用SQL語句查詢空間使用情況。
(1)檢視tempdb的使用情況
Exec sp_spaceused
(2)檢視tempdb.mdf檔案的大小
SELECT * FROM dbo.sysfiles
(3)檢視tempdb的使用空間
SELECT * FROM sys.dm_db_file_space_usage
(4)檢視會話的空間分配情況,不包含當前活動的任務。
SELECT * FROM sys.dm_db_session_space_usage WHERE session_id > 50
(5)檢視TempDB中當前執行任務的資訊。
SELECT * FROM sys.dm_db_task_space_usage WHERE session_id > 50
3.1.3 診斷TempDB磁碟問題
錯誤 |
引發錯誤的情況 |
1101 或 1105 |
任何會話都必須分配 tempdb 中的空間。 |
3959 |
版本儲存區已滿。此錯誤在日誌中通常出現在錯誤 1105 或 1101 之後。 |
3967 |
由於 tempdb 已滿,版本儲存區被強制收縮。 |
3958 或 3966 |
事務在 tempdb 中找不到所需的版本記錄。 |
3.2 I/O問題
(1)用函式sys.dm_io_virtual_file_stats檢視當前例項上的TempDB上的磁碟讀寫情況。
SELECT DB_NAME(database_id) AS 'Database Name' , file_id , io_stall_read_ms / num_of_reads AS 'AVG Read Transfer/ms' , io_stall_write_ms / num_of_writes AS 'AVG Write Transfer/ms' , * FROM sys.dm_io_virtual_file_stats(-1, -1) WHERE num_of_reads > 0 AND num_of_writes > 0
參考時間:10~20ms 可接受的範圍。
(2)大量、頻繁地建立和刪除臨時表及表變數
四、優化TempDB
1.配置檔案的大小
預設配置:
初始大小8M
自動增長10%,不限制增長。
這個配置可以修改,要視生產環境的情況而修改。
建議如下配置
tempdb 檔案大小 |
FILEGROWTH 增量 |
0 至 100 MB |
10 MB |
100 至 200 MB |
20 MB |
200 MB 或更多 |
10%* |
2.存放檔案的地方
一般要將TempDB的檔案單獨放到一個磁碟中。如果追求效能,考慮放到RAID0,但是不具有容災性。
RAID:磁碟陣列
RAID 0 無奇偶校驗的條帶磁碟。資料橫跨所有的物理磁碟,無任何容災特性。
RAID 1 磁碟映象。最少需要兩個物理磁碟。可同時從兩個磁碟讀取資料,寫資料需要備份到另外一個盤。具有容災特性。浪費50%的磁碟空間。
RAID 5 具有奇偶校驗的條帶磁碟。最少需要3個物理磁碟,一個用來存放奇偶校驗資訊,另外兩個用來存放資料,。具有容災特性。浪費50%的磁碟空間。
RAID 10 或RIAD 0+1 組合。讀寫效能最好且具有容災性。
3.檔案的個數
TempDB只有一個primary檔案組,所有的資料檔案都會存放到這個檔案組中。常規建議是4個書檔案開始,並且需要進行監控,如果發現不夠,可以再增加4個。依次類推。建議將檔案個數控制再兩位數以內。
五、其他
1.不能對TempDB執行什麼操作
- 新增檔案組。
- 備份或還原資料庫。
- 更改排序規則。預設排序規則為伺服器排序規則。
- 更改資料庫所有者。tempdb 的所有者是 dbo。
- 建立資料庫快照。
- 刪除資料庫。
- 從資料庫中刪除 guest 使用者。
- 啟用變更資料捕獲。
- 參與資料庫映象。
- 刪除主檔案組、主資料檔案或日誌檔案。
- 重新命名資料庫或主檔案組。
- 執行 DBCC CHECKALLOC。
- 執行 DBCC CHECKCATALOG。
- 將資料庫設定為 OFFLINE。
- 將資料庫或主檔案組設定為 READ_ONLY。
2、檢視TempDB的配置項
SELECT * FROM sys.databases WHERE name = 'tempdb'
參考資料:
《SQL Server 效能優化與管理的藝術》
作 者:
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
相關推薦
【T-SQL效能優化】01.TempDB的使用和效能問題
以前總是追求新東西,發現基礎才是最重要的,今年主要的目標是精通SQL查詢和SQL效能優化。 本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。 一、TempDB是什麼? 1.TempDB是一個系統資料庫。從SQL Server2000開始就一直存在。 2.只有Simple恢復模式
【T-SQL進階】02.理解SQL查詢的底層原理
本系列【T-SQL】主要是針對T-SQL的總結。 一、SQL Server組成部分 1.關係引擎:主要作用是優化和執行查詢。 包含三大元件: (1)命令解析器:檢查語法和轉換查詢樹。 (2)查詢優化器:優化查詢。 (3)查詢執行器:負責執行查詢。 2.儲存引擎:管理所有資料及涉及的IO
【T-SQL基礎】01.單表查詢-幾道sql查詢題
概述: 本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。 【T-SQL基礎】06.透視、逆透視、分組集 【T-SQL基礎】07.資料修改 【T-SQL基礎】09.可程式設計物件 ------------------------------------------
【T-SQL基礎】03.子查詢
引用 鏈接 編程 pac tom 單表 獨立 但是 company 閱讀目錄 概述: 一、獨立子查詢 二、相關子查詢 三、練習題 以前總是追求新東西,發現基礎才是最重要的,今年主要的目標是精通SQL查詢和SQL性能優化。 本系列【T-SQL基礎】主要是針對T-S
【redis常用的鍵值操作及效能優化】
服務端 啟動redis服務 { // -a:指定密碼 -h:指定主機 -p:指定埠 } //讓redis 服務中斷崩潰 //儲存和關閉 //後臺備份 //設定登入密碼 //redis-benchmark :效能測試 &
【oracle效能優化】- 使用AWR定位oracle效能瓶頸
1 AWR簡介 AWR(全稱Automatic Workload Repository)是Oracle 10g版本推出的新特性,隨資料庫一起被安裝的效能收集和分析工具。AWR可以收集場景執行期間的各方面效能資料,還可以從統計資料中分析出度量資料,通過分析報告,可以瞭解整個系統的執行情況,因而,o
【效能優化】如何實現:c/c++整個專案工程使用一個全域性變數
如果工程中存在malloc/free等頻繁動態分配和釋放記憶體的情況,一般優化思路是: 方法1:加記憶體池 方法2:使用全域性buf 方法1的優點:眾所周知,不詳細說了。 方法2使用場合:整個工程執行過程中,動態分配的記憶體大小有規律性且有最大個數。可以在工程起始
【效能優化】取模運算:x%n,當n是偶數時,可以用x&(n-1)替代
#include <assert.h> void modulo_operation_opt() { int m = 100000; int n = 100000; double a
146.Python修煉之路【151-前端-前端自動化及其優化-前端效能優化】2018.08.06
前端效能優化 從使用者訪問資源到資源完整的展現在使用者面前的過程中,通過技術手段和優化策略,縮短每個步驟的處理時間從而提升整個資源的訪問和呈現速度。網站的效能直接會影響到使用者的數量,所有前端效能優化很重要。 前端效能優化分為如下幾個方面: 一、程式碼部署: 1、程式碼的壓縮與合併
【Android效能優化】儘可能用RelativeLayout來代替多層巢狀的LinearLayout
儘量用RelativeLayout來代替多層巢狀的LinearLayout 在Android UI開發中,有時會遇到較複雜的佈局設計,比如如下: --------------------------------------- 標題 作者
【效能優化】quicklink:實現原理與給前端的啟發
近來,GoogleChromeLabs 推出了 quicklink,用以實現連結資源的預載入(prefetch)。本文在介紹其實現思路的基礎上,會進一步探討在預載入方面前端工程師還可以做什麼。 1. quicklink 是什麼的? quicklink 是一個通過預載入資源來提升後續方案速度的輕量級工具庫。
【效能優化】檢視tomcat 併發連線數
檢視tomcat併發連線數有兩個方式:方式1:通過tomcat自帶的管理控制檯檢視:啟動tomcat後,在瀏覽器輸入:http://11.8.130.129:8080/manager/statustomcat7以後需要賬號登入,配置賬號需要進入tomcat目錄下的conf路徑
【three.js-效能優化】three.js效能優化
轉載:three.js效能優化 three.js是JavaScript編寫的WebGL第三方庫。提供了非常多的3D顯示功能。在使用的時候,雖然three.js 做了優化,但是在使用不恰當的程式碼,也會產生效能損耗。幀率越低,給人感覺就越卡。這是我在開發中自己百度總結的,有不對的
【Jenkins常見問題解決】01. Mac上使用Jenkins持續整合報錯Can’t connect to window server – not enough permissions.
錯誤提示: <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged. Fatal Internal err
【T-SQL基礎】02.聯接查詢
概述: 本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。 【T-SQL基礎】06.透視、逆透視、分組集 【T-SQL基礎】07.資料修改 【T-SQL基礎】09.可程式設計物件 ------------------------------------------
【T-SQL】系列文章全文目錄(2017-06-26更新)
作 者: 出 處:http://www.cnblogs.com/jackson0714/ 關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教! 版權宣告:本文版權歸作者和部落格園共有,歡迎轉載
【效能優化】tomcat & Redis 優化:關於 too many open files error
背景說明: 使用Jmeter 進行壓力測試,同時在linux環境下使用“lsof -p 4154 | wc -l”檢視io訪問量。 進行壓力測試時發現io訪問量在4500左右,伺服器redis報錯,錯誤資訊too many open files error。原
【效能優化】 之效能檢視及效能引數
1.設定memory_target引數,並通過 v$memory_target_advice分析資料庫的最佳記憶體大小。<br> 2.通過調整引數optimizer_index_cost_adj的大小,演示SQL產生不同執行計劃。<br> 3.通過設
【MySQL-效能優化】--MySQL外來鍵約束簡述
建立表users CREATE TABLE users( id int AUTO_INCREMENT PRIMARY KEY, authority cha
【效能優化】 之 並行執行
1.給出一個2表關聯的並行查詢執行計劃,並畫出並行資料流圖。<br> 2.就自己本機的硬體情況,通過SQL示例,來找到最優的並行度。<br> 3.針對PARALLEL_DEGREE_POLICY的三個值,分別演示它們的效果。<br> 4.