Tại sao cắt ngắn một bảng tạm thời ở cuối thủ tục được lưu trữ tạo ra không gian tempdb miễn phí nhanh hơn?


12

SQL Server lưu trữ các bảng tạm thời được tạo trong các thủ tục được lưu trữ và chỉ đổi tên chúng khi thủ tục kết thúc và sau đó được thực thi. Câu hỏi của tôi phải làm khi không gian tempdb được phát hành. Tôi đã đọc rằng bảng được cắt bớt ở cuối thủ tục . Tôi đã đọc các bình luận rằng việc này được xử lý trên cơ sở mỗi phiên và thấy một câu hỏi về việc có cần dọn dẹp hay không trả lời trên MSDN . Nhưng nếu nó không bao giờ được thực hiện bởi cùng một phiên hai lần thì sao?

Tôi cũng đã nghe nói rằng có một quy trình thu gom rác nền giải phóng không gian đó một khi bảng nằm ngoài phạm vi.

Việc cắt một bảng tạm thời ở cuối thủ tục được lưu trữ tạo ra nó dường như khiến không gian mà bảng sử dụng trong tempdb để dữ liệu được giải phóng nhanh hơn nếu không sử dụng câu lệnh rút gọn nào, mặc dù có những kỳ vọng ngược lại. Tại sao?

Điều gì sẽ có ý nghĩa hiệu suất tương đối của việc sử dụng hoặc không sử dụng một tuyên bố cắt ngắn như vậy? Khi sử dụng cách ly SNAPSHOT, tempdb thường bị căng thẳng và tôi nghĩ rằng việc giải phóng không gian được sử dụng trong tempdb từ một bảng tạm thời càng sớm càng tốt sẽ ngăn chặn sự tăng trưởng không cần thiết của tempdb. Tiết kiệm không gian tiềm năng này sẽ đến với chi phí hiệu suất?

Đây là một số mã để tái tạo vấn đề (chủ yếu từ @TheGameiswar, với một số thay đổi):

SET NOCOUNT ON;
GO
ALTER PROC usp_test
AS
BEGIN
    IF object_id('tempdb..#temp') IS NOT NULL
        DROP TABLE #temp

    SELECT *
    INTO #temp
    FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused

    --SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    --  ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    --  ,getdate() AS BeforeTruncate
    --FROM tempdb.sys.dm_db_file_space_usage;
 --   TRUNCATE TABLE #temp
    --SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    --  ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    --  ,getdate() AS AfterTruncate
    --FROM tempdb.sys.dm_db_file_space_usage;

END
GO

SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    ,getdate() AS 'before'
FROM tempdb.sys.dm_db_file_space_usage;

EXEC usp_test
GO

SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    ,(SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
    ,getdate() AS 'final'
FROM tempdb.sys.dm_db_file_space_usage;
GO 40

Các dòng bình luận đã được để lại nhận xét cho một số lần chạy và không bình luận cho những người khác. Khi TRUNCATEđã nhận xét, phải mất từ ​​2,25 đến 4,5 giây trước khi kết quả của tempdb.sys.dm_db_file_space_usagetruy vấn (có thêm 452 trang và lớn hơn 34.9375 MB) phù hợp với kết quả trước khi quy trình được thực hiện. Với các dòng (bao gồm cả TRUNCATE) chưa được bình luận, chỉ mất khoảng 0,11 - 0,9 giây. Những kết quả này là từ một hệ thống trực tiếp, với một số tăng trưởng dữ liệu nhỏ trong bảng nguồn trong thí nghiệm này.

Đầu ra mẫu với mã nhận xét (2,69 giây từ mục nhập "cuối cùng" đầu tiên đến cuối cùng):

user object pages used user object space in MB                 before
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:03:42.197

Beginning execution loop
user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.423

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.533

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.643

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.883

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:42.990

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.100

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.450

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.650

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.767

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:43.993

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.103

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.213

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.437

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.553

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.663

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:44.887

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6000                   46.875000                               2017-10-04 21:03:45.003

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:03:45.113

Kết quả mẫu với mã chưa được nhận xét (0,11 giây từ mục nhập "cuối cùng" đầu tiên đến cuối cùng):

user object pages used user object space in MB                 before
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:07:39.807

user object pages used user object space in MB                 BeforeTruncate
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:39.923

user object pages used user object space in MB                 AfterTruncate
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:39.923

Beginning execution loop
user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
6016                   47.000000                               2017-10-04 21:07:40.160

user object pages used user object space in MB                 final
---------------------- --------------------------------------- -----------------------
1536                   12.000000                               2017-10-04 21:07:40.270

Câu trả lời:


12

Việc cắt một bảng tạm thời ở cuối thủ tục được lưu trữ tạo ra nó dường như khiến không gian mà bảng sử dụng trong tempdb để dữ liệu được giải phóng nhanh hơn nếu không sử dụng câu lệnh rút gọn nào, mặc dù có những kỳ vọng ngược lại. Tại sao?

Nếu bảng tạm thời đủ lớn ( hơn 128 phạm vi ), các giao dịch trang vật lý được hoãn lại và được thực hiện bởi một tác vụ hệ thống nền. Điều này đúng cho dù là rõ ràngTRUNCATE TABLE được sử dụng hay không.

Sự khác biệt duy nhất là một chi tiết thực hiện nhỏ. Một sự rõ ràng TRUNCATE TABLExảy ra để tạo ra một tác vụ với bộ đếm thời gian ngắn hơn so với tác vụ thả hoãn lại (giống hệt) được tạo bởi dọn dẹp bảng tạm thời:

Gọi stack vì mọi người thích chúng

Cho dù điều này là do vô tình hay thiết kế là đoán của bất cứ ai. Tất nhiên nó có thể thay đổi bất cứ lúc nào, vì mức độ chi tiết này vượt xa diện tích bề mặt sản phẩm được hỗ trợ.

Nếu bạn vô hiệu hóa thả hoãn lại trên toàn cầu bằng cờ theo dõi (hầu hết) không có giấy tờ:

DBCC TRACEON (671, -1);

... các thỏa thuận được thực hiện đồng bộ trong cả hai trường hợp và bạn sẽ không thấy sự khác biệt về thời gian.

Điều gì sẽ có ý nghĩa hiệu suất tương đối của việc sử dụng hoặc không sử dụng một tuyên bố cắt ngắn như vậy? Khi sử dụng cách ly SNAPSHOT, tempdb thường bị căng thẳng và tôi nghĩ rằng việc giải phóng không gian được sử dụng trong tempdb từ một bảng tạm thời càng sớm càng tốt sẽ ngăn chặn sự tăng trưởng không cần thiết của tempdb. Tiết kiệm không gian tiềm năng này sẽ đến với chi phí hiệu suất?

Tôi thực sự nghi ngờ điều này sẽ làm cho nhiều sự khác biệt dù bằng cách nào. Nếu tempdb có kích thước phù hợp với nhu cầu cao nhất của khối lượng công việc của bạn, thì việc trì hoãn giảm xảy ra sau một hoặc ba giây không thành vấn đề. Công việc tương tự được thực hiện; nó chỉ là một sự khác biệt nhỏ trong thời gian.

Mặt khác: Nếu bạn cảm thấy thoải mái hơn khi sử dụng TRUNCATE TABLEtrên các bảng tạm thời ở cuối các thủ tục được lưu trữ của bạn, hãy đi với điều đó. Tôi không nhận thấy bất kỳ nhược điểm cụ thể nào để làm điều này.

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.