1. 程式人生 > >【T-SQL效能優化】01.TempDB的使用和效能問題

【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.