Saya telah membuat tabel SQL yang sangat mendasar sebagai berikut
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]
Saya kemudian melakukan Insert Massal 3 Gig
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Kemudian penggunaan RAM untuk server SQL pergi Skyrocking, memakan ~ 30Go RAM:
Saya lebih suka berpikir ini adalah perilaku abnormal dan tindakan dapat diambil untuk menghindari hal ini.
EDIT:
Ok, Ini tampaknya menjadi perilaku default. Cukup adil.
Namun, mengapa memori tidak dibebaskan lama setelah Sisipan Massal selesai?
Beberapa pertimbangan ekstra:
Pada komentar tentang SQL server yang membebaskan memori ketika "disuruh" oleh OS, pengalaman langsung saya pada Server 24-Core 32 Gb Xeon membuktikan ini tidak eksak: Setelah ekstrak BCP Memory-Voracious selesai Saya memiliki kumpulan .Net Instances dari aplikasi pemrosesan data saya yang perlu memproses data yang diekstraksi, dan mereka dibiarkan tersedak / berjuang untuk berbagi memori yang tersisa untuk mencoba melakukan pekerjaan mereka, yang membutuhkan waktu lebih lama ketika SQL Server diaktifkan mati dan memori tersedia untuk semua aplikasi untuk dibagikan. Saya harus menghentikan Agen SQL Server untuk membuat semuanya berjalan lancar dan mencegah Aplikasi dari crash untuk Articiallt yang menyebabkan Pengecualian OutOfMemmroy. Adapun Pembatasan / Pembatasan Memori Brutal buatan, jika Memori Gratis tersedia, mengapa tidak menggunakannya? Idealnya ia lebih suka diatur secara dinamis untuk beradaptasi dengan apa yang tersedia daripada hanya secara paksa dibatasi "secara acak". Tapi saya kira ini adalah desain, jadi case ditutup pada poin terakhir ini.
sumber
Jawaban:
Ini adalah perilaku normal untuk SQL Server untuk mengalokasikan memori sebanyak mungkin ke kolam penyangga itu. Database berfungsi dengan baik dengan banyak buffer. Jika Anda ingin mengubah perilaku, Anda dapat mengatur pengaturan 'memori server maks' . Beberapa bacaan latar belakang yang bagus tentang itu ada di sini.
sumber
Jika Anda benar-benar ingin OS mengambil kembali memori dari SQL Server, ambil file besar 20 GB dan salin melalui jaringan. SQL Server akan melepaskan memori sesuai kebutuhan OS. Tetapi saya akan menonton berbagai penghitung kinerja saat ini sedang berlangsung, dan melihat bagaimana kinerja BULK INSERT Anda berubah jika Anda menjalankannya lagi baik ketika salinan sedang berlangsung atau segera setelah itu.
Jika Anda ingin melakukan ini secara manual, maka Anda harus menetapkan batas yang lebih rendah pada pengaturan memori server maks SQL Server, dan restart layanan. Sekarang SQL Server tidak akan menggunakan 28GB bahkan jika dibutuhkan. Tapi ini tampaknya membatasi SQL Server secara artifisial.
Apa yang tampaknya Anda harapkan adalah perilaku yang lebih fleksibel, di mana Anda dapat memiliki sebagian memori bebas. Untuk tujuan apa? Apakah ini seperti menyusutkan file database untuk membebaskan ruang disk yang tidak dapat Anda gunakan untuk keperluan lain karena file database akan tumbuh lagi?
Itu lucu, jika Anda mengetik pencarian Google untuk "mengapa tidak SQL Server" penyelesaian otomatis yang paling umum adalah "lepaskan memori."
sumber
Sayangnya ini karena desain, silakan merujuk posting ini. Namun, dalam posting ini ia memberi Anda beberapa petunjuk tentang cara mengendalikannya.
/server/251832/sql-server-bulk-insert-physical-memory-issue
Edit Alokasi Memori
Memori tidak
freed
naik karena banyak mengalokasikan memori seperti aplikasi .NET. Karena alokasi memori mahal, ia akan mempertahankan alokasi itu kecuali jika OS memintanya. Tapi, jangan takut, jika OS menginginkan memori itu akan mendapatkannya, sama seperti di aplikasi NET.sumber