SQL Server는 계획 캐시 및 실행 통계를 주기적으로 지 웁니다.


24

SQL Server 2014를 2016으로 업그레이드 한 후 서버 는 2 시간마다 캐시 된 실행 계획 및 dm*보기 (예 dm_exec_query_stats: 등)를 계속 재설정합니다 .

사람이 실행되는 것처럼 DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS수동 (아무도하지 않습니다, 그것은 자동으로 발생 제외).

SQL Server 2014 및 Windows Server 2012에서도 동일한 데이터베이스가 제대로 작동했으며 SQL Server 2016 (및 Windows Server 2016)으로 이동 한 후 남쪽으로 이동했습니다.

내가 확인한 사항 : 데이터베이스에 "자동 닫기"플래그 가 없습니다 . SQL 서버가 ad hoc optimized설정되어 있습니다 true(도움이 될 것이라고 생각했지만 그렇지 않았습니다). "쿼리 저장소"가 "off"입니다. 서버의 메모리는 16GB입니다.

"SQL Server 로그"에도 도움이되지 않습니다. 매주 백업 메시지 ...

또한이 기사 https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options ( "예제"섹션으로 스크롤 하십시오. 계획이 자동으로 해제되는 상황 목록이 있습니다. 해당 사항이 없습니다.

최신 정보:

불행히도, 어떤 제안도 도움이되지 못했습니다. LPIM 권한을 부여하고 동일한 쿼리에 대해 수많은 계획을 생성하는 매개 변수가없는 쿼리를 감지하고 수정하여 "최대 서버 메모리"를 낮 춥니 다 ... 계획은 몇 시간에서 5-10 분마다 무작위로 재설정됩니다. 서버가 "메모리 부족"상태 인 경우 2014 버전이 동일한 컴퓨터에서 제대로 작동하는 방식

요청 된 sp_Blitz 출력은 다음과 같습니다.

**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...

답변:


27

먼저, 계획 캐시가 지워지는 정확한 시간을 확보하십시오. 가장 쉬운 방법은 다음과 같습니다. 거의 즉시 실행되며 다른 사람을 차단하지 않습니다.

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

해당 날짜 / 시간이 예상보다 오래 되면 계획 캐시의 일부만 지워집니다. 예를 들어, 누군가 인덱스 재 빌드 또는 통계 업데이트 작업을 수행 중일 수 있습니다.이 작업은 영향을받는 특정 개체에 대한 계획 캐시를 플러시하지만 다른 개체는 여전히 멈 춥니 다. DMV 쿼리와 같은 시스템 쿼리가 계속 작동하지만 사용자 데이터베이스 계획이 명확하지 않은 경우에는 이것이 많이 보입니다.

해당 날짜 / 시간이 특정 간격으로 업데이트되는 경우 (예 : 6:00, 8:00, 10:00 등으로 정확히 2 시간마다 업데이트되는 것처럼 보이는 경우) 누군가 계획 작업을 수행하는 작업 또는 쿼리를 실행 중일 수 있습니다. 비우다. 정확한 빈도를 알고 나면 다음을 수행 할 수 있습니다.

  • 작업 일정을보고 해당 간격으로 실행되는 작업을 확인하십시오.
  • 해당 기간 동안 프로파일 러 추적 또는 확장 이벤트 추적을 실행하여 수수께끼를 파악하십시오 (일반적으로 프로덕션에서 추적 팬은 아니지만 킬러가 언제 공격을 당할 것인지 정확히 아는 경우 낮은 수준으로 쉽게 발사 할 수 있습니다. 실행중인 오버 헤드 샘플)
  • sp_WhoIsActive해당 시간 동안 테이블에 로그하십시오 (가장 쉬운 방법이지만 테이블 을 발생시키는 정확한 쿼리로 좁힐 가능성이 가장 적음)

쿼리를 실행할 때마다 해당 날짜 / 시간이 계속 변경 되면 서버의 메모리 부족 상태 일 수 있습니다. 이것을 실행하여 기본 상태 확인 정보를 생성 한 다음이를 스택 질문에 복사 / 붙여 넣기하여 진단 할 수 있습니다.

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

(공개 : 나는의 저자 중 하나입니다 sp_Blitz.)

sp_Blitz 데이터로 2017/08/25 업데이트-sp_Blitz 를 실행하고 질문에 추가해 주셔서 감사합니다. 실제로 몇 가지 사항을 보여줍니다. 코어가 2 개이고 RAM이 16GB 인 VM에서 SQL Server 2016 Enterprise Edition을 실행하고 있습니다. 먼저 라이센싱에 대한 간단한 참고 사항 : 게스트가 라이센싱하는 경우 최소 구매 요구 사항은 2가 아니라 4 개 코어입니다. 자세한 내용은 SQL Server 라이선싱 안내서 를 참조하십시오. Enterprise Edition의 4 개 코어는 약 $ 28K USD입니다. 16GB RAM에 라이센스 비용이 많이 든다는 것은 매우 드문 일입니다. 호스트 수준에서 SQL Server Enterprise Edition에 라이센스를 부여하는 경우이를 무시하고 더 작은 VM을 실행할 수 있습니다.

SQL Server가 외부 메모리 부족을 겪고있는 것 같습니다. RAM이 16GB이고 최대 서버 메모리를 15GB로 설정했습니다. 불행하게도 운영 체제에는 1GB로 충분하지 않으며 백업 소프트웨어 및 SSMS와 같은 다른 운영 체제에서도 실행할 수 없습니다. SQL Server 설치 가이드에서 4GB 또는 10 %의 여유 공간을 남겨 두는 것이 좋습니다. 더 큰 경우-귀하의 경우 4GB이므로 최대 서버 메모리 설정은 15GB가 아닌 12GB이어야합니다.

더 많은 증거가 현재 메모리 할당에 표시됩니다. LPIM (Lock in page in memory)이 켜져 있지만 메모리에 12.02GB의 페이지 만 있습니다. 그것은 (그러나 보장되지는 않음) 다른 응용 프로그램에 메모리가 필요하다는 것을 의미하므로 Windows는 메모리 부족 알림을 보냈으며 SQL Server는 다른 3GB의 메모리를 포기하여 다른 응용 프로그램이 작동하도록했습니다. 그것은 최대 15GB로 갈 수 없다는 증거입니다. 다른 것들을 위해 메모리가 필요합니다.

SQL Server가 이러한 외부 메모리 압력을 받고 다른 앱을 위해 메모리를 비워야 할 경우 계획 캐시가 손상됩니다.

따라서 몇 가지 옵션이 있습니다.

  • 최대 메모리를 적절하게 설정하십시오 -예를 들어 12GB (또는 서버에서 다른 응용 프로그램을 실행하려는 경우 더 적습니다). 이렇게하면 SQL Server는 메모리에서 불을 팔거나 다른 것으로 인해 물건을 씻을 필요가 없습니다. 앱에 2-3GB의 RAM이 필요합니다-이미 사용 가능합니다
  • 서버에서 다른 앱 실행 중지 -다른 sysadmins가 원격 데스크톱을 사용하고 SSMS와 같은 것을 실행하는 경우 힘들 수 있습니다. 나는 열린 RDP 세션 수에 대해 Perfmon 카운터 알람을 설정하고 0 이외의 다른 경우 경고합니다.
  • VM에 메모리를 추가하십시오. 그러나 실제로는 필요하다고 생각하지 않습니다. sp_Blitz 보고서에 "대규모 대기가 감지되지 않음"이라는 증거가 있습니다. 나는 당신이 자주 메모리 압력을 받고 있다고 생각하지 않습니다. 가장 비용 효율적인 옵션입니다.

5

OK, OP here, 마침내 SQL Server 2016을 최신 버전으로 업데이트 하여이 문제를 해결했습니다. 나는 SP1어제 설치했다 Cumulative Update 6.

또한 브렌트의 답변과 같이 "최대 메모리"를 적절하게 설정했습니다. 그건 그렇고, 나는 모든 사람들이 그것을 찬성하도록 촉구합니다.

36 시간이 지났고 세고, 계획은 재설정되지 않았습니다.

브렌트 오자르 (Brent Ozar)는 또한 https://sqlserverupdates.com/ 에 필요한 업데이트를 결정하는 데 도움 이되는 매우 훌륭한 웹 사이트를 보유하고 있습니다.

또 다른 도움이 된 것은 "신뢰할 수없는 외래 키"문제를 감지하고 해결하는 것이 었습니다. 브렌트 (Brent)는 그것을 해결하는 방법에 대한 아주 좋은 기사 (하하, 예, 브렌트 다시 알았습니다)를 Google에 있습니다. 그는 최고의 결과입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.