Tôi đang so sánh hai truy vấn trong SQL Server 2012. Mục tiêu là sử dụng tất cả các thông tin thích hợp có sẵn từ trình tối ưu hóa truy vấn khi chọn truy vấn tốt nhất. Cả hai truy vấn đều cho kết quả như nhau; trật tự tối đa cho tất cả khách hàng.
Việc xóa nhóm bộ đệm đã được thực hiện trước khi thực hiện từng truy vấn với FREEPROCCACHE và DROPCLEANBUFFERS
Sử dụng thông tin được cung cấp dưới đây, truy vấn nào là sự lựa chọn tốt hơn?
-- 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
THỐNG KÊ THỜI GIAN
Truy vấn 1 THỐNG KÊ THỜI GIAN: Thời gian CPU = 0ms, thời gian trôi qua = 24 ms
Truy vấn 2 THỐNG KÊ THỜI GIAN: Thời gian CPU = 0 ms, thời gian trôi qua = 23 ms
THỐNG KÊ IO
Truy vấn 1 THỐNG KÊ IO: Bảng 'Đơn hàng'. Quét số 1, đọc logic 5, đọc vật lý 2, đọc trước đọc 0, đọc logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0.
Truy vấn 2 THỐNG KÊ IO: Bảng 'Đơn hàng'. Quét số 1, đọc logic 4, đọc vật lý 1, đọc trước 8, đọc logic logic 0, đọc vật lý lob 0, đọc trước đọc 0, đọc trước 0.
Kế hoạch thực hiện
CHỌN thuộc tính Truy vấn 1
CHỌN thuộc tính Truy vấn 2
Kết luận:
Truy vấn 1
- Chi phí hàng loạt 48%
- Logic đọc 5
- Đọc vật lý 2
- Đọc trước Đọc: 0
- Thời gian CPU: 0ms
- Thời gian trôi qua 24ms
- Chi phí phụ dự kiến: 0,0050276
- Biên dịchCPU: 2
- CompileMemory: 384
- Thời gian biên dịch: 2
Truy vấn 2
- Chi phí hàng loạt 52%
- Logic đọc 4
- Vật lý đọc 1
- Đọc trước Đọc: 8
- Thời gian CPU 0
- Thời gian trôi qua 23ms
- Chi phí phụ dự kiến: 0,0054782
- Biên dịchCPU: 0
- CompileMemory: 192
- Thời gian biên dịch: 0
Cá nhân, mặc dù Truy vấn 2 có chi phí lô cao hơn theo kế hoạch đồ họa, tôi nghĩ rằng Truy vấn 1. hiệu quả hơn bởi Truy vấn 2 này yêu cầu đọc ít logic hơn, thời gian trôi qua thấp hơn một chút, các giá trị compilecpu, compilememory và compllime thấp hơn. đọc trước đọc là 8 cho truy vấn 2 và 0 cho truy vấn 1.
Cập nhật 12:03
Định nghĩa chỉ mục cụm
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
Chỉ mục không phân cụm 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