Bagaimana saya bisa menghapus cache kueri SQL Server?

199

Saya punya kueri sederhana yang dijalankan terhadap SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

Pertama kali saya mengeksekusi kueri dapat mengambil > 15 secs. Eksekusi berikutnya kembali < 1 sec.

Bagaimana saya bisa mendapatkan SQL Server 2005 untuk tidak menggunakan hasil cache? Saya sudah mencoba berlari

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Tapi ini tampaknya tidak berpengaruh pada kecepatan kueri (masih < 1 sec).

PaulB
sumber
DUPLICATE: stackoverflow.com/questions/1856966/… tapi lebih baik
Faiz

Jawaban:

259

Inilah beberapa penjelasan yang bagus. lihat itu.

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Dari artikel yang ditautkan:

Jika semua pengujian kinerja dilakukan dalam SQL Server pendekatan terbaik mungkin untuk mengeluarkan CHECKPOINT dan kemudian mengeluarkan perintah DBCC DROPCLEANBUFFERS. Meskipun proses CHECKPOINT adalah proses sistem internal otomatis dalam SQL Server dan terjadi secara teratur, penting untuk mengeluarkan perintah ini untuk menulis semua halaman kotor untuk database saat ini ke disk dan membersihkan buffer. Kemudian perintah DBCC DROPCLEANBUFFERS dapat dieksekusi untuk menghapus semua buffer dari kumpulan buffer.

Saar
sumber
14
Satu malam juga termasuk DBCC FREEPROCCACHE
jaraics
1
Saat menggunakan dropcleanbuffers, ini untuk semua orang yang terhubung ke database atau hanya untuk pengguna itu?
Kris Nobels
1
@Kris: DBCC DROPCLEANBUFFERS, menghapus semua buffer bersih dari buffer pool. Ini adalah langkah yang diperlukan dalam penyetelan kinerja permintaan dan seseorang tidak boleh menggunakannya pada SQL Server langsung.
Saar
Ini berfungsi baik untuk SQL Server, tetapi harap dicatat bahwa ini tidak berfungsi dalam SQL Azure - Saya telah memposting solusi alternatif di bawah ini untuk menangani skenario SQL Azure.
MSC
1
Bagus, ini adalah satu-satunya perintah yang benar-benar berfungsi, mencoba yang lain dan tidak berhasil.
Gabriel Rodriguez
15

Delapan cara berbeda untuk menghapus cache rencana

1. Hapus semua elemen dari cache rencana untuk seluruh instance

DBCC FREEPROCCACHE;

Gunakan ini untuk menghapus cache rencana dengan hati-hati. Membebaskan cache rencana menyebabkan, misalnya, prosedur tersimpan untuk dikompilasi ulang daripada digunakan kembali dari cache. Ini dapat menyebabkan penurunan tiba-tiba, sementara dalam kinerja permintaan.

2. Siram cache paket untuk seluruh instance dan tahan pesan penyelesaian rutin

"Eksekusi DBCC selesai. Jika DBCC mencetak pesan kesalahan, hubungi administrator sistem Anda."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Siram ad hoc dan siapkan cache rencana untuk seluruh instance

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Bilas ad hoc dan siapkan cache rencana untuk satu kumpulan sumber daya

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. Siram seluruh paket cache untuk satu kumpulan sumber daya

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Hapus semua elemen dari cache rencana untuk satu database (tidak berfungsi dalam SQL Azure)

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

7. Hapus cache rencana untuk database saat ini

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. Hapus satu paket permintaan dari cache

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

Sumber 1 2 3

Somnath Muluk
sumber
9

Meskipun pertanyaannya agak lama, ini mungkin masih membantu. Saya mengalami masalah serupa dan menggunakan opsi di bawah ini telah membantu saya. Tidak yakin apakah ini solusi permanen, tetapi sedang memperbaikinya untuk saat ini.

OPTION (OPTIMIZE FOR UNKNOWN)

Maka permintaan Anda akan seperti ini

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Tony Basallo
sumber
1
Sintaksis salah di dekat kata kunci 'OPTION'. atau Sintaksis salah dekat 'TIDAK DIKETAHUI'.
pabrams
1
@pabrams Ini mengikuti (sebagai bagian dari) permintaan Anda seperti:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius
1
Hanya pastikan TIDAK BENAR-BENAR Anda masukkan sesuatu seperti ini ke dalam kode PRODUKSI - karena itu dapat menyebabkan masalah UTAMA di jalan.
Michael K. Campbell
4
MENGOPTIMALKAN UNTUK DIKETAHUI tidak mengabaikan rencana cache. Alih-alih, ketika membuat rencana, ia memerintahkan SQL server untuk memilih "nilai distribusi rata-rata, terlepas dari parameterisasi [otomatis] apa pun" untuk memutuskan rencana apa yang akan dibuat - ini menghasilkan rencana yang mungkin lebih konsisten di seluruh statistik yang tidak seragam. OPSI (RECOMPILE) membuat rencana baru , tetapi tidak membersihkan / melepaskan cache data - ini biasanya menghasilkan rencana yang lebih ideal dengan mengorbankan regenerasi paket dan rencana biaya caching.
user2864740
6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Nilai apa yang Anda tentukan untuk memori server tidak penting, asalkan berbeda dari yang sekarang.

Btw, hal yang menyebabkan speedup bukan cache permintaan, tetapi cache data.

erikkallen
sumber
3

Perhatikan bahwa keduanya DBCC DROPCLEANBUFFERS;tidak DBCC FREEPROCCACHE;didukung di SQL Azure / SQL Data Warehouse.

Namun, jika Anda perlu mengatur ulang cache paket di SQL Azure, Anda dapat mengubah salah satu tabel dalam kueri (misalnya, cukup tambahkan lalu hapus kolom), ini akan memiliki efek samping dari menghapus paket dari cache .

Saya pribadi melakukan ini sebagai cara menguji kinerja kueri tanpa harus berurusan dengan rencana cache.

Lebih detail tentang Cache Prosedur Azure SQL di sini

MSC
sumber
Ini tidak berhasil untuk saya, maka rencana tidak berubah. Silakan lihat di sini stackoverflow.com/questions/46987785/…
Meneghino