복붙노트

[SQL] 왜 그렇게 느린 SQL 애저에 대한 쿼리를 실행?

SQL

왜 그렇게 느린 SQL 애저에 대한 쿼리를 실행?

나는 푸른에 재판 계정을 만들어, 나는 SmarterAsp에서 내 데이터베이스를 배포했습니다.

내가 SmarterAsp \하여 MyDatabase에 피벗 쿼리를 실행하면 결과 2 초에서 나타났다.

그러나 푸른 \에서 MyDatabase에서 동일한 쿼리를 실행 94초했다.

나는 SQL 서버 2014 관리 Studio (재판) 서버와 실행 쿼리에 연결하는 데 사용.

내 계정이 평가판 계정이기 때문에 속도의 차이인가?

내 질문에 일부 관련 정보

쿼리는 다음과 같습니다

ALTER procedure [dbo].[Pivot_Per_Day]
@iyear int,
@imonth int,
@iddepartment int

as

declare @columnName Nvarchar(max) = ''
declare @sql Nvarchar(max) =''

select @columnName += quotename(iDay) + ','
from (
        Select day(idate) as iDay
        from kpivalues where year(idate)=@iyear and month(idate)=@imonth
        group by idate
        )x

set @columnName=left(@columnName,len(@columnName)-1)

set @sql ='


Select * from (
select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay   

from kpi

inner join kpivalues on kpivalues.idkpi=kpi.idkpi

inner join kpitarget on kpitarget.idkpi=kpi.idkpi

inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi

where iddepartment='+convert(nvarchar(max),@iddepartment)+'

group by kpiname,target, ivalues,idate)x

pivot
(
     avg(ivalues)
    for iDay in (' + @columnName + ')
) p'

execute sp_executesql @sql

내 피벗 테이블까지 경과 시간의 측면에서 다른 결과가 화면에 표시 3 개 서로 다른 서버에서이 쿼리 나에게 준 실행 :

푸른 - 경과 시간 = 100.165 초

Smarterasp.net - 경과 시간 = 2.449 초

LocalServer - 경과 시간 = 1.716 초

푸른 내 평가판 계정과 관련하여, 위처럼 저장 프로 시저를 실행할 때 내가 똑똑보다 더 나은 속도를해야합니다 있는지 확인하기 위해 주요 목표로했다. 기본 성능 수준 - 기본 (5DTUs) 및 최대 - 내 데이터베이스 서비스 계층에 대한 선택합니다. 크기 2기가바이트

내 데이터베이스는 1 개 테이블 145284 개 행이 16 표를 가지고 있으며, 데이터베이스 크기는 11메가바이트입니다. 내 응용 프로그램에 대한 그것의 테스트 데이터베이스.

내 질문이 있습니다 :

사용자의 입력에 따라 결론 :

지금은 나를 위해 맑은 푸른의 계층이 얼마나 중요한이 아주 좋은 질문을하는 것입니다 무엇을 (난 색인 및 자신의 장점 / 단점이 무엇인지 이해)

다들 감사 해요, 루시

