복붙노트

[SQL] 측정 쿼리 성능 : VS "실행 계획 쿼리 비용" "시간은 촬영"

SQL

측정 쿼리 성능 : VS "실행 계획 쿼리 비용" "시간은 촬영"

나는 두 개의 서로 다른 쿼리의 상대적인 성능을 결정하고 나에게이 사용할 수를 측정하는 두 가지 방법을 가지고 노력하고있어 : 1. 실행 시간이 각 쿼리 모두와 2. 실행 모두 실제 실행 계획에서 "쿼리 비용"을 얻을

여기에 내가 쿼리 시간을 잴 실행 코드입니다 ...

DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO

DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO

내가 도착하면 다음과 같다 :

Stored_Proc     Execution_Time     Query Cost (Relative To Batch)

test_1a         1.673 seconds      17%
test_1b         1.033 seconds      83%

실행 시간의 결과는 직접 쿼리 비용의 결과를 부정하지만, 사실 수단을 무엇을 "쿼리 비용"을 결정하는 데 문제가 있어요. 내 추측은의 집계는 점이다 읽기 / 기록 기능 / CPU_Time / 등, 나는 몇 가지 질문을 가지고 추측 있도록 :

또한이 매체는 복수의 프로세서와 100 개 이상의 동시 사용자와 MS 서버 2003 엔터프라이즈 에디션에 MS SQL 서버 2005를 실행, SQL 서버 크기의 것을주의하는 것이 중요 할 수있다.

편집하다:

일부 후에 내가 SQL 서버가에 프로파일 접속을 위해 관리 귀찮게, 및 추가 정보를 제공 할 수 있습니다 (시스템 자원에 관련되는 쿼리 비용을 지원하지 실행 시간 자체가 ...)

Stored_Proc    CPU      Reads    Writes   Duration   

test_1a        1313     3975     93       1386
test_1b        2297     49839    93       1207

인상적인 많은보다 더 많은 CPU를 복용 읽는 시간이 덜 소요됩니다 :)

