Saya membandingkan dua kueri di SQL Server 2012. Tujuannya adalah untuk menggunakan semua informasi terkait yang tersedia dari pengoptimal kueri saat memilih kueri terbaik. Kedua pertanyaan menghasilkan hasil yang sama; pesanan maksimum untuk semua pelanggan.
Membersihkan kumpulan buffer dilakukan sebelum menjalankan setiap permintaan dengan FREEPROCCACHE dan DROPCLEANBUFFERS
Menggunakan informasi yang disediakan di bawah ini, pertanyaan apa yang merupakan pilihan yang lebih baik?
-- 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
WAKTU STATISTIK
Kueri 1 WAKTU STATISTIK: Waktu CPU = 0ms, waktu yang berlalu = 24 ms
Kueri 2 WAKTU STATISTIK: Waktu CPU = 0 ms, waktu yang berlalu = 23 ms
STATISTIK IO
Kueri 1 STATISTIK IO: Tabel 'Pesanan'. Pindai hitungan 1, bacaan logis 5, bacaan fisik 2, bacaan baca depan 0, bacaan logis lob 0, bacaan fisik lob 0, bacaan baca lob depan 0.
Kueri 2 STATISTIK IO: Tabel 'Pesanan'. Pindai hitungan 1, bacaan logis 4, bacaan fisik 1, bacaan baca-depan 8, bacaan logis lob 0, bacaan fisik lob 0, bacaan lob baca-depan 0.
Rencana Eksekusi
SELECT properties Permintaan 1
SELECT properties Query 2
Kesimpulan:
Pertanyaan 1
- Biaya batch 48%
- Bacaan Logis 5
- Bacaan Fisik 2
- Baca-depan Dibaca: 0
- Waktu CPU: 0ms
- Waktu Berlalu 24ms
- Perkiraan biaya subtree: 0,0050276
- CompileCPU: 2
- CompileMemory: 384
- CompileTime: 2
Pertanyaan 2
- Biaya batch 52%
- Bacaan Logis 4
- Bacaan Fisik 1
- Baca-depan Dibaca: 8
- Waktu CPU 0
- Waktu Berlalu 23ms
- Perkiraan biaya subtree: 0,0054782
- CompileCPU: 0
- CompileMemory: 192
- CompileTime: 0
Secara pribadi, meskipun Permintaan 2 memiliki biaya batch yang lebih tinggi sesuai dengan rencana grafis, saya pikir ini lebih efisien daripada Permintaan 1. Ini karena permintaan 2 membutuhkan pembacaan yang kurang logis, memiliki waktu berlalu yang sedikit lebih rendah, nilai compilecpu, compilememory dan compiletime adalah menurunkan. baca baca depan adalah 8 untuk kueri 2 dan 0 untuk kueri 1.
Perbarui 12:03
Definisi Indeks Berkerumun
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
Indeks Non-Clustered 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