해결법

  1. ==============================

    1.이 맨 먼저 성능의 문제이다. 당신은 당신의 부분에 실적이 저조 코드를 다루고있는 당신은 병목 현상을 식별하고 해결해야합니다. 지금은 나쁜 이초 성능에 대해 이야기하고있다. SQL Server 성능을 분석하는 방법의 지침을 따르십시오. 이 쿼리는 웹 응용 프로그램 (5ms 미만)에 대한 로컬 허용 실행 일단 당신은 푸른 SQL DB에 포팅의 질문을 할 수 있습니다. 지금 평가판 계정은 기존의 비 효율성을 강조한다.

    이 맨 먼저 성능의 문제이다. 당신은 당신의 부분에 실적이 저조 코드를 다루고있는 당신은 병목 현상을 식별하고 해결해야합니다. 지금은 나쁜 이초 성능에 대해 이야기하고있다. SQL Server 성능을 분석하는 방법의 지침을 따르십시오. 이 쿼리는 웹 응용 프로그램 (5ms 미만)에 대한 로컬 허용 실행 일단 당신은 푸른 SQL DB에 포팅의 질문을 할 수 있습니다. 지금 평가판 계정은 기존의 비 효율성을 강조한다.

    ...
    @iddepartment int
    ...
    iddepartment='+convert(nvarchar(max),@iddepartment)+'
    ...
    

    그래서 그것은 무엇인가? iddepartment 열은 INT 또는 NVARCHAR입니까? 그리고 왜 사용 (최대)?

    여기에 당신이해야 할 일이다 :

    여기에 내부 SQL을 매개 변수화하는 방법입니다 :

    set @sql =N'
    Select * from (
    select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay   
    from kpi
    inner join kpivalues on kpivalues.idkpi=kpi.idkpi
    inner join kpitarget on kpitarget.idkpi=kpi.idkpi
    inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi
    where iddepartment=@iddepartment
    group by kpiname,target, ivalues,idate)x
    pivot
    (
         avg(ivalues)
        for iDay in (' +@columnName + N')
    ) p'
    
    execute sp_executesql @sql, N'@iddepartment INT', @iddepartment;
    

    피복재 인덱스는, 지금까지 가장 중요한 수정합니다. 그것은 분명히 여기 존재하는 것보다 더 많은 정보를 필요로한다. 모든 하위 장을 포함하여 설계 인덱스를 참조하십시오.

    보다 일반적인 주석으로 : 나는 데이터 크기가 기본적으로 작다라고 생각하지만, 쿼리의 종류, 더 rowstore보다 columnstores을 어울리다. 푸른 SQL DB 업데이트 할 클러스터 columnstore 인덱스를 지원합니다, 당신은 심각한 데이터 크기의 기대에 실험 할 수 있습니다. 그들은 진정한 로컬 상자에 기업 / 개발을 필요로 않습니다.

  2. ==============================

    2.(업데이트 :. 원래의 질문도 쿼리 최적화하는 방법을 물어 변경되었습니다 -뿐만 아니라 좋은 질문입니다 원래 질문은 왜이 대답에 대해 무엇이다 차이).

    (업데이트 :. 원래의 질문도 쿼리 최적화하는 방법을 물어 변경되었습니다 -뿐만 아니라 좋은 질문입니다 원래 질문은 왜이 대답에 대해 무엇이다 차이).

    개별 쿼리의 성능은 크게 성능 계층에 의해 영향을 받는다. 나는 엄격하게 사실이 아니다, 문서는 계층 부하에 대한 있습니다 의미 알고있다.

    나는 시작 지점과 같은 S2 데이터베이스를 사용하여 테스트를 다시 실행하고 거기에서 갈 것입니다.

    재판이 구독에있는 것은 그 자체가 성능에 영향을하지 않습니다,하지만 무료 계정에 당신은 아마 아무것도 실시간으로 정말 쓸모없는 B 레벨을 사용하는 - 확실히 로컬로 실행 2 초 걸리는 쿼리를.

    도 말하자면 간 이동, S1과 S2는 각각의 쿼리의 성능에 현저한 차이를 보여주는 것이다. 당신이 실험을하려는 경우, 당신은 S 레벨 아마 괜찮하지만 P 수준을 테스트 할 때주의해야 "하루의 어떤 부분"을 위해 하루 청구됩니다 기억 않습니다.

    배경; 푸른 작년에 새로운 계층을 도입 할 때, 그들은 SQL의 호스팅 모델을 변경. 그것은 많은 데이터베이스가 공유 sqlserver.exe에서 실행되는 것을 사용. 새로운 모델에서, 각 데이터베이스를 효과적으로 자원의 실행이 샌드 박스를 제한하는 것이 자신의 sqlserver.exe을 가져옵니다. 즉 그들은 "DTU 사용을"제어뿐만 아니라 일반적인 성능에 영향을 미치는 방법이다.

  3. ==============================

    3.계정이 재판 사실과는 그것의 아무것도, 당신이 선택한 낮은 성능 수준으로 인해 없습니다.

    계정이 재판 사실과는 그것의 아무것도, 당신이 선택한 낮은 성능 수준으로 인해 없습니다.

    기타 서비스 (SmarterAsp) 실행 로컬 인스턴스에서 당신은 아마 성능 오히려 제한 크기 제한이 없습니다.

    이 시점에서 함께 실제로 어떤 DTU 수단을 넣어 불가능 / 종류 DTU 번호의 로컬 컴퓨터 또는 다른 호스팅 제공 업체에 설치된 SQL 서버와 관련된 것.

    그러나 좋은 분석 (https://cbailiss.wordpress.com/2014/09/16/performance-in-new-azure-sql-database-performance-tiers/)이 아무것도하지만, 관계자에 대한 수행이 있습니다.

  4. from https://stackoverflow.com/questions/31086778/why-is-running-a-query-on-sql-azure-so-much-slower by cc-by-sa and MIT license