Bagaimana menemukan pernyataan SQL yang menyebabkan pertumbuhan tempdb?

26

Tempdb server (SQL Server 2008) meningkat hingga 500GB + beberapa kali setiap bulan. Apakah mungkin untuk mengetahui pernyataan SQL mana yang menyebabkan masalah ini? Masalahnya biasanya bukan disebabkan oleh create table #temp...; insert into #temp...atau select ... into #temp...tetapi gabungan kompleks.

The Ukuran awal dari beberapa file tempdb juga secara otomatis mengatur banyak nilai-nilai yang lebih besar setiap kali. Bagaimana cara mencegahnya?

Kadang-kadang paket yang di-cache mencegah mengubah ukuran / menyusutkan file. Bagaimana menemukan yang mana yang memegang tempdb?

u23432534
sumber
1
Maaf sudah hampir jam 2 pagi dan saya kehabisan bensin untuk menjawab pertanyaan ini sepenuhnya, namun URL ini mungkin berguna saat Anda menunggu jawaban lain - mssqltips.com/sqlservertip/1432/… dan google.com/search?q= yang + kueri + adalah + menggunakan + tempdb
Aaron Bertrand

Jawaban:

27

Ada tiga DMV yang dapat Anda gunakan untuk melacak penggunaan tempdb:

Dua yang pertama akan memungkinkan Anda untuk melacak alokasi di tingkat kueri & sesi. Trek ketiga alokasi di seluruh versi menyimpan, pengguna dan objek internal.

Kueri contoh berikut akan memberi Anda alokasi per sesi:

SELECT
  sys.dm_exec_sessions.session_id AS [SESSION ID]
  ,DB_NAME(database_id) AS [DATABASE Name]
  ,HOST_NAME AS [System Name]
  ,program_name AS [Program Name]
  ,login_name AS [USER Name]
  ,status
  ,cpu_time AS [CPU TIME (in milisec)]
  ,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
  ,total_elapsed_time AS    [Elapsed TIME (in milisec)]
  ,(memory_usage * 8)      AS [Memory USAGE (in KB)]
  ,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
  ,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
  ,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
  ,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
  ,CASE is_user_process
             WHEN 1      THEN 'user session'
             WHEN 0      THEN 'system session'
  END         AS [SESSION Type], row_count AS [ROW COUNT]
FROM 
  sys.dm_db_session_space_usage
INNER join
  sys.dm_exec_sessions
ON  sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id

Jika Anda ingin melacak penggunaan selama periode waktu tertentu, pertimbangkan untuk mengumpulkan data dengan sp_whoisactive , seperti yang ditunjukkan oleh Kendra Little .

Mark Storey-Smith
sumber
3
Terima kasih. Apakah perbedaan [SPACE Allocated FOR USER Objects (in KB)]dan [SPACE Deallocated FOR USER Objects (in KB)]ruang yang ditempati sesi yang sebenarnya?
u23432534
4

Mungkin ada berbagai sumber masalah:

  • penggunaan variabel tabel atau tabel sementara
  • sql server membuat hasil antara sebagai tabel kerja di tempdb - biasanya untuk keperluan pengurutan (biasanya merupakan tanda tidak adanya indeks / statistik kedaluwarsa)
  • sql server memutuskan untuk mengevaluasi terlebih dahulu hasil dari fungsi bernilai tabel dan dalam hal ini menyimpan data dalam tempdb
  • membuat ulang indeks dengan opsi SORT_IN_TEMPDB = ON
Oleg Dok
sumber