SQL Server sorgu önbelleğini nasıl temizleyebilirim?


201

SQL Server 2005 karşı çalışan basit bir sorgu var

SELECT * 
FROM Table 
WHERE Col = 'someval'

Sorgu ilk çalıştırdığımda alabilir > 15 secs. Sonraki yürütmeler geri döndü < 1 sec.

SQL Server 2005'in önbelleğe alınmış sonuçları kullanmamasını nasıl sağlayabilirim? Koşmayı denedim

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Ancak bunun sorgu hızı üzerinde bir etkisi yok gibi görünüyor (hala < 1 sec).


DUPLICATE: stackoverflow.com/questions/1856966/… ama daha iyisi
Faiz

Yanıtlar:


260

İşte size bazı iyi açıklamalar. kontrol edin.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Bağlantılı makaleden:

Tüm performans testi SQL Server'da yapılırsa, en iyi yaklaşım bir CHECKPOINT vermek ve sonra DBCC DROPCLEANBUFFERS komutunu vermek olabilir. CHECKPOINT işlemi SQL Server'da otomatik bir iç sistem işlemi olmasına ve düzenli olarak gerçekleşmesine rağmen, geçerli veritabanının tüm kirli sayfalarının diske yazılması ve arabelleklerin temizlenmesi için bu komutu vermek önemlidir. Ardından, arabellek havuzundan tüm arabellekleri kaldırmak için DBCC DROPCLEANBUFFERS komutu yürütülebilir.


14
Bir görüşme ayrıca DBCC FREEPROCCACHE
jaraics 28:11

1
Dropcleanbuffers kullanırken bu veritabanına bağlı herkes için mi yoksa sadece bu kullanıcı için mi?
Kris Nobels

1
@Kris: DBCC DROPCLEANBUFFERS, tüm temiz arabellekleri arabellek havuzundan kaldırır. Bu, sorgu performans ayarında gerekli bir adımdır ve canlı SQL Server'da kullanılmamalıdır.
Saar

Bu SQL Server için iyi çalışıyor, ancak bunun SQL Azure'da çalışmadığını lütfen unutmayın - SQL Azure senaryosunu işlemek için aşağıda alternatif bir çözüm yayınladım.
MSC

1
Güzel, aslında çalışan, diğer pek çok şeyi deneyen ve çalışmayan tek komut budur.
Gabriel Rodriguez

15

Plan önbelleğini temizlemenin sekiz farklı yolu

1. Tüm örnek için plan önbelleğindeki tüm öğeleri kaldırın

DBCC FREEPROCCACHE;

Plan önbelleğini dikkatlice temizlemek için bunu kullanın. Plan önbelleğinin boşaltılması, örneğin, saklı bir yordamın önbellekten yeniden kullanılması yerine yeniden derlenmesine neden olur. Bu, sorgu performansında ani ve geçici bir düşüşe neden olabilir.

2. Tüm örnek için plan önbelleğini temizleyin ve normal tamamlanma mesajını bastırın

"DBCC yürütmesi tamamlandı. DBCC hata mesajları yazdırdıysa, sistem yöneticinize başvurun."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Tüm örnek için geçici ve hazırlanmış plan önbelleğini yıkayın

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Bir kaynak havuzu için geçici ve hazırlanmış plan önbelleğini yıkayın

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

5. Tek bir kaynak havuzu için tüm plan önbelleğini temizleyin

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Bir veritabanı için plan önbelleğinden tüm öğeleri kaldırın (SQL Azure'da çalışmaz)

-- 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. Geçerli veritabanı için plan önbelleğini temizle

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

8. Bir sorgu planını önbellekten kaldırın

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);
 

Kaynak 1 2 3


9

Soru biraz eski olsa da, yine de yardımcı olabilir. Benzer sorunlarla karşılaşıyorum ve aşağıdaki seçeneği kullanmak bana yardımcı oldu. Bunun kalıcı bir çözüm olup olmadığından emin değilim, ancak şimdilik düzeltiyor.

OPTION (OPTIMIZE FOR UNKNOWN)

O zaman sorgunuz böyle olacak

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
'OPTION' anahtar kelimesinin yanında yanlış sözdizimi. veya 'UNKNOWN' yakınındaki yanlış sözdizimi.
pabrams

1
@pabrams Bunlar sorgunuzu şu şekilde takip eder (parçası olarak):select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius

1
KESİNLİKLE böyle bir şeyi ÜRETİM koduna düşürmediğinizden emin olun - çünkü bu yolun önemli sorunlarına neden olabilir.
Michael K. Campbell

4
OPTİMİZE İÇİN BİLİNMEYEN yok değil önbelleğe planları görmezden. Bunun yerine, bir plan oluştururken SQL sunucusuna, hangi planın yaratılacağına karar vermek için "herhangi bir [otomatik] parametreleştirmeden bağımsız" ortalama dağıtım değerlerini seçmesini söyler - bu, tek biçimli olmayan istatistikler arasında daha tutarlı olabilecek planlarla sonuçlanır. Bir SEÇENEK (TAVSİYE) yeni bir plan oluşturur , ancak veri önbelleğini başka şekilde temizlemez / serbest bırakmaz - bu genellikle plan yenileme ve plan önbellek maliyetlerinden daha ideal planlar oluşturur.
user2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Sunucu belleği için belirttiğiniz değer, geçerli bellekten farklı olduğu sürece önemli değildir.

Btw, hızlandırmaya neden olan şey sorgu önbelleği değil, veri önbelleğidir.


3

SQL Azure / SQL Data Warehouse'da ne DBCC DROPCLEANBUFFERS;de DBCC FREEPROCCACHE;desteklenmediğini unutmayın .

Bununla birlikte, SQL Azure'da plan önbelleğini sıfırlamanız gerekirse, sorgudaki tablolardan birini değiştirebilirsiniz (örneğin, yalnızca bir sütun ekleyin ve sonra kaldırın), bunun planı önbellekten kaldırma yan etkisi olacaktır .

Ben şahsen önbelleğe alınmış planlarla uğraşmak zorunda kalmadan sorgu performansını test etmenin bir yolu olarak yapıyorum.

SQL Azure Yordam Önbelleği hakkında daha fazla bilgi burada


Bu benim için işe yaramadı, sonra plan değişmedi. Lütfen buraya bakın stackoverflow.com/questions/46987785/…
Meneghino
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.