-1

MS SQL Server 2014를 2016 년에 실행되는 다른 서버로 마이그레이션하기로 결정했습니다. 이제이 DB를 사용하는 PHP 응용 프로그램의 성능이 크게 떨어졌습니다 (쿼리가 1에서 뛰어 올랐습니다). 또는 2 초에서 20까지), 스키마, 구조 및 데이터면에서 DB가 동일합니다. 새로운 서버는 더 높은 CPU, 디스크 및 메모리 매개 변수를 가지며 작업 부하는 정상이므로이 성능 저하는 처음에는 의미가 없습니다. 그런 다음 Profiler를 사용하여 일부 쿼리를 분석 한 결과, Management Studio (빠른 1 ~ 3 초) 또는 응용 프로그램 프런트 엔드 (느린 15 ~ 25 초) 중 하나에서 실행될 때 쿼리 계획이 서로 다르다는 사실에 놀랐습니다. . 나는 linkthis도 찾았지만 많이 읽은 후 다른 문제를 시도한 후에는이 문제를 해결할 수 없습니다. 전에 누구도이 문제를 다루었습니까? 깊이 잠수하기 전에 확인해야 할 사항에 대한 힌트가 있습니까?MSSQL에 대한 빠른 쿼리이지만 PHP에서의 느린 쿼리

감사합니다.

============

EDIT 1

쿼리는 필터의 값에 따라, 단지 몇 개의 레코드를 반환하지만, 이상의 무언가 (10) 1000 (결코 더 왜냐하면 그것은 1000을 돌파했기 때문입니다.) 쿼리되는 주 테이블에는 1 백만 개의 레코드가 포함되며 DB의 전체 가중치는 4GB입니다. 인덱스가 성공적으로 마이그레이션 된 후 다시 작성되고 통계가 업데이트되었습니다. 내가 시도한 것들 중

편집 2

모든 DB 인덱스를 다시 모든 DB 테이블 통계를 갱신합니다. RECOMPILE도 여러 번 강제로 실행되었습니다 (Management Studio에서만). 인덱스 힌트를 사용하여 일부 인덱스를 강제로 사용했습니다 (Management Studio에서만 사용). 이들 중 어느 것도 문제를 해결하는 데 도움이되지 않았습니다. 쿼리 계획은 내 쿼리가 약 20 개의 테이블을 결합하고 여러 개의 하위 쿼리가 있기 때문에 분석하기가 매우 어렵습니다.

3 그냥 명확하게 편집은 다른 실행 계획을 생성하는 쿼리도 매개 변수와 동일합니다. 내 말은, 프로파일 러 추적이 활성화 된 상태에서 프런트 엔드에서 쿼리를 실행하면 쿼리가 캡처되고 (약 20 초 소요) 텍스트를 복사하여 관리 스튜디오에 붙여넣고 같은 쿼리를 실행하고 결과를 얻습니다. 2 초, 플러스 다른 실행 계획. 이런 종류의 문제가 여전히 매개 변수 스니핑과 관련 될 수 있습니까?

+0

어, 데이터가 어떻게 보입니까? (수 백, 수십억입니까?), 어떻게 쿼리를 수행 했습니까? ?당신이 데이터의 톤을 검색하고 PHP에서 처리한다면, 분명히 당신의 쿼리는 무엇입니까? –

+0

많은 행을 쿼리하는 경우 몇 초 내에 수십억 개의 행을 반환하는 ** In-Memory OLTP **를 시도해야합니다. https://channel9.msdn.com/Shows/Data-Exposed/SQL-Server-2016-In-memory-OLTP –

+0

시도한 다른 내용은 무엇입니까? – GuidoG

답변

0

데이터베이스의 ArithAbort 속성이 꺼져 있기 때문일 수 있습니다. 당신을위한 맡아 봤다고 매개 변수를 확인해야합니다, 빠르고 느린 것들하고 비교 : 또한 http://www.sommarskog.se/query-plan-mysteries.html

당신은 그것을 확인하고

declare @value sql_variant 
select @value = SESSIONPROPERTY('ARITHABORT') 
if @value <> 1 
begin 
    USE master 
    ALTER DATABASE [your_database] SET ARITHABORT ON WITH NO_WAIT 
    use your_database 
end 
+0

성능에 변화가 없도록 시도했습니다 : ( – Hauri

+0

OK. 한 번 나와 같은 문제가 있었지만 해결되었습니다. 죄송 합니다만 도움이되지 않습니다. 당신 – GuidoG

+0

사실 나는 ANSI_NULLS와 같은 다른 구성 매개 변수와 다른 similars 시도하고 동일한 CPU 시간을 : 어쨌든 고마워요 – Hauri

0

당신은 모두 실행 계획을 추출해야이 작은 스크립트를 수정할 수 있습니다 참조 이 계획들이 세운; 다른 매개 변수가있는 동일한 쿼리에 대한 다른 계획을 발견하면 옵션 (재 컴파일)을 사용하거나 Sommarskog의 기사에서 설명한대로 코드 재 작성을 고려할 수 있습니다. 이 경우 다른 계획의 원인은 쿼리가 최적화 된 다른 매개 변수이므로 atirhabort 또는 다른 세션 옵션을 변경하면 안됩니다. 다른 세션 옵션을 사용하면 새로운 계획이 빌드 되었기 때문에 서버가 다른 매개 변수를 감지하게됩니다.

+0

H 나는 너의 대답을 고맙다. Management Studio에서 강제로 재 컴파일하는 방법을 알고 있지만 PHP에서이 작업을 수행해야하는지 여부는 알 수 없습니다. 이게 당신이 의미 한거야? – Hauri

+0

PHP 코드에 옵션 (재 컴파일)을 추가 할 수없는 이유는 무엇입니까? – sepupic

+0

매개 변수 스니핑이 근본 원인이되지 않도록 할 수있는 항목을 명확하게하기 위해 제 질문을 편집했습니다. 당신은 어떻게 생각하세요, @ 세퍼티브? – Hauri