Làm thế nào để tìm các câu lệnh SQL gây ra sự tăng trưởng tempdb?


26

Temppdb của một máy chủ (SQL Server 2008) tăng lên 500GB + vài lần mỗi tháng. Có thể tìm ra câu lệnh SQL nào gây ra vấn đề này không? Vấn đề thường không được gây ra bởi create table #temp...; insert into #temp...hoặc select ... into #temp...nhưng tham gia phức tạp.

Các Kích thước ban đầu của một số các files tempdb được tự động thiết lập các giá trị lớn hơn nhiều mỗi lần. Làm thế nào để ngăn chặn nó?

Đôi khi các kế hoạch lưu trữ ngăn chặn thay đổi kích thước / thu nhỏ các tập tin. Làm thế nào để tìm cái nào giữ tempdb?


1
Xin lỗi, đã gần 2 giờ sáng và tôi hết xăng để trả lời hoàn toàn câu hỏi này, tuy nhiên các URL này có thể có ích trong khi bạn chờ câu trả lời khác - mssqltips.com/sqlservertip/1432/ , và google.com/search?q= Mà + truy vấn + đang + sử dụng + tempdb
Aaron Bertrand

Câu trả lời:


27

Có ba DMV bạn có thể sử dụng để theo dõi việc sử dụng tempdb:

Hai cái đầu tiên sẽ cho phép bạn theo dõi phân bổ ở cấp truy vấn & phiên. Phần thứ ba theo dõi phân bổ trên toàn bộ phiên bản lưu trữ, người dùng và các đối tượng nội bộ.

Truy vấn ví dụ sau sẽ cung cấp cho bạn phân bổ mỗi phiên:

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

Nếu bạn muốn theo dõi việc sử dụng trong một khoảng thời gian, hãy xem xét việc thu thập dữ liệu với sp_whoisactive , như được trình bày bởi Kendra Little .


3
Cảm ơn. Là sự khác biệt [SPACE Allocated FOR USER Objects (in KB)][SPACE Deallocated FOR USER Objects (in KB)]không gian chiếm dụng thực tế của phiên?
u23432534

4

Có thể có nhiều nguồn khác nhau của một vấn đề:

  • sử dụng biến bảng hoặc bảng tạm thời
  • máy chủ sql đã tạo các kết quả trung gian dưới dạng bàn làm việc trong tempdb - thường dành cho mục đích sắp xếp (thường là dấu hiệu của các chỉ mục vắng mặt / thống kê lỗi thời)
  • máy chủ sql quyết định đánh giá trước tập kết quả của hàm có giá trị bảng và trong trường hợp này, nó lưu trữ dữ liệu trong tempdb
  • tạo lại các chỉ mục với tùy chọn SORT_IN_TEMPDB = ON
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.