SQL BULK Insert / BCP Export 후에 사용 된 메모리가 해제되지 않습니다


10

다음과 같이 매우 기본적인 SQL 테이블을 만들었습니다.

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]

그런 다음 3Gig Bulk Insert를 수행했습니다.

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

그런 다음 SQL 서버의 RAM 사용량이 Skyrocking으로 이동하여 ~ 30Go의 RAM을 소비했습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

나는 이것이 비정상적인 행동이라고 생각하고 이것을 피하기 위해 조치를 취할 수 있다고 생각합니다.

편집 :
좋아, 이것은 기본 동작 인 것 같습니다. 그럴 수 있지.
그러나 대량 삽입이 완료된 후 왜 메모리가 해제되지 않습니까?

몇 가지 추가 고려 사항 :
OS가 "통합"할 때 메모리를 비우는 SQL Server에 대한 의견에 따르면 24-Core 32Gb Xeon Server에서의 실습 경험은 이것이 정확하지 않은 것으로 판명되었습니다 : 일단 메모리가 풍부한 BCP 추출이 끝나면 추출 된 데이터를 처리 해야하는 내 데이터 처리 응용 프로그램의 .Net 인스턴스 풀이 있으며 남은 메모리를 공유하여 작업을 수행하려고 시도하기 위해 질식 / 파이팅 상태로 남아 있습니다 .SQL Server가 켜질 때보 다 시간이 오래 걸립니다. 모든 응용 프로그램에서 공유 및 메모리를 사용할 수 있습니다. 모든 것이 순조롭게 진행되고 Articiallt가 OutOfMemmroy 예외를 일으킨 응용 프로그램이 충돌하지 않도록 SQL Server 에이전트를 중지해야합니다. 인공적인 잔인한 메모리 캡핑 / 제한에 대해 사용 가능한 메모리가 사용 가능한 경우, 왜 사용하지 않습니까? 이상적으로는 단지 "무작위로"강제로 제한되는 것이 아니라 이용 가능한 것에 적응하도록 동적으로 설정 될 것이다. 그러나 이것은 의도적으로 설계된 것이므로이 마지막 시점에서 사건이 마감되었습니다.


6
SQL Server가 메모리를 해제해야하는 이유는 무엇입니까? 이 작업을 한 번 수행하기 위해 메모리가 필요한 경우 다시 메모리가 필요합니다. SQL Server가 메모리를 해제했다면 어떤 용도로 사용 하시겠습니까? 메모리를 확보해야하는 이유는 무엇입니까? 다른 용도로 메모리를 사용하면이 대량 삽입이 다시 실행됩니다. 어떻게해야합니까?
Aaron Bertrand

이를 피하기 위해 취할 수있는 유일한 조치는 최대 메모리 크기를 설정하는 것입니다. 메모리를 "복구"하기 위해 SQL Server 서비스를 다시 시작할 수 있습니다. 분명히 메모리가 해제되고 서비스가 다시 시작되면 메모리가 정상적으로 할당됩니다.
TMN

마지막 편집 내용을 정리했습니다. SQL Server (또는 다른 DB 엔진)를 코딩하는 방법의 장점 또는 문제점에 대한 논쟁 / 토론을하고 싶다면 더 좋은 곳을 찾으십시오. 원래 질문은 분명히 정확하고 충분하게 대답되었습니다. 이 Q가 계속 오싹하면 잠길 수 있습니다.
JNK

Q & A 사이트가 아니라 답변을 알고 방법론을 논의하려는 데 아무런 문제가 없습니다 . 대화 나 포럼에서이 토론을 할 수는 있지만 Stack Exchange는 좀 더 체계적이며 토론-질문은 매우 빨리 종료됩니다.
JNK

3
또한 중재자가 아닌 사용자가 왜 서버에서 SQL 이외의 것을 실행하는지 궁금합니다. 이 상자는 SQL Server 용으로 예약되어 있어야하며 DBA 101과 비슷합니다. 엔진은 공유 자원 환경 용으로 설계되지 않았습니다.
JNK

답변:


12

SQL Server가 버퍼 풀에 최대한 많은 메모리를 할당하는 것은 정상적인 동작입니다. 데이터베이스는 많은 버퍼에서 가장 잘 작동합니다. 동작을 변경하려면 'max server memory'설정을 지정할 수 있습니다 . 그것에 대한 좋은 배경 독서가 여기 있습니다.


1
편집 내용과 관련하여 Aaron의 의견은 좋은 의견입니다. 그 이유는 데이터베이스 서버에 메모리를 확보 할 지점이 거의 없기 때문입니다. SQL Server는 메모리 부족에 반응하여 실제로 필요한 경우 메모리를 해제하지만 실제로는 필요하지 않습니다.
매트 위트 필드

@MikaJacobi 죄송합니다. 두번째 수정은 잘못되었습니다. 개발자의 견해로는 귀하의 관점을 이해하지만 공존하는 많은 응용 프로그램을 구축하는 것과 실제로 컴퓨터에서 메모리를 많이 사용하는 서버 서비스 인 서버 서비스 사이에는 차이가 있습니다. SQL Server가 "정상적인"응용 프로그램처럼 동작하도록하려면 최대 메모리를 설정하고 자리를 비우십시오. 귀하의 질문은 왜 이런 식으로 작동하는지에 대한 답변이었습니다. 귀하의 질문이 지금 "그런 식으로 작동하는 것을 좋아하지 않습니다"-미안하지만 더 이상 질문은 아닙니다.
Aaron Bertrand

