쿼리 성능 측정: "실행 계획 쿼리 비용" 대 " 소요 시간"
두 인 성능을 두, 즉를 사용할 수.
두 하고 각 1을 . 쿼리를 모두 실행하고 각 쿼리 시간을 지정합니다.
다 "을 두 가지를 모두 실행하고 실제 실행 계획에서 "쿼리 비용"을 가져옵니다.
여기 제가 쿼리 시간을 맞추기 위해 실행하는 코드가 있습니다.
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%
실행 시간의 결과는 Query Cost의 결과와 직접적으로 상반되지만, "Query Cost"가 실제로 무엇을 의미하는지 판단하는 데 어려움을 겪고 있습니다.Reads/Writes/CPU_Time/ 등의 집합체이므로 다음과 같은 몇 가지 질문이 있습니다.
이 조치가 의미하는 바를 설명할 수 있는 확실한 정보원이 있습니까?
사람들이 사용하는 다른 "쿼리 성능" 측정 기준은 무엇이며, 상대적인 장점은 무엇입니까?
이 서버는 MS Server 2003 Enterprise Edition에서 MS SQL Server 2005를 실행하는 중간 크기의 SQL Server이며 여러 프로세서와 100명 이상의 동시 사용자가 있습니다.
편집:
몇 번 고생 끝에 SQL Server에 Profiler 액세스를 할 수 있었고 추가 정보를 제공할 수 있었습니다(Execution Time 자체가 아니라 쿼리 비용이 시스템 리소스와 관련된 것을 지원함...).
Stored_Proc CPU Reads Writes Duration
test_1a 1313 3975 93 1386
test_1b 2297 49839 93 1207
더 많은 읽기와 함께 더 많은 CPU를 사용하는 것이 인상적입니다 :)
프로파일러 추적을 통해 원근법을 파악할 수 있습니다.
- 쿼리 A: CPU 1.3초, 지속 시간 1.4초
- 쿼리 B: CPU 2.3초, 지속 시간 1.2초
쿼리 B는 병렬성을 사용하고 있습니다. CPU > 지속 시간(예: 쿼리는 CPU 2개를 사용하며 각각 평균 1.15초)
쿼리 A이(가) 아닐 수 있습니다. CPU < 지속 시간
이는 배치에 대한 비용을 설명합니다. 즉, 보다 단순하고 병렬적이지 않은 쿼리 계획에 대한 비용의 17%입니다.
옵티마이저는 쿼리 B가 비용이 더 많이 들고 병렬 처리를 통해 이득을 얻을 수 있음을 알아냈습니다.
그러나 이 쿼리 B는 1초 정도 동안 2개 CPU의 100%(따라서 4개 CPU의 경우 50%)를 사용합니다.쿼리 A는 1.5초 동안 단일 CPU를 100% 사용합니다.
쿼리 A의 피크는 지속 시간이 증가하는 대신 더 낮습니다.사용자가 한 명인데, 누가 신경쓰나요?100개면 차이가 날지도...
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.
실행 시간의 결과는 Query Cost의 결과와 직접적으로 상반되지만, "Query Cost"가 실제로 무엇을 의미하는지 판단하는 데 어려움을 겪고 있습니다.
Query cost
relative는 쿼리가 소요되는 시간(총 배치 시간)에 대해 최적화자가 생각하는 것입니다.
옵티마이저는 데이터의 쿼리와 통계를 보고 여러 실행 계획을 시도한 후 가장 비용이 적게 드는 것을 선택함으로써 최적의 쿼리 계획을 선택하려고 합니다.
여기서 이 기능을 수행하는 방법에 대해 더 자세히 읽어 볼 수 있습니다.
보다시피, 이것은 실제로 얻는 것과 크게 다를 수 있습니다.
유일한 실제 쿼리 성능 척도는 물론 쿼리가 실제로 얼마나 걸리는지입니다.
사용하다SET STATISTICS TIME ON
문의하신 것 이상으로
근 결과 탭 아래에 메시지 탭이 있습니다.거기서 시간을 볼 수 있습니다.
쿼리 실행 시간:
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를 클릭합니다.
쿼리를 실행하고 쿼리 결과의 메시지 탭 옆에 있는 실행 계획을 클릭합니다.당신은 보게 될 것입니다.
오래된 질문이지만 비용은 동일하지만 하나의 질문이 다른 질문보다 더 나은 예를 추가하고자 합니다.
질문에서 확인하신 것처럼 실행 계획에 표시된 %만이 최상의 쿼리를 결정하는 유일한 기준이 아닙니다.다음 예제에서는 같은 작업을 수행하는 두 개의 쿼리가 있습니다.실행 계획에 따르면 둘 다 동등하게 양호합니다(각각 50%).이제 나는 다음과 같이 쿼리를 실행했습니다.SET STATISTICS IO ON
분명한 차이를 보여주고 있습니다.
다음 예제에서 쿼리 1은 다음을 사용합니다.seek
쿼리 2는 다음을 사용합니다.scan
LWM 매니페스트OrderLineItems 테이블에 표시됩니다.실제로 실행 시간을 확인해보면 쿼리 2가 더 잘 작동한다는 것을 알 수 있습니다.
또한 폴 화이트의 "Seek is not a Seek?"를 읽어보세요.
쿼리
---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
실행계획
언급URL : https://stackoverflow.com/questions/564717/measuring-query-performance-execution-plan-query-cost-vs-time-taken
'it-source' 카테고리의 다른 글
OpenGL에서 4D 객체 시각화 (0) | 2023.10.03 |
---|---|
Visualising 4D objects in OpenGL (0) | 2023.10.03 |
Server.MapPath - 지정된 물리적 경로, 예상되는 가상 경로 (0) | 2023.10.03 |
원격 레지스트리 값 가져오기 (0) | 2023.10.03 |
C/C++는 1개 국어입니까, 2개 국어입니까? (0) | 2023.10.03 |