จะค้นหาคำสั่ง SQL ที่ทำให้ tempdb เติบโตได้อย่างไร?


26

tempdb ของเซิร์ฟเวอร์ (SQL Server 2008) เพิ่มขึ้นเป็น 500GB + หลายครั้งทุกเดือน เป็นไปได้ไหมที่จะทราบว่าคำสั่ง SQL ใดที่ทำให้เกิดปัญหานี้? ปัญหานี้มักจะไม่ได้เกิดจากcreate table #temp...; insert into #temp...หรือเกิดจากการselect ... into #temp...รวมที่ซับซ้อน

ขนาดเริ่มต้นของบางส่วนของ tempdb แฟ้มยังมีการตั้งค่าโดยอัตโนมัติเพื่อให้ค่าที่ยิ่งใหญ่กว่าทุกครั้ง จะป้องกันได้อย่างไร?

บางครั้งแผนแคชป้องกันการปรับขนาด / ลดขนาดไฟล์ วิธีการค้นหาที่หนึ่งถือ tempdb หรือไม่


1
ขออภัยเป็นเวลาเกือบ 02.00 น. และฉันไม่สามารถตอบคำถามนี้ได้อย่างสมบูรณ์อย่างไรก็ตาม URL เหล่านี้อาจมีประโยชน์ในขณะที่คุณรอคำตอบอื่น ๆ - mssqltips.com/sqlservertip/1432/ …และgoogle.com/search?q= ซึ่งการสืบค้น + กำลังใช้ + + + tempdb
Aaron Bertrand

คำตอบ:


27

มี DMV สามตัวที่คุณสามารถใช้เพื่อติดตามการใช้งาน tempdb:

สองรายการแรกจะช่วยให้คุณติดตามการจัดสรรในระดับแบบสอบถามและเซสชัน ครั้งที่สามติดตามการจัดสรรข้ามรุ่นเก็บผู้ใช้และวัตถุภายใน

แบบสอบถามตัวอย่างต่อไปนี้จะให้การจัดสรรต่อเซสชัน:

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

หากคุณต้องการที่จะติดตามการใช้งานในช่วงเวลาให้พิจารณาการเก็บรวบรวมข้อมูลที่มีsp_whoisactiveที่แสดงโดยเคนดราเล็ก ๆ น้อย ๆ


3
ขอบคุณ ความแตกต่าง[SPACE Allocated FOR USER Objects (in KB)]และ[SPACE Deallocated FOR USER Objects (in KB)]พื้นที่ที่ถูกครอบครองจริงของเซสชันหรือไม่
u23432534

4

อาจมีแหล่งที่มาต่าง ๆ ของปัญหา:

  • การใช้ตัวแปรตารางหรือตารางชั่วคราว
  • เซิร์ฟเวอร์ sql สร้าง resultsets ขั้นกลางเป็น worktables ใน tempdb - โดยทั่วไปเพื่อวัตถุประสงค์ในการจัดเรียง (โดยปกติจะเป็นสัญญาณของดัชนีขาด / สถิติล้าสมัย)
  • เซิร์ฟเวอร์ sql ตัดสินใจที่จะประเมินผล resultset ของฟังก์ชั่นที่มีค่าของตารางและในกรณีนี้มันเก็บข้อมูลใน tempdb
  • สร้างดัชนีใหม่พร้อมตัวเลือก SORT_IN_TEMPDB = ON
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.