SQL BULK Insert / BCP Dışa Aktarma İşleminden Sonra Kullanılan Bellek Serbest Bırakılmadı


10

Aşağıdaki gibi çok temel bir SQL tablosu oluşturduk

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]

Daha sonra 3 Gig Toplu Toplu Yerleştirdim

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

Sonra SQL sunucusu için RAM kullanımı Skyrocking gitti, ~ 30Go RAM yemek:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Bunun anormal bir davranış olduğunu ve bunu önlemek için önlem alınabileceğini düşünmeyi tercih ediyorum.

EDIT:
Tamam, bu varsayılan davranış gibi görünüyor. Yeterince adil.
Ancak, Toplu Ekleme tamamlandıktan sonra bellek neden uzun süre boşalmıyor?

Birkaç ek husus:
SQL sunucusunun işletim sistemi tarafından "söylendiğinde" belleği serbest bırakmasıyla ilgili yorumlardan dolayı, 24 Çekirdekli 32 Gb Xeon Sunucusundaki uygulamalı deneyimim bunun doğru olmadığını kanıtlıyor: Veri işleme uygulamamın ayıklanan verileri işlemesi gereken bir havuzu var ve SQL Server açıldığında daha uzun süren faaaaar süren işlerini gerçekleştirmek için kalan belleği paylaşmak için boğuluyor / savaşıyorlar. kapalı ve bellek tüm uygulamalar paylaşmak için kullanılabilir. Her şeyin yolunda gitmesi ve uygulamaların OutOfMemmroy Exception'a neden olan Articiallt için çökmesini önlemek için SQL Server Agent'ı durdurmam gerekiyor. Yapay Brutal Bellek Sınırlama / Sınırlama ile ilgili olarak, Boş Bellek varsa, neden kullanmıyorsun? İdeal olarak, zorla "rastgele" sınırlanmaktan ziyade, mevcut olana uyum sağlamak için dinamik olarak ayarlanmış olmayı tercih eder. Ama sanırım bu yan tasarım, bu yüzden bu son noktada dava kapandı.


6
SQL Server neden belleği boşaltmalıdır? Bu işlemi bir kez yapmak için belleğe ihtiyaç duyuyorsa, tekrar gerekir. SQL Server belleği serbest bırakırsa, ne için kullanırsınız? Belleğin neden boş olması gerekiyor? Belleği başka bir şey için kullanırsanız, bu toplu ekleme tekrar çalışır, ne olmalı?
Aaron Bertrand

Bundan kaçınmak için yapabileceğiniz tek işlem maksimum bellek boyutunu ayarlamaktır. Belleği "kurtarmak" için SQL Server hizmetini yeniden başlatabilirsiniz. Açıkçası, bu belleği serbest bırakır ve hizmet yeniden başladığında belleği normal olarak tahsis eder.
TMN

Son düzenlemeyi temizledim. SQL Server'ın (veya başka bir DB motorunun) kodlanmasının esasları veya sorunları hakkında bir tartışma / tartışma yapmak istiyorsanız, lütfen bunu yapmak için daha iyi bir yer bulun. Orijinal soru, görünüşte doğru ve yeterince cevaplandı. Eğer bu Q sürünmeye devam ederse kilitlenebilir.
JNK

Yanıtları bilmek ve metodolojileri tartışmakla ilgili yanlış bir şey yok, sadece burada bir Soru-Cevap sitesinde değil. Bu tartışmayı kesinlikle sohbet veya bir yerde bir forumda yapabilirsiniz, ancak Stack Exchange biraz daha yapılandırılmış ve tartışma soruları çok hızlı bir şekilde kapanacaktır.
JNK

3
Ayrıca, moderatör olmayan olarak neden sunucunuzda SQL olmayan şeyler çalıştırdığınızı merak ediyorum? Kutunun SADECE SQL Server için ayrılması gerekir, bu DBA 101 gibidir. Motor, paylaşılan bir kaynak ortamı için tasarlanmamıştır.
JNK

Yanıtlar:


12

SQL Server'ın arabellek havuzuna mümkün olduğunca çok bellek ayırması normal bir davranıştır. Veritabanları çok sayıda arabellekle en iyi şekilde çalışır. Davranışı değiştirmek isterseniz, 'maksimum sunucu belleği' ayarını belirleyebilirsiniz . Bununla ilgili bazı iyi arka plan okumaları burada.


1
Düzenlemenizle ilgili olarak, Aaron'un yorumu iyi bir yorumdur. Bunun nedeni, bir veritabanı sunucusunda belleği boşaltmanın pek bir anlamı olmamasıdır. SQL Server, bellek basıncına yanıt verir ve gerçekten gerekiyorsa belleği serbest bırakır, ancak gerçekten gerekli değildir.
Matt Whitfield

@MikaJacobi Üzgünüz, ancak ikinci düzenlemeniz yanlış. Bir geliştirici zihniyetinden bakış açınızı anlıyorum, ancak birlikte varolan bir grup uygulama oluşturmak ve makinede gerçekten bellek tüketen tek hizmet olması gereken bir sunucu hizmeti arasında bir fark var. SQL Server'ın "normal" bir uygulama gibi davranmasını istiyorsanız, maksimum belleği ayarlayın ve uzaklaşın. Sorunuz, neden bu şekilde çalıştığıydı ve bu cevaplandı. Sorunuz şimdi "iyi bu şekilde çalışmasını sevmiyorum" ise - üzgünüm, ama bu artık bir soru değil.
Aaron Bertrand

