SQL Server, düzenli aralıklarla plan önbelleğini ve yürütme istatistiklerini temizler


24

SQL Server 2014'ü 2016'ya yükselttikten sonra, sunucu her birkaç saatte bir önbelleğe alınmış yürütme planlarını ve dm*görünümlerini (gibi dm_exec_query_stats) vb. Sıfırlamaya devam ediyor

Sanki birisi çalıştırır DBCC FREEPROCCACHEve DBCC DROPCLEANBUFFERSel ile çalışır ( kimse yapmazsa otomatik olarak gerçekleşir).

Aynı veritabanı SQL Server 2014 ve Windows Server 2012'de iyi çalıştı, SQL Server 2016'ya (ve Windows Server 2016'ya) geçtikten sonra işler güneye gitti.

Kontrol ettiğim şeyler: veritabanında "otomatik kapanma" bayrağı bulunmuyor . SQL server (yardım edeceğini düşündüm, vermedi) olarak ad hoc optimizedayarlandı true. "Sorgu deposu" "kapalı" dır. Sunucunun 16 GB belleği var.

"SQL Server günlüğünde" de hiçbir şey yardımcı değil. Sadece haftalık bir yedekleme mesajı ...

Bu makaleyi ayrıca https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options ("Örnekler" bölümüne ve aşağı yukarı kaydırın) yazdım. o) Planın otomatik olarak silindiği durumların bir listesi vardır. Bunların hiçbiri geçerli değil.

GÜNCELLEŞTİRME:

Ne yazık ki, önerilerden hiçbiri yardımcı olmadı. LPIM izinleri vermek, aynı sorgu için tonlarca plan üreten ve "maksimum sunucu belleği" değerini düşüren parametrelenmemiş sorguları tespit etmek ve düzeltmek ... Planlar her birkaç saatten bir, her 5-10 dakikada bir rasgele sıfırlamayı sürdürüyor. Eğer sunucu “hafıza baskısı altındaysa”, nasıl oldu da 2014 versiyonunda aynı makina üzerinde çalışıyordu.

İşte istendiği gibi sp_Blitz çıktısı

**Priority 10: Performance**:

- Query Store Disabled - The new SQL Server 2016 Query Store feature has not been enabled on this database.

    * xxx


**Priority 50: Server Info**:

- Instant File Initialization Not Enabled  - Consider enabling IFI for faster restores and data file growths.


**Priority 100: Performance**:

- Resource Governor Enabled  - Resource Governor is enabled.  Queries may be throttled.  Make sure you understand how the Classifier Function is configured.


**Priority 120: Query Plans**:

- Implicit Conversion Affecting Cardinality - One of the top resource-intensive queries has an implicit conversion that is affecting cardinality estimation.

    * 

- Missing Index - One of the top resource-intensive queries may be dramatically improved by adding an index.

    * 

- RID or Key Lookups - One of the top resource-intensive queries contains RID or Key Lookups. Try to avoid them by creating covering indexes.

    * 

**Priority 170: File Configuration**:

- System Database on C Drive
    * master - The master database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.

    * model - The model database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.

    * msdb - The msdb database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.


**Priority 200: Backup**:

- MSDB Backup History Not Purged msdb - Database backup history retained back to Jun 10 2017  9:47PM


**Priority 200: Informational**:

- Backup Compression Default Off  - Uncompressed full backups have happened recently, and backup compression is not turned on at the server level. Backup compression is included with SQL Server 2008R2 & newer, even in Standard Edition. We recommend turning backup compression on by default so that ad-hoc backups will get compressed.


**Priority 200: Non-Default Server Config**:

- Agent XPs  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- max server memory (MB)  - This sp_configure option has been changed.  Its default value is 2147483647 and it has been set to 15000.

- optimize for ad hoc workloads  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- show advanced options  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- xp_cmdshell  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.


**Priority 200: Performance**:

- Buffer Pool Extensions Enabled  - You have Buffer Pool Extensions enabled, and one lives here: Z:\sql_buffer_pool.BPE. It's currently 60.00000000000 GB. Did you know that BPEs only provide single threaded access 8KB (one page) at a time?

- cost threshold for parallelism  - Set to 5, its default value. Changing this sp_configure setting may reduce CXPACKET waits.

**Priority 240: Wait Stats**:

- No Significant Waits Detected  - This server might be just sitting around idle, or someone may have cleared wait stats recently.

**Priority 250: Informational**:

- SQL Server Agent is running under an NT Service account  - I'm running as NT Service\SQLSERVERAGENT. I wish I had an Active Directory service account instead.

- SQL Server is running under an NT Service account  - I'm running as NT Service\MSSQLSERVER. I wish I had an Active Directory service account instead.

**Priority 250: Server Info**:

- Default Trace Contents  - The default trace holds 125 hours of data between Aug 19 2017 11:55AM and Aug 24 2017  4:59PM. The default trace files are located in: C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log

