2008 년보다 느린 SQL Server 2012


15

이전 서버 (Windows 2008 / SQL Server 2008 / 16GB RAM / 2 x 2.5GHz 쿼드 코어 / SAS 디스크)에서 더 큰 새 서버 (Windows 2008 R2 / SQL Server 2012 SP1 / 64GB RAM / 2 x 2.1GHz 16 코어 프로세서 / SSD 디스크).

이전 서버에서 데이터베이스 파일을 분리하고 새 서버에서 복사하여 첨부했습니다. 모든 것이 잘 진행되었습니다.

그 후 호환성 수준을 110으로 변경하고 통계를 업데이트하고 인덱스를 다시 작성했습니다.

실망스럽게도 대부분의 SQL 쿼리는 이전 SQL 2008 서버보다 새 SQL 2012 서버에서 훨씬 느립니다 (2-3-4 배 느림).

예를 들어, 약 700k 레코드가있는 테이블에서 이전 서버의 인덱스 쿼리는 약 100ms가 걸렸습니다. 새 서버에서 동일한 쿼리는 약 350ms가 걸립니다.

모든 쿼리에서도 마찬가지입니다.

도움이 필요합니다. 확인 / 확인해야 할 사항을 알려주세요. 새로운 SQL Server가있는 더 나은 서버에서는 성능이 떨어 졌다고 믿기가 매우 어렵습니다.

자세한 내용은:

메모리가 최대로 설정되어 있습니다.

이 테이블과 인덱스가 있습니다.

CREATE TABLE [dbo].[Answer_Details_23](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,
    [SurveyID] [int] NOT NULL,
    [CustomerID] [int] NOT NULL default 0,
    [SummaryID] [int] NOT NULL,
    [QuestionID] [int] NOT NULL,
    [RowID] [int] NOT NULL default 0,
    [OptionID] [int] NOT NULL default 0,
    [EnteredText] [ntext] NULL,
 CONSTRAINT [Answer_Details_23_PK] PRIMARY KEY NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDX_Answer_Details_23_SummaryID_QuestionID] ON [dbo].[Answer_Details_23]