Yeterince adil. Benim bakış açım, sadece bunu açıp kapatmak için bir seçenek olması gerektiğidir ve SQL sunucusunun bir Sunucudaki tek Uygulama olduğu varsayımı gerçekten kötüdür (büyük ağları olan büyük şirketler için doğru olabilir, ancak bu sadece ne de en yaygın kurulum)
Mehdi LAMRANI

Belleği boşaltmak için neden SQL Server'a ihtiyacınız olduğunu hala anlamıyorum. Diğer uygulamalar buna ihtiyaç duyarsa, SQL Server'dan geri alır ve SQL Server uyumlu olur. Bu diğer uygulamaların ihtiyacı olana kadar, belleği boşaltmanın amacı nedir?
Aaron Bertrand

1
@AaronBertrand Tamam Yanılıyor olabilirim ama son düzenlememde belirtildiği gibi, tanık olduğum şey bu değildi: Başka bir uygulama zorlukla ihtiyaç duyduğunda bellek serbest bırakılmadı, Bellek Çökmelerine neden oldu (Bu yüzden memnuniyetsizliğim ...) Neyse, hadi konuyu kapat, sanırım bundan daha fazla tartışmaya gerek yok.
Mehdi LAMRANI

7

İşletim sisteminin belleği SQL Server'dan geri almasını istiyorsanız, 20 GB'lık büyük bir dosya alın ve ağ üzerinden kopyalayın. SQL Server, işletim sisteminin ihtiyaç duyduğu şekilde belleği serbest bırakır. Ancak bu devam ederken çeşitli performans sayaçlarını izlerdim ve BULK INSERT'inizin, kopya devam ederken veya hemen sonra tekrar çalıştırırsanız performansının nasıl değiştiğini görürüm.

Bunu el ile yapmak istiyorsanız, SQL Server'ın maksimum sunucu belleği ayarında daha düşük bir sınır belirlemeniz ve hizmeti yeniden başlatmanız gerekir. SQL Server artık ihtiyaç duysa bile 28GB kullanmayacak. Ancak bu yapay olarak SQL Server'ı sınırlıyor gibi görünüyor.

Beklediğiniz gibi, zamanın boş belleğine sahip olabileceğiniz daha esnek davranış. Ne amaçla? Bu, veritabanı dosyası yeniden büyüyeceği için başka amaçlarla kullanamayacağınız disk alanını boşaltmak için bir veritabanı dosyasını küçültmek gibi mi?

Çok komik, "Neden SQL Server" için bir Google araması yazarsanız, en yaygın otomatik tamamlama "serbest bırakma belleği" dir.



"Beklediğiniz gibi görünen şey daha esnek bir davranış." Kesinlikle. SQL Server kullanılabilir olduğunda tüm avaialble bellek kullanmak istiyorum, ama bu ağır anlar bittiğinde, "uyku" durumuna geri dönmek ve diğer bellek gerektiren uygulamalar işlerini uyumlu bir şekilde yapmak (benim bir göz atabilirsiniz Bu noktada yeni son düzenleme)
Mehdi LAMRANI

Bunu neden yapmam gerektiğini gösteren somut bir dava için, sorunun
sonundaki JNK'ya

4

Bu maalesef tasarım gereğidir, lütfen bu gönderiye bakın. Ancak, bu yazıda, onu nasıl kontrol edeceğiniz konusunda bazı talimatlar verir.

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

Bellek Ayırma Düzenlemesi

Bellek, freed.NET uygulaması gibi bellek ayırdığı için boş değil . Bellek ayırma pahalı olduğundan, işletim sistemi istemediği sürece bu ayırmaya bağlı kalacaktır. Ancak, korkmayın, işletim sistemi belleği istiyorsa, tıpkı bir .NET uygulamasında olduğu gibi alacaktır.


@MikaJacobi Elbette, sorun değil. Dikkat edilmesi gereken bir başka şey de, SQL Server'ın tüm çekirdeği de ele geçireceğinden mevcut çekirdek sayısını sınırladığınızdan emin olun. SQL Server aslında daha önce üzerinde çalışan işletim sistemini yok gördüm ve bir veri merkezi SQL Server'ı yeniden başlatmak zorunda kaldı.

Bunu bildiğim iyi oldu. Şimdilik 24 Çekirdeğim var. Ancak Toplu Ekleme bittikten sonra bellek neden boşalmıyor?

Toplu ekleme tamamlandığı sürece, işletim sistemi belleğe ihtiyaç duyuyorsa, ona bellek verilecektir, ancak belleği bir .NET uygulaması gibi tahsis eder, böylece ihtiyacı varsa ve hiç kimse buna daha hızlı erişemez.

Benim açık deneyimim bununla çelişiyor (son düzenleme seel).
Mehdi LAMRANI
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.