- Hardware  - Logical processors: 2. Physical memory: 15GB.

- Hardware - NUMA Config  - Node: 0 State: ONLINE Online schedulers: 2 Offline schedulers: 0 Processor Group: 0 Memory node: 0 Memory VAS Reserved GB: 29

- Locked Pages In Memory Enabled  - You currently have 12.02534484863 GB of pages locked in memory.

- Memory Model Unconventional  - Memory Model: LOCK_PAGES

- Server Last Restart  - Aug 20 2017 12:32PM

- Server Name  - xx

- Services
 - Service: SQL Full-text Filter Daemon Launcher (MSSQLSERVER) runs under service account NT Service\MSSQLFDLauncher. Last startup time: not shown.. Startup type: Manual, currently Running.

 - Service: SQL Server (MSSQLSERVER) runs under service account NT Service\MSSQLSERVER. Last startup time: Aug 20 2017 12:32PM. Startup type: Automatic, currently Running.

 - Service: SQL Server Agent (MSSQLSERVER) runs under service account NT Service\SQLSERVERAGENT. Last startup time: not shown.. Startup type: Automatic, currently Running.

- SQL Server Last Restart  - Aug 20 2017 12:33PM

- SQL Server Service  - Version: 13.0.4446.0. Patch Level: SP1. Edition: Enterprise Edition (64-bit). AlwaysOn Enabled: 0. AlwaysOn Mgr Status: 2

- Virtual Server  - Type: (HYPERVISOR)

- Windows Version  - You're running a pretty modern version of Windows: Server 2012R2 era, version 6.3


**Priority 254: Rundate**:

 - Captain's log: stardate something and something...

1
Ben de aynı sorunu çözdüm, deneyebilirsiniz. dba.stackexchange.com/questions/179618/query-plan-deleted/…
Yunus UYANIK

Yanıtlar:


27

İlk olarak, plan önbelleği temizlenirken tam zamanı görün. İşte bunu yapmanın en kolay yolu - neredeyse anında çalışması gerekiyor ve kimseyi engellemiyor:

SELECT TOP 1 creation_time
FROM sys.dm_exec_query_stats WITH (NOLOCK)
ORDER BY creation_time;

Bu tarih / saat beklediğinizden daha eski görünüyorsa , plan önbelleğinin yalnızca bir kısmı temizlenir. Örneğin, belki birileri, etkilenen belirli nesneler için plan önbelleğini temizleyen bir istatistik oluşturma işlemi yapıyor veya istatistik işini güncelliyor, ancak diğer nesneler hala takılıyor. Sistem sorguları (DMV sorguları gibi) takılı kaldığında bunu çok görüyorum, ancak kullanıcı veritabanı planları yok oluyor.

Bu tarih / saat belirli aralıklarla güncellenirse, 6:00, 8:00, 10:00 gibi her 2 saatte bir güncelleme yapıyormuş gibi görünüyorsa, birisi muhtemelen plan önbelleğinin çalışmasına neden olan bir işi veya sorguyu çalıştırıyordur. temizle. Tam frekansı öğrendikten sonra şunları yapabilirsiniz:

  • Bu aralıkta neyin çalıştığını görmek için iş programlarınıza bakın
  • Gizemi bulmak için bu zaman diliminde bir Profiler izlemesi veya Genişletilmiş Olaylar izlemesi gerçekleştirin (Genelde üretimde izlemenin hayranı değilim, ancak tam olarak katilin ne zaman vuracağını biliyorsanız, düşük ateşleme yapmak kolaydır. -Neyin çalıştığını kafasından alıyoruz.)
  • sp_WhoIsActiveBu süre zarfında bir masaya giriş yapın (en kolay yöntem, ancak en aza indirgemeye neden olacak şekilde daraltma olasılığı en düşük olan)

Sorguyu her çalıştırışınızda o tarih / saat değişmeye devam ederse , sunucunuz muhtemelen bellek baskısı altındadır. Temel sağlık kontrolü bilgisi oluşturmak için bunu çalıştırın ve ardından bunu teşhis sorunuza kopyalayıp yapıştırabilirsiniz.

sp_Blitz @OutputType = 'markdown', @CheckServerInfo = 1, @CheckUserDatabaseObjects = 1

(Açıklama: Ben onun yazarlarından biriyim sp_Blitz.)

Sp_Blitz verilerinizle 2017/08/25 güncellendi - sp_Blitz'i çalıştırdığınız ve sorunuza eklediğiniz için teşekkür ederiz ve gerçekten birkaç şeyi göstermeye yardımcı olur. 2 çekirdekli ve 16 GB RAM'e sahip bir VM'de SQL Server 2016 Enterprise Edition kullanıyorsunuz. İlk olarak, lisanslama hakkında kısa bir not: konuk tarafından lisans alıyorsanız, minimum satın alma gereksinimi 2 değil 4 çekirdektir (Daha fazla bilgi için bkz. SQL Server Lisans Kılavuzu .) Enterprise Edition'ın 4 çekirdeği yaklaşık 28.000 YTL ve yalnızca 16GB RAM'de harcanan lisans parasını görmek oldukça sıra dışı. SQL Server Enterprise Edition'ı ana bilgisayar düzeyinde lisanslıyorsanız, bunu görmezden gelebilir ve daha küçük VM'ler çalıştırabilirsiniz.