그럴 수 있지. 내 관점은 이것을 켜거나 끌 수있는 옵션이 있어야한다는 것입니다 .SQL 서버가 서버의 유일한 응용 프로그램이라는 가정은 실제로 모욕적입니다 (네트워크가 큰 대기업에게는 사실 일 수 있지만 유일한 것은 아닙니다) 가능하거나 가장 일반적인 설정)
Mehdi LAMRANI

메모리를 확보하기 위해 왜 SQL Server가 필요한지 이해하지 못합니다. 다른 응용 프로그램에 필요한 경우 SQL Server에서 다시 가져 와서 SQL Server가 준수합니다. 이러한 다른 응용 프로그램이 필요할 때까지 메모리를 비우는 목적은 무엇입니까?
Aaron Bertrand

1
@AaronBertrand Ok 틀렸을 수도 있지만 새로운 마지막 편집에서 언급했듯이 이것은 내가 목격 한 것이 아닙니다. 다른 응용 프로그램이 거의 필요하지 않을 때 메모리가 해제되지 않아 메모리 충돌이 발생합니다 (따라서 불만족 ...) 어쨌든,합시다. 주제를 닫으면 그 이상으로 논쟁 할 필요가 없다고 생각합니다.
Mehdi LAMRANI

7

OS가 SQL Server에서 메모리를 다시 가져 오도록하려면 큰 20GB 파일을 가져 와서 네트워크를 통해 복사하십시오. SQL Server는 OS에서 필요에 따라 메모리를 해제합니다. 그러나 나는 이것이 진행되는 동안 다양한 성능 카운터를보고 복사가 진행되는 동안이나 직후에 다시 실행하면 BULK INSERT의 성능이 어떻게 변하는 지 볼 것입니다.

이 작업을 수동으로 수행하려면 SQL Server의 최대 서버 메모리 설정에서 하한을 설정하고 서비스를 다시 시작해야합니다. 이제 SQL Server는 필요한 경우에도 28GB를 사용하지 않습니다. 그러나 이것은 인위적으로 SQL Server를 제한하는 것으로 보입니다.

당신이 기대하는 것은 시간의 여유 공간을 확보 할 수있는보다 유연한 행동입니다. 무슨 목적을 위해? 데이터베이스 파일이 다시 커질 것이므로 다른 목적으로는 사용할 수없는 디스크 공간을 확보하기 위해 데이터베이스 파일을 축소하는 것과 같은가요?

"SQL Server가 아닌 이유"에 대한 Google 검색을 입력하면 가장 일반적인 자동 완성은 "릴리스 메모리"입니다.



"당신이 기대하는 것은보다 유연한 행동입니다." 바로 그거죠. SQL 서버가 사용 가능할 때 모든 사용 가능한 메모리를 사용하기를 원하지만 이러한 심각한 순간이 끝나면 "휴면"상태로 돌아가고 다른 메모리 필요 응용 프로그램이 작업을 편안하게 수행하게하십시오 (내가 볼 수 있음) 이 시점에서 새로운 마지막 편집)
Mehdi LAMRANI

내가 왜 이것을해야 하는지를 설명하는 구체적인 사례에 대해서는 질문 맨 아래에서 JNK에 대한 나의 마지막 논평을 살펴볼 수 있습니다.
Mehdi LAMRANI

4

불행히도 이것은 의도적으로 설계된 것이므로이 게시물을 참조하십시오. 그러나이 게시물에서는 그것을 제어하는 ​​방법에 대한 지침을 제공합니다.

/server/251832/sql-server-bulk-insert-physical-memory-issue

메모리 할당 편집

메모리는 freed.NET 응용 프로그램과 같이 메모리를 많이 할당하기 때문에 작동 하지 않습니다 . 메모리 할당이 비싸기 때문에 OS가 요청하지 않는 한 해당 할당을 보류합니다. 그러나 OS가 메모리를 원한다면 .NET 응용 프로그램에서와 같이 메모리를 얻을 수 있습니다.


@MikaJacobi 물론, 문제 없습니다. 참고로 SQL Server가 모든 코어를 대신하므로 사용 가능한 코어 수를 제한해야합니다. SQL Server가 이전에 실행되는 운영 체제를 실제로 파괴하는 것을 보았고 데이터 센터 SQL Server를 하드 재부팅해야했습니다.

알아 둘만 한. 나는 24 코어를 가지고 있으므로 지금은 괜찮습니다. 그러나 대량 삽입이 끝난 후에 왜 메모리가 해제되지 않습니까?

대량 삽입이 완료되는 한 OS에 메모리가 필요한 경우 메모리가 제공되지만 .NET 응용 프로그램과 같이 메모리를 많이 할당하여 필요한 경우 다른 사람이 더 빨리 액세스 할 수 있습니다.

나의 경험은 이것과 모순된다 (마지막 편집 편집).
Mehdi LAMRANI
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.