Memori yang dioptimalkan DLL tidak dihapus

8

Dari BOL, pemahaman saya adalah bahwa DBA tidak perlu mengelola DLL yang dibuat untuk tabel yang dioptimalkan memori, atau secara alami menyusun prosedur tersimpan, karena mereka dikompilasi ulang secara otomatis, ketika layanan SQL Server dimulai dan dihapus ketika tidak lagi diperlukan. Tetapi saya menyaksikan, bahwa bahkan setelah tabel memori dioptimalkan telah jatuh, dan layanan restart, DLL masih ada dalam sistem file DAN masih dimuat ke dalam memori SQL dan melekat pada proses. Ini dapat disaksikan oleh fakta bahwa mereka masih terlihat di sys_dm_os_loaded_modules, dan dikunci dalam sistem file jika Anda mencoba untuk menghapusnya, sementara Layanan SQL sedang berjalan.

Apakah ini bug? Atau apakah mereka dibersihkan di kemudian hari? Jika di kemudian hari, apa yang memicu pembersihan, jika itu bukan contoh restart?

Pete
sumber

Jawaban:

4

Apakah ini bug?

Tidak, itu bukan bug. Dengan desain. Mereka disimpan untuk tujuan pemecahan masalah dan dukungan.

Dari SQL_Server_2014_In-Memory_OLTP White_Paper

Administrator database tidak perlu memelihara file yang dihasilkan oleh kompilasi asli. SQL Server secara otomatis menghapus file yang dihasilkan yang tidak lagi diperlukan, misalnya pada tabel dan penghapusan prosedur tersimpan, dan pada drop database, tetapi juga pada server atau restart database.

Saya mencoba repro skenario Anda pada SQL Server 2014 + RTM + (Build12.0.2000.8)- Dev Edition server dengan membuat tabel uji memori yang dioptimalkan dan memeriksa dll dimuat menggunakan

     SELECT name, description FROM sys.dm_os_loaded_modules
WHERE description = 'XTP Native DLL'

Setelah saya menjatuhkan meja saya, dllmasih muncul di output pernyataan pilih di atas dan file-file masih dalam folder dan setelah restart mereka masih ada juga.

Dari Buku Online -

Tidak diperlukan interaksi pengguna untuk mengelola file-file ini ( .c, .obj, .xml, .pdb., .dll). SQL Server akan membuat dan menghapus file yang diperlukan.

Jadi saya kira, kita hanya harus mengikuti apa yang dikatakan Microsoft - SQL server akan mengaturnya untuk kita :-)

HANYA UNTUK TUJUAN PENDIDIKAN:

Saya berhasil membersihkan file lama dengan

  • Menerbitkan manual CHECKPOINTpada basis data.
  • Membuat database offline dan kemudian membawanya online.

Idealnya, Anda tidak harus me-restart instance server, hanya pos pemeriksaan manual dan offline / online dari database yang akan menghapus file.

misalnya Repro:

USE master
GO
create database db1
GO
ALTER DATABASE db1 ADD FILEGROUP db1_mod CONTAINS memory_optimized_data
GO
-- adapt filename as needed
ALTER DATABASE db1 ADD FILE (name='db1_mod', filename='D:\SQLServer2014\MSSQL12.SQL2014\MSSQL\DATA\db1_mod') -- change here as per your need !!
 TO FILEGROUP db1_mod
GO
USE db1
GO
CREATE TABLE dbo.t1
(c1 int not null primary key nonclustered,
c2 int)
WITH (MEMORY_OPTIMIZED=ON)
GO

--- sekarang periksa apakah dll dimuat atau tidak

SELECT name, description FROM sys.dm_os_loaded_modules WHERE description = 'XTP Native DLL'

masukkan deskripsi gambar di sini

--- sekarang drop table dan lakukan pemeriksaan manual

use db1;
drop table dbo.t1;
checkpoint

Namun modul ini dimuat dalam memori (bahkan server yang restart kadang-kadang memuat modul )

masukkan deskripsi gambar di sini

The ( .c, .obj, .xml, .pdb., .dll) masih ada di folder:

masukkan deskripsi gambar di sini

Sekarang ambillah basis data offline dan bawa online - ( .c, .obj, .xml, .pdb., .dll) semuanya hilang ...

masukkan deskripsi gambar di sini

Kin Shah
sumber