Görünüşe göre SQL Server harici bellek baskısı altında geliyor. 16GB RAM’iniz var ve maksimum sunucu belleğini 15GB olarak ayarladınız. Ne yazık ki, işletim sistemi için 1GB yeterli değil (ayrıca orada ne çalıştıracak olursanız olun, yedekleme yazılımı ve SSMS gibi.) SQL Server Kurulum Kılavuzunda, hangisi olursa olsun 4GB veya% 10 ücretsiz bırakmanızı öneririz. daha büyük - sizin durumunuzda, bu 4GB olacak, bu yüzden maksimum sunucu belleği ayarınız 15GB yerine 12GB olmalıdır.

Geçerli bellek ayırmalarınızda daha fazla kanıt gösteriliyor: sayfaları bellekte kilitlediniz (LPIM) açık, ancak yalnızca bellekte kilitli olan 12.02GB sayfanız var. Bu muhtemel (ancak garanti edilmeyen), başka bir uygulamanın belleğe ihtiyaç duyduğu anlamına gelir, bu nedenle Windows bir bellek basınç bildirimi gönderir ve SQL Server diğer uygulamanın işini yapması için diğer 3 GB bellekten vazgeçti. Bu en fazla 15GB maksimuma gidemeyeceğinizin kanıtı - başka şeyler için belleğe ihtiyacınız var.

SQL Server'ınız bu harici bellek baskısı altına girdiğinde ve diğer uygulamalar için belleği boşaltması gerektiğinde, plan önbelleğiniz zarar görür.

Yani birkaç seçeneğiniz var:

  • Maksimum belleği uygun şekilde ayarlayın - örneğin, 12GB (veya sunucudaki diğer uygulamaları çalıştıracaksanız daha da düşük.) Söyleyin. Bu şekilde, SQL Server bellekte bir ateş satışı yapmak zorunda kalmayacak ve diğerlerini de aktaracaktır. Uygulamanın 2-3GB RAM'e ihtiyacı var - zaten kullanılabilir olacak
  • Sunucuda diğer uygulamaları çalıştırmayı durdurun - bu, SSYS gibi uzaktaki bilgisayarlara uzaktan dokunma ve çalıştırma işlemi ise zor olabilir. Açılan RDP oturumlarının sayısı için Perfmon sayacı alarmları kurdum ve suçluyu çalışırken yakalamak için 0'dan farklı bir şey olduğunda uyardım.
  • Sanal Makineye daha fazla hafıza ekleyin - ama gerçekten ihtiyacınız olduğunu sanmıyorum. Bazı kanıtlar sp_Blitz raporunda "önemli bir bekleme tespit edilmediğini" gösteriyor. Sık sık bellek baskısı altında olduğunuzu sanmıyorum, özellikle de bunun sadece şimdi ve sonra olduğunu bildirdiğiniz için. Bu en düşük maliyetli seçenektir.

5

Tamam, OP burada, sonunda SQL Server 2016'yı en son sürüme güncelleyerek bu sorunu düzelttim. Yaptım SP1ve dün kurdum Cumulative Update 6.

Ayrıca Brent'in cevabının önerdiği gibi "en fazla bellek" ayarını yaptım. Bu arada harika bir cevap, herkesi onu affetmeye çağırıyorum.

36 saat oldu ve sayılıyor, planlar sıfırlanmıyor.

Brent Ozar'ın burada çok hoş bir web sitesi var: https://sqlserverupdates.com/ hangi güncellemelere ihtiyacınız olduğunu belirlemeye yardımcı olmak için.

Yardımcı olan bir diğer şey "güvenilmeyen yabancı anahtarlar" sorununu tespit etmek ve çözmekti. Brent'in çok güzel bir makalesi var (hahah, evet, yine Brent, ben haklıyım) nasıl çözüleceği, sadece google, o # 1 sonuç


1

Bu sorunu ev test kutumda yaşadım ve SQL Server hizmet hesabına 'Bellekte Sayfaları Kilitle' iznini ekleyerek sorunun çözüldüğünü öğrendim, ancak bunun en iyi tavsiye olduğundan emin değilim.

Bellek Seçeneğinde Sayfaları Kilitleme bölümüne bakın (Windows)


Bellekteki sayfaları kilitle, yalnızca plan önbelleği silinirse (arabellek havuzu değil) düzeltmez.
Brent Ozar
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.