2016-10-21 12 views
5

Tôi có truy vấn cơ sở con trỏ lớn chạy trong một thủ tục được lưu trữ trong công việc. Nó làm cho tấn tính toán cho các bó dữ liệu thị trường trong một vòng lặp cả ngày dài. Mỗi lần lặp lại các mẩu hồ sơ của chuỗi thời gian lịch sử từ một đĩa, nối nó với các bảng tạm thời với chỉ mục thích hợp, kết hợp chúng trong một số trunsformations với kết quả trung gian và lưu trữ kết quả tính toán vào đĩa. Vào cuối mỗi vòng lặp tôi thả (chủ yếu) hoặc cắt ngắn tất cả các bảng tạm thời để deallocate các trang của các đối tượng người dùng bên trong tempdb và nhận được không gian tên đã sẵn sàng cho lần lặp tiếp theo. Vấn đề của tôi là sau mỗi chu kỳ tất cả các đối tượng bên trong, mà DB Engine tạo ra để thực hiện truy vấn và đổ chúng vào tempdb, - giữ cho không gian đĩa được dành riêng cho chúng thậm chí bị deallocated sau khi giao dịch cam kết. Và nó tăng lên trên mỗi chu kỳ khi nhóm tiếp theo của các đối tượng nội bộ mới được quét vào đĩa.SQL Server: buộc dọn dẹp các đối tượng bên trong được phân phối trong tempdb để giải phóng không gian đĩa dành riêng cho chúng trong một phiên đã mở

Nó dẫn đến vĩnh viễn tempdb grouth, tất cả tích lũy không gian dành riêng liên quan đến các đối tượng nội bộ được phân bổ mới và mới. DB Engine phát hành/thu nhỏ (bất cứ) các tấn không gian đĩa bị lãng phí chỉ sau khi phiên đóng cửa khi proc kết thúc chu kỳ của nó.

Tôi có thể khắc phục sự cố bằng cách giảm số chu kỳ trong mỗi lần chạy công việc, chỉ cần bắt đầu lại. Nhưng tôi muốn có một quyết định cơ bản hoàn chỉnh: Tôi cần một lệnh hoặc bất kỳ mẹo nào trong một phiên để buộc thu gom rác theo yêu cầu của tôi để dọn dẹp/xóa hoàn toàn các đối tượng bên trong và giải phóng không gian đĩa tạm thời dành riêng cho chúng. Ngày googling đã không giúp đỡ. Folks, giúp đỡ!

Trả lời

1

Chúng tôi có chính xác cùng một vấn đề:

  1. tốn thời gian recalculations được thực hiện mỗi đêm;
  2. rất nhiều các bảng tạm thời được sử dụng để sử dụng song song thực hiện kế hoạch

Để khắc phục vấn đề, chúng tôi vừa chia các quá trình quy trình nhỏ thực hiện từng trong phiên riêng biệt, nhưng xích (để tránh các vấn đề chặn) - khi phần đầu tiên được thực hiện, nó sẽ kích hoạt phần tiếp theo, sau khi nó được thực thi, nó sẽ kích hoạt phần tiếp theo.

Ví dụ (nếu bạn có cách để tính toán chuỗi), bạn có thể ngắt lặp vòng lặp của bạn để tách riêng thủ tục gọi với các tham số khác nhau. Thực hiện trong các phiên khác nhau, khi mỗi người trong số họ hoàn thành các trang sẽ được phát hành.

+0

gotqn, điều đó rất hay. Tôi cho rằng, chia tách các phiên riêng biệt, giống như của bạn, là cách duy nhất cho DB Engine hiện tại. Tôi sẽ mơ về việc khởi động lại một phiên trong một proc, sẽ dễ dàng hơn cho việc viết mã, không có chuỗi. Nhưng cũng không thể. Quả hạch. Tôi sẽ đánh dấu bài viết của bạn là câu trả lời, nếu không ai giải phóng một số tính năng ẩn không có giấy tờ hoặc một số hack holly khác – Globe

Các vấn đề liên quan