Bộ nhớ đã sử dụng không được giải phóng sau khi xuất BULK Chèn / BCP SQL


10

Tôi đã tạo một bảng SQL rất cơ bản như sau

CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
    ) ON [PRIMARY]

Sau đó tôi đã thực hiện Chèn 3 Gig

    BULK
    INSERT TickData
    FROM 
    'C:\SUMO.csv'
    GO

Sau đó, việc sử dụng RAM cho máy chủ SQL đã tăng Skyrocking, ăn ~ 30Go RAM:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tôi thích nghĩ rằng đây là một hành vi bất thường và hành động đó có thể được thực hiện để tránh điều này.

EDIT:
Ok, Đây có vẻ là hành vi mặc định. Đủ công bằng.
Tuy nhiên, tại sao bộ nhớ không được giải phóng lâu sau khi Chèn hàng loạt kết thúc?

Một vài cân nhắc thêm:
Đối với các nhận xét liên quan đến máy chủ SQL giải phóng bộ nhớ khi hệ điều hành "nói với", trải nghiệm thực tế của tôi trên Máy chủ Xeon 24 lõi 32 Gb đã chứng minh điều này là không chính xác: Khi quá trình trích xuất BCP Bộ nhớ-Bộ nhớ đã kết thúc Tôi có một nhóm .Net Instances của ứng dụng xử lý dữ liệu của tôi cần xử lý dữ liệu được trích xuất và chúng bị nghẹt / chiến đấu để chia sẻ bộ nhớ còn lại để cố gắng thực hiện công việc của mình, mất nhiều thời gian hơn khi SQL Server được bật tắt và bộ nhớ có sẵn cho tất cả các ứng dụng để chia sẻ. Tôi phải dừng Tác nhân Máy chủ SQL để mọi thứ diễn ra suôn sẻ và ngăn Ứng dụng gặp sự cố cho Articiallt gây ra Ngoại lệ OutOfMemmroy. Đối với Giới hạn / Giới hạn Bộ nhớ Brutal nhân tạo, nếu Bộ nhớ trống có sẵn, Tại sao không sử dụng nó? Lý tưởng nhất là thà thiết lập một cách tự nhiên để thích nghi với những gì có sẵn thay vì chỉ bị giới hạn một cách "ngẫu nhiên". Nhưng tôi đoán đây là thiết kế phụ, vì vậy trường hợp đóng cửa ở điểm cuối cùng này.


6
Tại sao SQL Server giải phóng bộ nhớ? Nếu nó cần bộ nhớ để thực hiện thao tác này một lần, nó sẽ cần lại. Nếu SQL Server giải phóng bộ nhớ, bạn sẽ sử dụng nó để làm gì? Tại sao bộ nhớ cần phải được tự do? Nếu bạn sử dụng bộ nhớ cho mục đích khác, thì phần chèn lớn này sẽ chạy lại, điều gì sẽ xảy ra?
Aaron Bertrand

Hành động duy nhất bạn có thể thực hiện để tránh điều này là đặt kích thước bộ nhớ tối đa. Để "phục hồi" bộ nhớ, bạn có thể khởi động lại dịch vụ SQL Server. Rõ ràng, điều đó sẽ giải phóng bộ nhớ và khi dịch vụ khởi động lại, nó sẽ phân bổ bộ nhớ bình thường.
TMN

Tôi dọn dẹp bản chỉnh sửa cuối cùng. Nếu bạn muốn có một cuộc tranh luận / thảo luận về những ưu điểm hoặc vấn đề về cách SQL Server (hoặc bất kỳ công cụ DB nào khác) được mã hóa, vui lòng tìm một nơi tốt hơn để làm điều đó. Câu hỏi ban đầu đã được trả lời, rõ ràng là chính xác và đầy đủ. Nếu Q này tiếp tục leo, nó có thể bị khóa.
JNK

