SQL Server 2012에서 두 쿼리를 비교하고 있습니다. 목표는 최상의 쿼리를 선택할 때 쿼리 최적화 프로그램에서 사용할 수 있는 모든 관련 정보 를 사용하는 것입니다 . 두 쿼리 모두 동일한 결과를 생성합니다. 모든 고객의 최대 주문 ID
FREEPROCCACHE 및 DROPCLEANBUFFERS를 사용하여 각 쿼리를 실행하기 전에 버퍼 풀 지우기가 수행되었습니다.
아래 제공된 정보를 사용하여 어떤 쿼리가 더 나은 선택입니까?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
통계 시간
쿼리 1 통계 시간 : CPU 시간 = 0ms, 경과 시간 = 24ms
쿼리 2 통계 시간 : CPU 시간 = 0ms, 경과 시간 = 23ms
통계 IO
쿼리 1 통계 IO : 테이블 '주문'. 스캔 횟수 1, 논리적 읽기 5, 물리적 읽기 2, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0
쿼리 2 통계 IO : 테이블 '주문'. 스캔 카운트 1, 논리적 읽기 4, 물리적 읽기 1, 미리 읽기 8, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.
실행 계획
SELECT 속성 쿼리 1
SELECT 속성 쿼리 2
결론 :
쿼리 1
- 배치 비용 48 %
- 논리적 읽기 5
- 물리적 읽기 2
- 미리 읽기 : 0
- CPU 시간 : 0ms
- 경과 시간 24ms
- 예상 하위 트리 비용 : 0.0050276
- 컴파일 CPU : 2
- 메모리 : 384
- 컴파일 시간 : 2
쿼리 2
- 배치 비용 52 %
- 논리 읽기 4
- 물리적 읽기 1
- 미리 읽기 : 8
- CPU 시간 0
- 경과 시간 23ms
- 예상 하위 트리 비용 : 0.0054782
- 컴파일 CPU : 0
- 메모리 : 192
- 컴파일 시간 : 0
개인적으로 Query 2는 그래픽 계획에 따라 배치 비용이 높지만 Query 1보다 효율적이라고 생각합니다. 보다 낮은. 미리 읽기는 쿼리 2의 경우 8이고 쿼리 1의 경우 0입니다.
업데이트 12:03
클러스터형 인덱스 정의
ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
비 클러스터형 인덱스 idx_nc_custid
CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
[custid] 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]
GO