해결법

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

    1.프로파일 러 추적 관점으로 넣습니다.

    프로파일 러 추적 관점으로 넣습니다.

    CPU> 기간 : 쿼리 B는 병렬 처리를 사용하고 예를 들어 쿼리는 2 개의 CPU, 평균 1.15 초 각각 사용

    쿼리 A는 아마되지 않습니다 : CPU <시간

    간단한, 비 병렬 쿼리 계획의 17 %이 배치에 비용을 기준으로 설명합니다.

    쿼리 B가 그렇게 할 별도의 노력이 필요하더라도, 더 비싼 및 병렬 혜택을 누릴 것이라는 최적화는 밖으로 작동합니다.

    비록 기억 그 쿼리 B는 2 개의 CPU를 사용하여 100 % (따라서 4 개의 CPU 50 %) 1 초 정도로 대. 쿼리 A는 1.5 초 동안 단일 CPU의 100 %를 사용합니다.

    쿼리 A의 피크가 증가 기간의 비용으로 낮다. 하나의 사용자로, 무슨 상관? (100)으로, 아마도 그것은 차이를 만드는 ...

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

    2.

    SET STATISTICS TIME ON
    
    SELECT * 
    
    FROM Production.ProductCostHistory
    WHERE StandardCost < 500.00;
    
    SET STATISTICS TIME OFF;
    

    그리고 그것은과 같이 표시됩니다 메시지 탭을 참조하십시오

    SQL Server Execution Times:
    
       CPU time = 0 ms,  elapsed time = 10 ms.
    
    (778 row(s) affected)
    
    SQL Server parse and compile time: 
    
       CPU time = 0 ms, elapsed time = 0 ms.
    
  3. ==============================

    3.쿼리 비용은 최적화 프로그램이 쿼리 (총 배치 시간을 기준)에 걸리는 시간을 생각 것입니다.

    쿼리 비용은 최적화 프로그램이 쿼리 (총 배치 시간을 기준)에 걸리는 시간을 생각 것입니다.

    최적화의 시도는, 쿼리 및 데이터의 통계를보고 몇 가지 실행 계획을 시도하고 최소한의 비용을 선택하여 최적의 쿼리 계획을 선택합니다.

    여기에서 당신은이 작업을 수행하려고 않는 방법에 대해 더 자세히 읽을 수 있습니다.

    당신이 볼 수 있듯이,이 크게 당신이 실제로 무엇을 얻을의 다를 수 있습니다.

    유일한 쿼리 성능 메트릭 IS는 물론, 쿼리가 실제로 얼마나 걸리나요.

  4. ==============================

    4.사용 SET STATISTICS TIME ON

    사용 SET STATISTICS TIME ON

    쿼리 위.

    근처 결과 탭 아래에는 메시지 탭을 볼 수 있습니다. 거기 당신은 시간을 볼 수 있습니다.

  5. ==============================

    5.쿼리 실행 시간 :

    쿼리 실행 시간 :

    DECLARE @EndTime datetime
    DECLARE @StartTime datetime 
    SELECT @StartTime=GETDATE() 
    
    
    ` -- Write Your Query`
    
    SELECT @EndTime=GETDATE()
    --This will return execution time of your query
    SELECT DATEDIFF(MILLISECOND,@StartTime,@EndTime) AS [Duration in millisecs] 
    

    쿼리 아웃을 넣어 체감됩니다

    최적화 쿼리 비용 :

    당신의 SQL Management Studio를 클릭합니다

    쿼리를 실행하고 쿼리 결과의 메시지 탭 옆에 실행 계획을 클릭합니다. 당신은 같이 볼 수 있습니다

  6. ==============================

    6.나는 오래된 질문을 이해 - 그러나 나는 비용이 동일하지만 하나 개의 쿼리가 다른 것보다 더 나은입니다 예를 추가하고 싶습니다.

    나는 오래된 질문을 이해 - 그러나 나는 비용이 동일하지만 하나 개의 쿼리가 다른 것보다 더 나은입니다 예를 추가하고 싶습니다.

    당신이 질문에서 관찰 된 바와 같이, 실행 계획에 표시된 %는 가장 쿼리를 결정하는 유일한 척도가 아닙니다. 다음 예제에서는 동일한 작업을하는 두 개의 쿼리가 있습니다. 실행 계획을 보여줍니다 모두 (각각 50 %) 동등하게 좋다. 지금은 분명한 차이점을 보여줍니다 SET STATISTICS IO ON으로 쿼리를 실행.

    쿼리 2가 사용하는 테이블 LWManifestOrderLineItems에 스캔 반면 다음 예에서 쿼리 한 용도 추구합니다. 우리가 실제로 더 나은 그 쿼리 두 작품을 찾을 수있다 그러나 실행 시간을 확인합니다.

    A는이 추구하지 탐색 할 때 또한 읽을? 폴 화이트로

    질문

    ---Preparation---------------
    -----------------------------
    DBCC FREEPROCCACHE
    GO
    DBCC DROPCLEANBUFFERS
    GO
    
    SET STATISTICS IO ON  --IO
    SET STATISTICS TIME ON
    
    --------Queries---------------
    ------------------------------
    
    SELECT LW.Manifest,LW.OrderID,COUNT(DISTINCT LineItemID)
    FROM LWManifestOrderLineItems LW
    INNER JOIN ManifestContainers MC
        ON MC.Manifest = LW.Manifest
    GROUP BY LW.Manifest,LW.OrderID
    ORDER BY COUNT(DISTINCT LineItemID) DESC  
    
    SELECT LW.Manifest,LW.OrderID,COUNT( LineItemID) LineCount
    FROM LWManifestOrderLineItems LW
    WHERE LW.Manifest IN (SELECT Manifest FROM ManifestContainers)
    GROUP BY LW.Manifest,LW.OrderID
    ORDER BY COUNT( LineItemID) DESC  
    

    통계 IO

    실행 계획

  7. from https://stackoverflow.com/questions/564717/measuring-query-performance-execution-plan-query-cost-vs-time-taken by cc-by-sa and MIT license