Không có gì sai khi muốn biết câu trả lời và thảo luận về phương pháp, chỉ không có ở đây trên trang web Hỏi & Đáp. Bạn chắc chắn có thể có cuộc thảo luận này trong trò chuyện hoặc diễn đàn ở đâu đó, nhưng Stack Exchange có cấu trúc và các câu hỏi thảo luận nhiều hơn một chút sẽ bị tắt rất nhanh.
JNK

3
Ngoài ra, với tư cách là người không điều hành, tôi tự hỏi tại sao bạn lại chạy những thứ không phải SQL trên máy chủ của mình? Hộp phải được dành riêng CHỈ cho SQL Server, nó giống như DBA 101. Công cụ này không được thiết kế cho môi trường tài nguyên dùng chung.
JNK

Câu trả lời:


12

Đó là hành vi bình thường đối với SQL Server để phân bổ càng nhiều bộ nhớ càng tốt vào vùng đệm của nó. Cơ sở dữ liệu hoạt động tốt nhất với nhiều bộ đệm. Nếu bạn muốn thay đổi hành vi, bạn có thể đặt cài đặt 'bộ nhớ máy chủ tối đa' . Một số đọc nền tốt trên đó là ở đây.


1
Đối với chỉnh sửa của bạn, bình luận của Aaron là một bình luận tốt. Lý do là có một điểm nhỏ trong máy chủ cơ sở dữ liệu giải phóng bộ nhớ. SQL Server sẽ đáp ứng với áp lực bộ nhớ và giải phóng bộ nhớ nếu nó thực sự phải, nhưng thực sự không cần thiết.
Matt Whitfield

@MikaJacobi Xin lỗi, nhưng lần chỉnh sửa thứ hai của bạn là sai. Từ suy nghĩ của nhà phát triển, tôi hiểu quan điểm của bạn, nhưng có một sự khác biệt giữa việc xây dựng một loạt các ứng dụng cùng tồn tại và một dịch vụ máy chủ thực sự là dịch vụ tiêu thụ bộ nhớ duy nhất trên máy. Nếu bạn muốn SQL Server hoạt động như một ứng dụng "bình thường", thì hãy đặt bộ nhớ tối đa và bỏ đi. Câu hỏi của bạn là tại sao nó hoạt động theo cách này, và điều đó đã được trả lời. Nếu câu hỏi của bạn bây giờ là "tốt, tôi không thích nó hoạt động theo cách đó" - xin lỗi, nhưng đó không còn là câu hỏi nữa.
Aaron Bertrand

Đủ công bằng. Quan điểm của tôi chỉ là nên có một tùy chọn để bật hoặc tắt và giả định rằng máy chủ SQL là Ứng dụng duy nhất trên Máy chủ thực sự bị lạm dụng (có thể đúng với các công ty lớn có mạng lớn nhưng đó không phải là duy nhất có thể cũng không phải là thiết lập phổ biến nhất)
Mehdi LAMRANI

Tôi vẫn không hiểu tại sao bạn cần SQL Server để giải phóng bộ nhớ. Nếu các ứng dụng khác sẽ cần nó, họ sẽ lấy lại từ SQL Server và SQL Server sẽ tuân thủ. Cho đến khi những ứng dụng khác cần nó, mục đích nào giải phóng bộ nhớ phục vụ?
Aaron Bertrand

1
@AaronBertrand Ok tôi có thể sai nhưng như đã nói trong lần chỉnh sửa mới nhất của tôi, đây không phải là điều tôi đã chứng kiến: Bộ nhớ không được giải phóng khi ứng dụng khác cần nó, gây ra sự cố Bộ nhớ (Do đó tôi không hài lòng ...) Đóng chủ đề, tôi đoán không có nhu cầu thực sự để tranh luận nhiều hơn thế.
Mehdi LAMRani

7