(
    [SummaryID] ASC,
    [QuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

이 쿼리를 실행했습니다.

set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;

OLD SERVER-SQL Server 실행 시간 : CPU 시간 = 419ms, 경과 시간 = 695ms

새 서버-SQL Server 실행 시간 : CPU 시간 = 1340ms, 경과 시간 = 1636ms

여기에 업로드 계획 : http://we.tl/ARbPuvf9t8

나중에 업데이트 :

  • AMD 2.1GHz Opteron 16 코어 프로세서는 Intel 2.5GHz 쿼드 코어 프로세서보다 훨씬 나빠 보입니다.
  • 윈도우 파워 옵션을 밸런싱에서 고전력으로 변경
  • 최대 병렬 처리 수준을 8로 변경하고 비용 임계 값을 4로 변경하여 추가 개선

이제 SQL Server 실행 시간 : CPU 시간 = 550ms, 경과 시간 = 828ms

여전히 이전 서버보다 나쁘지만 그렇게 나쁘지는 않습니다. 로컬 쿼리 최적화 이외의 다른 제안 사항이 있으면 언제든지 의견을 말하십시오.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Paul White 9

답변:


8

SQL Server와 비슷한 문제가 발생하여 서버가 최적으로 구성되지 않았을 수 있습니다. 최신 Xeon에는 서버 성능에 큰 영향을 줄 수있는 TurboBoost, HT 등이 제공됩니다.

예를 들어, 우리는 성공했습니다. Dell 서버의 지연 시간이 짧은 구성

설정은 Dell 이외의 서버에 적용되며 이름이 다를 수 있습니다.

또한 Windows 전원 관리 프로필을 Balanced에서 고성능으로 설정하여 성능을 향상 시켰습니다. 마지막으로 x64 서버의 OS에 최대 8GB의 메모리를 예약하는 것이 좋습니다. 기본 SQL 설치에는 모든 메모리가 사용됩니다. 최대 SQL Server 메모리 구성을 총 메모리보다 4 / 8GB 작게 설정하여 4 / 8GB 예약을 시도 할 수 있습니다.

가능하면 오래된 서버로 되 돌리는 것이 좋습니다. 사용 가능한 회귀 / 자동화 /로드 스크립트가없는 경우 활동이 많은 시간 동안 1-4 시간 동안 시스템 활동을 기록하는 것이 가장 좋습니다. 그런 다음 프로덕션과 동일한 웹 서버와 스크립트를 실행하도록 클라이언트 시스템을 설정하십시오. 새 서버에 대해 동일한 활동을 실행하고 구성을 변경 한 후 동일한 활동을 다시 실행하십시오. 실제로 당신은 훨씬 더 많은 것을 원하지만, 그것이 가능하고이 질문의 범위를 벗어난 것으로 보이지는 않습니다.


서버의로드가 그렇게 높지 않습니다. SQL Server는 일반적으로 20-35GB의 메모리에 있습니다. 언제든지 16GB 이상의 여유 메모리가있었습니다. 또한 프로세서는 일반적으로 10-15 % 사용량을 통과하지 않습니다.
prog_sr08

2
Windows 전원 관리를 균형에서 높은 전력으로 설정하여 지금까지 가장 큰 개선을 이루었습니다. 실제로 프로세서 문제처럼 보입니다. SQL Server 실행 시간 : CPU 시간 = 892ms, 경과 시간 = 874ms
prog_sr08

8

확인 / 확인해야 할 사항을 알려주세요

성능 문제가 있습니다. 병목 현상을 식별하려면 대기 및 대기열 과 같은 성능 문제 해결 방법을 따르십시오 . 연결된 방법론은 측정 대상과 방법을 보여줍니다. 여기에 결과를 게시하면 실제 측정을 기반으로 특정 조언을 도울 수 있습니다. 그것이 너무 열려 있고 누구의 추측입니다. 특정 문제로 좁 히면 추측이 필요하지 않습니다.

업데이트 후

계획은 상당히 다릅니다. 이전 계획은 스택에서 스트림 집계가 낮았으며 실제로 카디널리티 추정이 잘못되어 (141k 대 108k) 해시 수학은 다른 방식으로 잘못 예측합니다 (35k 대 108k). 새 계획에는 스트림 집계가 없으며 맨 위에 정확한 추정치가 있습니다. 물론 이것은 이전 계획이 더 빨리 실행 된 이유를 설명하지는 않습니다 .

맨 아래 스캔에는 행 번호가 약간 다르지만 (유의하지는 않음) 비용이 다릅니다. 이전은 2.49884 (IO 2.28979 CPU 0.20905) 대 새 1.59109 (IO 1.53868 CPU 0.0524084)입니다. 다시 한 번 더 나은 2012 실행을 가리킬 것입니다 (인덱스 재 구축으로 인해 조각화가 감소했을까요?).

매우 다른 점은 스레드 수입니다. 새로운 32 개 (각각 ~ 23k 행)에 32 개와 오래된 스레드 (각각 ~ 95k 행)에 8 개가 있습니다. 테이블이 상당히 좁습니다. 그것은 스레드의 많은 실제로 때문에 훨씬 더 자주의 성능을 아프게하고있을 수 캐시 무효화 . 나는 시도 할 것이다 :

  1. 새 서버 구성에서 HyperThreading 제거 (있는 경우) 및 / 또는
  2. DOP 8로 쿼리를 시도하십시오.

당신의 의견을 주목 :

maxdop 8 Query로 실행 계획을 추가하면 실제로이 방법이 더 빠릅니다.

아마도 CPU가 서로 발가락을 밟고있을 것입니다. SSD를 설치하면 IO가 아무 것도 옆에 있지 않을 수 있으며 테이블이 너무 작아서 32 대의 스캐너를 보증 할 수 없습니다. 이 교환 스왑은 L1 / L2를 지속적으로 무효화 할 수 있습니다.


1
2012 년에는 2008 년보다 모든 것이 훨씬 느립니다. 여기서 쿼리를 최적화하려고하지 않습니다. 이 새 서버에서 동일한 데이터베이스를 사용하여 최소한 동일한 성능을 유지하게되어 기쁩니다.
prog_sr08

1
대기 및 대기열은 쿼리 최적화에 관한 것이 아닙니다. 병목 현상을 식별하는 것입니다.
Remus Rusanu

문서를 다운로드했습니다. 매우 흥미로운 것 같습니다. 나는 지금 그것에 있지만, 시간이 좀 걸릴 것 같습니다. 먼저 볼 곳을 제안 할 수 있습니까?
prog_sr08

1
통계를 기다립니다 . 2008 년과 2012 년 모두에 그들을 다시 모두 5-10 분 동안 부하를 실행, 2008 년과 2012 년 사이에 다음 비교 차이
레무스 Rusanu

새 서버가 라이브 사이트 / 데이터베이스를 호스팅하기 때문에 두 서버 간의 통계를 비교할 수 없습니다. 이전 서버에는 더 이상로드되지 않은 데이터베이스가 남아있었습니다.
prog_sr08

3

대부분의 최신 멀티 코어 시스템, 특히 멀티 CPU 시스템의 경우 하드웨어 아키텍처는 메모리의 특정 부분이 특정 코어 / 프로세서에서 멀리 떨어져 있고 메모리의 특정 부분이 특정 코어 / 프로세서에 가깝도록되어 있습니다. 이것을 NUMA (Non-Uniform Memory Architecture)라고합니다. MAXDOP 설정이 NUMA 노드 당 코어 수와 일치하여 주어진 numa 노드가 데이터를 위해 자체 메모리 외부로 나가는 횟수를 최소화하려고합니다.

다음을 사용하여 새 머신의 구성을 확인하고 MAXDOP가 하드웨어별로 최상의 설정으로 설정되어 있는지 확인할 수 있습니다 .

DECLARE @CPUs int;
DECLARE @NumaNodes int;
DECLARE @ServerRAMInMB int;

SET @ServerRAMinMB = (SELECT (i.physical_memory_kb / 1024) AS ServerMemory 
    FROM sys.dm_os_sys_info i);
SET @CPUs = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (SELECT MAX(c.memory_node_id) + 1 FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64);

SELECT @ServerRamInMB, @CPUs, @NumaNodes;

IF @CPUs > 4 /* this would be 4 cores, not 4 CPUs */
BEGIN
    DECLARE @MaxDOP int;
    SET @MaxDOP = @CPUs * 0.75;
    IF @MaxDOP > (@CPUs / @NumaNodes) SET @MaxDOP = (@CPUs / @NumaNodes);
    EXEC sp_configure 'max degree of parallelism', @MaxDOP;
    EXEC sp_configure 'cost threshold for parallelism', 4; 
END

나는 포함 된 @ServerRamInMB내가 설정받는 사람을 사용하기 때문에 여기에 매개 변수를 Max Server Memory하고 Min Server Memory, 지정된 서버에 적합한 값으로 구성 옵션을 제공합니다.


1
64GB RAM, 32 프로세서 코어, 4 numa 노드가 있습니다. 최대 병렬 처리 수준을 8로 설정하고 비용 임계 값을 4로 설정했습니다.이 설정과 전원 옵션을 고성능으로 설정하면 SQL Server 실행 시간 : CPU 시간 = 550ms, 경과 시간 = 828ms입니다.
prog_sr08

그렇다면 그것은 승리입니까? 그것이 당신을 위해 일하게되어 기쁘다!
맥스 버논

0

현재 사용중인 에디션 및 라이센스 모드는 무엇입니까? 모든 코어를 사용하고 있지 않을 수 있습니다. 이 페이지의 참고 사항을 참조하십시오 -http : //msdn.microsoft.com/en-us/library/ms143760.aspx

"서버 + CAL (클라이언트 액세스 라이센스) 기반 라이센스가있는 Enterprise Edition은 SQL Server 인스턴스 당 최대 20 개의 코어로 제한됩니다."


2
이는 CAL이 있고 할아버지가 된 경우에만 적용됩니다. 여전히 코어가 20 개인 경우에도 이전 시스템 (8 개만있는 시스템)에 비해 성능이 눈에 띄게 떨어지지 않아야합니다.
Aaron Bertrand

Web Edition이 있습니다 (소켓 4 개 또는 코어 16 개로 제한됨). 이전 서버에는 어쨌든 8 개의 코어 만있었습니다.
prog_sr08

0

이 페이지에서 설명한 것과 같은 문제가있었습니다. 전원 설정을 "균형"에서 "고성능"으로 전환하면 응답 시간이 두 배 이상으로 크게 달라졌습니다. 우리가 SSD를 사용하고 있기 때문에 에너지 소비가 그랬던 문제라고 생각하지 않습니다.


-2

또한이 문제를 하나의 문제를 다른 문제와 혼동시키기보다는 강력한 해결책없이 2 주 이상 진행했습니다.

마지막으로 다음과 같이 해상도 :

  1. 호환성을 010에서 011로 재설정했습니다.

  2. 마스터 데이터베이스의 호환성도 재설정하십시오. 기본적으로 sql은 이전 호환성 설정을 유지합니다. 우리는 수동으로 변경해야합니다.

모두 제일 좋다

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