如何檢視某個查詢用了多少TempDB空間

2021-09-22 10:37:46 字數 1356 閱讀 1695

最近幫助客戶調優的過程中,發現客戶的tempdb存在非常大的壓力,經過排查是發現某些語句對tempdb的巨量使用所導致。

在sql server中,tempdb主要負責供下述三類情況使用:

內部使用(排序、hash join、work table等)

外部使用(臨時表,表變數等)

行版本控制(樂觀併發控制)

而對於內部使用,一些比較複雜的查詢中由於涉及到了大量的並行、排序等操作時就需要大量的記憶體空間,每乙個查詢在開始時都會由sql server預估需要多少記憶體,在具體的執行過程中,如果授予的記憶體不足,則需要將多出來的部分由tempdb處理,這也就是所謂的spill to tempdb。

通過下述語句可以觀察到某個查詢對tempdb造成了多少讀寫:

declare @read   bigint, 

@write  bigint

;        

select  @read = sum(num_of_bytes_read), 

@write = sum(num_of_bytes_written) 

from    tempdb.sys.database_files as dbf

join    sys.dm_io_virtual_file_stats(2, null) as fs

on fs.file_id = dbf.file_id

where   dbf.type_desc = 'rows'

--這裡放入需要測量的語句

select  tempdb_read_mb = (sum(num_of_bytes_read) - @read) / 1024. / 1024., 

tempdb_write_mb = (sum(num_of_bytes_written) - @write) / 1024. / 1024.,

internal_use_mb =  (

select  internal_objects_alloc_page_count / 128.0

from    sys.dm_db_task_space_usage

where   session_id = @@spid )

from    tempdb.sys.database_files as dbf

join    sys.dm_io_virtual_file_stats(2, null) as fs

on fs.file_id = dbf.file_id

where   dbf.type_desc = 'rows'

最近在乙個客戶那裡看到的爛查詢所導致的tempdb使用結果如下:

image

使用該查詢就可以幫助了解某個語句使用了多少tempdb。

分類: sql效能調優

Spring如何判斷某個類用了某個註解

spring提供了乙個annotationutils類用於判斷某個類是否用了某個註解,以 kafkalistener為例,kafkalistener ann annotationutils.findannotation clazz,kafkalistener.class clazz為使用了該註解的類...

檢視linux的程序到底用了多少記憶體

1.在linux下,檢視乙個執行中的程式,占用了多少記憶體,一般的命令有 1 ps aux 其中 vsz 或vss 列 表示,程式占用了多少虛擬記憶體。rss列 表示,程式占用了多少物理記憶體。虛擬記憶體可以不用考慮,它並不占用實際物理記憶體。2 top 命令也可以 其中 virt 或vss 列 表...

Linux下如何知道什麼程式占用了某個埠

當我們用netstat an的時候,我們有時候可以看到類似的輸出 udp 0 0 0.0.0.0 32768 0.0.0.0 但是查詢 etc services又沒有這個埠的相關說明,有沒有辦法檢視究竟什麼程式監聽在這個埠?使用lsof i 32768就可以看到 command pid user f...