Nếu bạn thực sự muốn HĐH lấy lại bộ nhớ từ SQL Server, hãy lấy một tệp lớn 20 GB và sao chép nó qua mạng. SQL Server sẽ giải phóng bộ nhớ khi HĐH cần. Nhưng tôi sẽ xem một loạt các bộ đếm hiệu suất trong khi điều này đang diễn ra, và xem hiệu suất của BULK INSERT của bạn thay đổi như thế nào nếu bạn chạy lại nó trong khi bản sao đang diễn ra hoặc ngay sau đó.

Nếu bạn muốn thực hiện việc này một cách thủ công, thì bạn nên đặt giới hạn thấp hơn cho cài đặt bộ nhớ máy chủ tối đa của SQL Server và khởi động lại dịch vụ. Bây giờ SQL Server sẽ không sử dụng 28GB ngay cả khi nó cần. Nhưng điều này dường như là hạn chế giả tạo SQL Server.

Những gì bạn dường như mong đợi là hành vi linh hoạt hơn, nơi bạn có thể có bộ nhớ miễn phí một phần thời gian. Cho mục đích gì? Đây có giống như thu nhỏ tệp cơ sở dữ liệu để giải phóng không gian đĩa mà bạn không thể sử dụng cho các mục đích khác vì tệp cơ sở dữ liệu sẽ phát triển lại không?

Thật buồn cười, nếu bạn gõ một tìm kiếm Google cho "tại sao không phải là SQL Server" thì việc hoàn thành tự động phổ biến nhất là "giải phóng bộ nhớ".



"Những gì bạn dường như mong đợi là hành vi linh hoạt hơn." Chính xác. Tôi muốn máy chủ SQL sử dụng tất cả bộ nhớ có sẵn khi có sẵn, nhưng khi những khoảnh khắc nặng nề này kết thúc, hãy quay lại trạng thái "ngủ" và để các ứng dụng cần bộ nhớ khác thực hiện công việc của chúng một cách đáng tiếc (bạn có thể xem qua bản chỉnh sửa mới nhất vào thời điểm này)
Mehdi LAMRANI

Đối với một trường hợp cụ thể minh họa lý do tại sao tôi cần phải làm điều này, bạn có thể xem @ bình luận cuối cùng của tôi cho JNK ở cuối câu hỏi
Mehdi LAMRANI

4

Thật không may là do thiết kế, xin vui lòng tham khảo bài viết này. Tuy nhiên, trong bài đăng này, nó cung cấp cho bạn một số hướng dẫn về cách kiểm soát nó.

/server/251832/sql-server-bulk-insert-physical-memory- phát hành

Phân bổ bộ nhớ Chỉnh sửa

Bộ nhớ không hoạt freedđộng vì nó phân bổ bộ nhớ rất giống ứng dụng .NET. Vì phân bổ bộ nhớ là đắt, nó sẽ giữ cho phân bổ đó trừ khi HĐH yêu cầu. Nhưng, đừng sợ, nếu HĐH muốn có bộ nhớ thì nó sẽ lấy được, giống như trong ứng dụng .NET.


@MikaJacobi Chắc chắn, không vấn đề gì. Một điều khác cần lưu ý, chỉ để bạn biết, SQL Server cũng sẽ tiếp quản tất cả các lõi, vì vậy hãy đảm bảo bạn giới hạn số lượng lõi có sẵn. Tôi đã thấy SQL Server thực sự phá hủy hệ điều hành mà nó chạy trước đó và tôi đã phải khởi động lại một máy chủ SQL trung tâm dữ liệu.

Tốt để biết. Tôi có 24 lõi vì vậy bây giờ ok. Nhưng tại sao bộ nhớ không được giải phóng sau khi Chèn hàng loạt kết thúc?

Miễn là việc chèn số lượng lớn đã hoàn thành, nếu HĐH cần bộ nhớ thì nó sẽ được cấp cho nó, nhưng nó phân bổ bộ nhớ rất giống ứng dụng .NET để nếu nó cần và không ai khác có thể truy cập nhanh hơn.

Kinh nghiệm đã có của tôi mâu thuẫn với điều này (lần chỉnh sửa cuối cùng).
Mehdi LAMRani
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.